/*****************************************************************************
* preferences_widgets.cpp : wxWindows plugin for vlc
*****************************************************************************
- * Copyright (C) 2000-2001 VideoLAN
- * $Id: preferences_widgets.cpp,v 1.13 2003/11/05 18:59:01 gbazin Exp $
+ * Copyright (C) 2000-2004 VideoLAN
+ * $Id$
*
- * Authors: Gildas Bazin <gbazin@netcourrier.com>
+ * Authors: Gildas Bazin <gbazin@videolan.org>
* Sigmund Augdal <sigmunau@idi.ntnu.no>
*
* This program is free software; you can redistribute it and/or modify
*****************************************************************************/
ConfigControl::ConfigControl( vlc_object_t *_p_this,
module_config_t *p_item, wxWindow *parent )
- : wxPanel( parent ), p_this( _p_this ), name( wxU(p_item->psz_name) ),
- i_type( p_item->i_type ), b_advanced( p_item->b_advanced )
+ : wxPanel( parent ), p_this( _p_this ),
+ pf_update_callback( NULL ), p_update_data( NULL ),
+ name( wxU(p_item->psz_name) ), i_type( p_item->i_type ),
+ b_advanced( p_item->b_advanced )
+
{
sizer = new wxBoxSizer( wxHORIZONTAL );
}
return b_advanced;
}
+void ConfigControl::SetUpdateCallback( void (*p_callback)( void * ),
+ void *p_data )
+{
+ pf_update_callback = p_callback;
+ p_update_data = p_data;
+}
+
+void ConfigControl::OnUpdate( wxCommandEvent& WXUNUSED(event) )
+{
+ if( pf_update_callback )
+ {
+ pf_update_callback( p_update_data );
+ }
+}
+
/*****************************************************************************
* KeyConfigControl implementation
*****************************************************************************/
-static wxString KeysList[] =
-{
- wxT("Unset"),
- wxT("Left"),
- wxT("Right"),
- wxT("Up"),
- wxT("Down"),
- wxT("Space"),
- wxT("Enter"),
- wxT("F1"),
- wxT("F2"),
- wxT("F3"),
- wxT("F4"),
- wxT("F5"),
- wxT("F6"),
- wxT("F7"),
- wxT("F8"),
- wxT("F9"),
- wxT("F10"),
- wxT("F11"),
- wxT("F12"),
- wxT("Home"),
- wxT("End"),
- wxT("Menu"),
- wxT("Esc"),
- wxT("Page Up"),
- wxT("Page Down"),
- wxT("Tab"),
- wxT("Backspace"),
- wxT("a"),
- wxT("b"),
- wxT("c"),
- wxT("d"),
- wxT("e"),
- wxT("f"),
- wxT("g"),
- wxT("h"),
- wxT("i"),
- wxT("j"),
- wxT("k"),
- wxT("l"),
- wxT("m"),
- wxT("n"),
- wxT("o"),
- wxT("p"),
- wxT("q"),
- wxT("r"),
- wxT("s"),
- wxT("t"),
- wxT("u"),
- wxT("v"),
- wxT("w"),
- wxT("x"),
- wxT("y"),
- wxT("z"),
- wxT("+"),
- wxT("="),
- wxT("-"),
- wxT(","),
- wxT("."),
- wxT("<"),
- wxT(">"),
- wxT("`"),
- wxT("/"),
- wxT(";"),
- wxT("'"),
- wxT("\\"),
- wxT("["),
- wxT("]"),
- wxT("*")
-};
+wxString *KeyConfigControl::m_keysList = NULL;
KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
module_config_t *p_item, wxWindow *parent )
: ConfigControl( p_this, p_item, parent )
{
+ // Number of keys descriptions
+ unsigned int i_keys = sizeof(vlc_keys)/sizeof(key_descriptor_t);
+
+ // Init the keys decriptions array
+ if( m_keysList == NULL )
+ {
+ m_keysList = new wxString[i_keys];
+ for( unsigned int i = 0; i < i_keys; i++ )
+ {
+ m_keysList[i] = wxU(vlc_keys[i].psz_key_string);
+ }
+ }
+
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
alt = new wxCheckBox( this, -1, wxU(_("Alt")) );
alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
shift = new wxCheckBox( this, -1, wxU(_("Shift")) );
shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
combo = new wxComboBox( this, -1, wxT(""), wxDefaultPosition,
- wxDefaultSize, WXSIZEOF(KeysList), KeysList,
+ wxDefaultSize, i_keys, m_keysList,
wxCB_READONLY );
- for( unsigned int i = 0; i < WXSIZEOF(KeysList); i++ )
+ for( unsigned int i = 0; i < i_keys; i++ )
{
- combo->SetClientData( i, (void*)keys[i].i_key_code );
- if( keys[i].i_key_code ==
+ combo->SetClientData( i, (void*)vlc_keys[i].i_key_code );
+ if( (unsigned int)vlc_keys[i].i_key_code ==
( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) )
{
combo->SetSelection( i );
- combo->SetValue( wxU(_(keys[i].psz_key_string)) );
+ combo->SetValue( wxU(_(vlc_keys[i].psz_key_string)) );
}
}
KeyConfigControl::~KeyConfigControl()
{
- ;
+ if( m_keysList )
+ {
+ delete[] m_keysList;
+ m_keysList = NULL;
+ }
}
int KeyConfigControl::GetIntValue()
module_t *p_parser;
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
- combo = new wxComboBox( this, -1, wxU(p_item->psz_value),
+ combo = new wxComboBox( this, -1, wxL2U(p_item->psz_value),
wxDefaultPosition, wxDefaultSize,
0, NULL, wxCB_READONLY | wxCB_SORT );
{
combo->Append( wxU(p_parser->psz_longname),
p_parser->psz_object_name );
- if( p_item->psz_value && !strcmp(p_item->psz_value,
+ if( p_item->psz_value && !strcmp(p_item->psz_value,
p_parser->psz_object_name) )
combo->SetValue( wxU(p_parser->psz_longname) );
}
{
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- textctrl = new wxTextCtrl( this, -1,
- wxU(p_item->psz_value),
+ textctrl = new wxTextCtrl( this, -1,
+ wxL2U(p_item->psz_value),
wxDefaultPosition,
wxDefaultSize,
wxTE_PROCESS_ENTER);
return textctrl->GetValue();
}
+BEGIN_EVENT_TABLE(StringConfigControl, wxPanel)
+ /* Text events */
+ EVT_TEXT(-1, StringConfigControl::OnUpdate)
+END_EVENT_TABLE()
+
/*****************************************************************************
* StringListConfigControl implementation
*****************************************************************************/
StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_this, p_item, parent ), psz_name( NULL )
+ : ConfigControl( p_this, p_item, parent )
{
+ psz_default_value = p_item->psz_value;
+ if( psz_default_value ) psz_default_value = strdup( psz_default_value );
+
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
combo = new wxComboBox( this, -1, wxT(""),
UpdateCombo( p_item );
combo->SetToolTip( wxU(p_item->psz_longtext) );
- sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+ sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- if( p_item->pf_list_update )
+ for( int i = 0; i < p_item->i_action; i++ )
{
- wxButton *refresh =
- new wxButton( this, wxID_HIGHEST, wxU(_("Refresh")) );
- sizer->Add( refresh, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
-
- psz_name = strdup( p_item->psz_name );
- pf_list_update = p_item->pf_list_update;
+ wxButton *button =
+ new wxButton( this, wxID_HIGHEST+i,
+ wxU(p_item->ppsz_action_text[i]) );
+ sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
}
sizer->Layout();
StringListConfigControl::~StringListConfigControl()
{
- if( psz_name ) free( psz_name );
+ if( psz_default_value ) free( psz_default_value );
}
void StringListConfigControl::UpdateCombo( module_config_t *p_item )
{
+ vlc_bool_t b_found = VLC_FALSE;
+ int i_index;
+
/* build a list of available options */
- for( int i_index = 0; i_index < p_item->i_list; i_index++ )
+ for( i_index = 0; i_index < p_item->i_list; i_index++ )
{
combo->Append( ( p_item->ppsz_list_text &&
p_item->ppsz_list_text[i_index] ) ?
wxU(p_item->ppsz_list_text[i_index]) :
- wxU(p_item->ppsz_list[i_index]) );
+ wxL2U(p_item->ppsz_list[i_index]) );
combo->SetClientData( i_index, (void *)p_item->ppsz_list[i_index] );
if( ( p_item->psz_value &&
!strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) ) ||
combo->SetValue( ( p_item->ppsz_list_text &&
p_item->ppsz_list_text[i_index] ) ?
wxU(p_item->ppsz_list_text[i_index]) :
- wxU(p_item->ppsz_list[i_index]) );
+ wxL2U(p_item->ppsz_list[i_index]) );
+ b_found = VLC_TRUE;
}
}
+
+ if( p_item->psz_value && !b_found )
+ {
+ /* Add custom entry to list */
+ combo->Append( wxL2U(p_item->psz_value) );
+ combo->SetClientData( i_index, (void *)psz_default_value );
+ combo->SetSelection( i_index );
+ combo->SetValue( wxL2U(p_item->psz_value) );
+ }
}
BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
/* Button events */
- EVT_BUTTON(wxID_HIGHEST, StringListConfigControl::OnRefresh)
+ EVT_BUTTON(-1, StringListConfigControl::OnAction)
+
+ /* Text events */
+ EVT_TEXT(-1, StringListConfigControl::OnUpdate)
END_EVENT_TABLE()
-void StringListConfigControl::OnRefresh( wxCommandEvent& event )
+void StringListConfigControl::OnAction( wxCommandEvent& event )
{
- if( pf_list_update )
- {
- vlc_value_t val;
- module_config_t *p_item;
+ int i_action = event.GetId() - wxID_HIGHEST;
+
+ module_config_t *p_item = config_FindConfig( p_this, GetName().mb_str() );
+ if( !p_item ) return;
- pf_list_update( p_this, psz_name, val, val, 0 );
- p_item = config_FindConfig( p_this, psz_name );
+ if( i_action < 0 || i_action >= p_item->i_action ) return;
+ vlc_value_t val;
+ wxString value = GetPszValue();
+ *((const char **)&val.psz_string) = value.mb_str();
+ p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
+
+ if( p_item->b_dirty )
+ {
combo->Clear();
UpdateCombo( p_item );
+ p_item->b_dirty = VLC_FALSE;
}
}
int selected = combo->GetSelection();
if( selected != -1 )
{
- return wxU((char *)combo->GetClientData( selected ));
+ return wxL2U((char *)combo->GetClientData( selected ));
}
return wxString();
}
directory = p_item->i_type == CONFIG_ITEM_DIRECTORY;
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- textctrl = new wxTextCtrl( this, -1,
- wxU(p_item->psz_value),
+ textctrl = new wxTextCtrl( this, -1,
+ wxL2U(p_item->psz_value),
wxDefaultPosition,
wxDefaultSize,
wxTE_PROCESS_ENTER);
{
if( directory )
{
- wxDirDialog dialog( this, wxU(_("Choose Directory")) );
+ wxDirDialog dialog( this, wxU(_("Choose directory")) );
if( dialog.ShowModal() == wxID_OK )
{
- textctrl->SetValue( dialog.GetPath() );
+ textctrl->SetValue( dialog.GetPath() );
}
}
else
{
- wxFileDialog dialog( this, wxU(_("Choose File")),
+ wxFileDialog dialog( this, wxU(_("Choose file")),
wxT(""), wxT(""), wxT("*.*"),
#if defined( __WXMSW__ )
wxOPEN
wxOPEN | wxSAVE
#endif
);
+ if( dialog.ShowModal() == wxID_OK )
+ {
+ textctrl->SetValue( dialog.GetPath() );
+ }
}
}
{
;
}
-
+
wxString FileConfigControl::GetPszValue()
{
return textctrl->GetValue();
/*****************************************************************************
* IntegerConfigControl implementation
*****************************************************************************/
+BEGIN_EVENT_TABLE(IntegerConfigControl, wxPanel)
+ EVT_TEXT(-1, IntegerConfigControl::OnUpdate)
+ EVT_COMMAND_SCROLL(-1, IntegerConfigControl::OnUpdate)
+END_EVENT_TABLE()
+
IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
p_item->i_value),
wxDefaultPosition, wxDefaultSize,
wxSP_ARROW_KEYS,
- -16000, 16000, p_item->i_value);
+ -100000000, 100000000, p_item->i_value);
spin->SetToolTip( wxU(p_item->psz_longtext) );
sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+ sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
sizer->Layout();
this->SetSizerAndFit( sizer );
}
IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_this, p_item, parent ), psz_name( NULL )
+ : ConfigControl( p_this, p_item, parent )
{
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
UpdateCombo( p_item );
combo->SetToolTip( wxU(p_item->psz_longtext) );
- sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
-
- if( p_item->pf_list_update )
- {
- wxButton *refresh =
- new wxButton( this, wxID_HIGHEST, wxU(_("Refresh")) );
- sizer->Add( refresh, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
-
- psz_name = strdup( p_item->psz_name );
- pf_list_update = p_item->pf_list_update;
- }
+ sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
sizer->Layout();
this->SetSizerAndFit( sizer );
IntegerListConfigControl::~IntegerListConfigControl()
{
- if( psz_name ) free( psz_name );
}
void IntegerListConfigControl::UpdateCombo( module_config_t *p_item )
/* build a list of available options */
for( int i_index = 0; i_index < p_item->i_list; i_index++ )
{
- combo->Append( ( p_item->ppsz_list_text &&
- p_item->ppsz_list_text[i_index] ) ?
- wxU(p_item->ppsz_list_text[i_index]) :
- wxString::Format(wxT("%i"),
- p_item->pi_list[i_index]) );
+ if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
+ {
+ combo->Append( wxU(p_item->ppsz_list_text[i_index]) );
+ }
+ else
+ {
+ combo->Append( wxString::Format(wxT("%i"),
+ p_item->pi_list[i_index]) );
+ }
combo->SetClientData( i_index, (void *)p_item->pi_list[i_index] );
if( p_item->i_value == p_item->pi_list[i_index] )
{
combo->SetSelection( i_index );
- combo->SetValue( ( p_item->ppsz_list_text &&
- p_item->ppsz_list_text[i_index] ) ?
- wxU(p_item->ppsz_list_text[i_index]) :
- wxString::Format(wxT("%i"),
- p_item->pi_list[i_index]) );
+ if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
+ {
+ combo->SetValue( wxU(p_item->ppsz_list_text[i_index]) );
+ }
+ else
+ {
+ combo->SetValue( wxString::Format(wxT("%i"),
+ p_item->pi_list[i_index]) );
+ }
}
}
}
BEGIN_EVENT_TABLE(IntegerListConfigControl, wxPanel)
/* Button events */
- EVT_BUTTON(wxID_HIGHEST, IntegerListConfigControl::OnRefresh)
+ EVT_BUTTON(-1, IntegerListConfigControl::OnAction)
END_EVENT_TABLE()
-void IntegerListConfigControl::OnRefresh( wxCommandEvent& event )
+void IntegerListConfigControl::OnAction( wxCommandEvent& event )
{
- if( pf_list_update )
- {
- vlc_value_t val;
- module_config_t *p_item;
+ int i_action = event.GetId() - wxID_HIGHEST;
+
+ module_config_t *p_item;
+ p_item = config_FindConfig( p_this, GetName().mb_str() );
+ if( !p_item ) return;
- pf_list_update( p_this, psz_name, val, val, 0 );
- p_item = config_FindConfig( p_this, psz_name );
+ if( i_action < 0 || i_action >= p_item->i_action ) return;
+ vlc_value_t val;
+ val.i_int = GetIntValue();
+ p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
+
+ if( p_item->b_dirty )
+ {
combo->Clear();
UpdateCombo( p_item );
+ p_item->b_dirty = VLC_FALSE;
}
}
/*****************************************************************************
* RangedIntConfigControl implementation
*****************************************************************************/
+BEGIN_EVENT_TABLE(RangedIntConfigControl, wxPanel)
+ EVT_COMMAND_SCROLL(-1, RangedIntConfigControl::OnUpdate)
+END_EVENT_TABLE()
+
RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
wxSL_LABELS | wxSL_HORIZONTAL );
slider->SetToolTip( wxU(p_item->psz_longtext) );
sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+ sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
sizer->Layout();
this->SetSizerAndFit( sizer );
}
/*****************************************************************************
* FloatConfigControl implementation
*****************************************************************************/
+BEGIN_EVENT_TABLE(FloatConfigControl, wxPanel)
+ EVT_TEXT(-1, FloatConfigControl::OnUpdate)
+END_EVENT_TABLE()
+
FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
/*****************************************************************************
* BoolConfigControl implementation
*****************************************************************************/
+BEGIN_EVENT_TABLE(BoolConfigControl, wxPanel)
+ EVT_CHECKBOX(-1, BoolConfigControl::OnUpdate)
+END_EVENT_TABLE()
+
BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
int BoolConfigControl::GetIntValue()
{
- if( checkbox->IsChecked() )
- {
- return 1;
- }
- else
- {
- return 0;
- }
+ if( checkbox->IsChecked() ) return 1;
+ else return 0;
}