/*****************************************************************************
* preferences_widgets.cpp : wxWindows plugin for vlc
*****************************************************************************
- * Copyright (C) 2000-2001 VideoLAN
- * $Id: preferences_widgets.cpp,v 1.9 2003/11/02 22:16:32 gbazin Exp $
+ * Copyright (C) 2000-2004 VideoLAN
+ * $Id: preferences_widgets.cpp,v 1.23 2004/01/29 17:04:01 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
* Sigmund Augdal <sigmunau@idi.ntnu.no>
break;
case CONFIG_ITEM_STRING:
- if( !p_item->ppsz_list )
+ if( !p_item->i_list )
{
- p_control = new StringConfigControl( p_item, parent );
+ p_control = new StringConfigControl( p_this, p_item, parent );
}
else
{
- p_control = new StringListConfigControl( p_item, parent );
+ p_control = new StringListConfigControl( p_this, p_item, parent );
}
break;
case CONFIG_ITEM_FILE:
case CONFIG_ITEM_DIRECTORY:
- p_control = new FileConfigControl( p_item, parent );
+ p_control = new FileConfigControl( p_this, p_item, parent );
break;
case CONFIG_ITEM_INTEGER:
- if( p_item->i_min != 0 || p_item->i_max != 0 )
+ if( p_item->i_list )
{
- p_control = new RangedIntConfigControl( p_item, parent );
+ p_control = new IntegerListConfigControl( p_this, p_item, parent );
+ }
+ else if( p_item->i_min != 0 || p_item->i_max != 0 )
+ {
+ p_control = new RangedIntConfigControl( p_this, p_item, parent );
}
else
{
- p_control = new IntegerConfigControl( p_item, parent );
+ p_control = new IntegerConfigControl( p_this, p_item, parent );
}
break;
case CONFIG_ITEM_KEY:
- p_control = new KeyConfigControl( p_item, parent );
+ p_control = new KeyConfigControl( p_this, p_item, parent );
break;
case CONFIG_ITEM_FLOAT:
- p_control = new FloatConfigControl( p_item, parent );
+ p_control = new FloatConfigControl( p_this, p_item, parent );
break;
case CONFIG_ITEM_BOOL:
- p_control = new BoolConfigControl( p_item, parent );
+ p_control = new BoolConfigControl( p_this, p_item, parent );
break;
default:
/*****************************************************************************
* ConfigControl implementation
*****************************************************************************/
-ConfigControl::ConfigControl( module_config_t *p_item, wxWindow *parent )
- : wxPanel( parent ), name( wxU(p_item->psz_name) ),
- i_type( p_item->i_type ), b_advanced( p_item->b_advanced )
+ConfigControl::ConfigControl( vlc_object_t *_p_this,
+ module_config_t *p_item, wxWindow *parent )
+ : 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
*****************************************************************************/
wxT("*")
};
-KeyConfigControl::KeyConfigControl( module_config_t *p_item, wxWindow *parent )
- : ConfigControl( p_item, parent )
+KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item, wxWindow *parent )
+ : ConfigControl( p_this, p_item, parent )
{
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
alt = new wxCheckBox( this, -1, wxU(_("Alt")) );
wxCB_READONLY );
for( unsigned int i = 0; i < WXSIZEOF(KeysList); 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)) );
}
}
ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_item, parent )
+ : ConfigControl( p_this, p_item, parent )
{
vlc_list_t *p_list;
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) );
}
/*****************************************************************************
* StringConfigControl implementation
*****************************************************************************/
-StringConfigControl::StringConfigControl( module_config_t *p_item,
+StringConfigControl::StringConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_item, parent )
+ : 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 );
- 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( module_config_t *p_item,
+StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_item, parent )
+ : 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 );
- combo = new wxComboBox( this, -1, wxU(p_item->psz_value),
+ combo = new wxComboBox( this, -1, wxT(""),
wxDefaultPosition, wxDefaultSize,
0, NULL, wxCB_READONLY );
+ UpdateCombo( p_item );
- /* build a list of available options */
- for( int i_index = 0; p_item->ppsz_list[i_index];
- i_index++ )
+ combo->SetToolTip( wxU(p_item->psz_longtext) );
+ sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+
+ for( int i = 0; i < p_item->i_action; i++ )
{
- combo->Append( wxU(p_item->ppsz_list[i_index]) );
- if( p_item->psz_value && !strcmp( p_item->psz_value,
- p_item->ppsz_list[i_index] ) )
- combo->SetSelection( i_index );
+ wxButton *button =
+ new wxButton( this, wxID_HIGHEST+i,
+ wxU(p_item->ppsz_action_text[i]) );
+ sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
}
- if( p_item->psz_value )
- combo->SetValue( wxU(p_item->psz_value) );
- combo->SetToolTip( wxU(p_item->psz_longtext) );
- sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
sizer->Layout();
this->SetSizerAndFit( sizer );
}
StringListConfigControl::~StringListConfigControl()
{
- ;
+}
+
+void StringListConfigControl::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]) :
+ 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] ) ) ||
+ ( !p_item->psz_value && !*p_item->ppsz_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]) :
+ wxL2U(p_item->ppsz_list[i_index]) );
+ }
+ }
+}
+
+BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
+ /* Button events */
+ EVT_BUTTON(-1, StringListConfigControl::OnAction)
+
+ /* Text events */
+ EVT_TEXT(-1, StringListConfigControl::OnUpdate)
+END_EVENT_TABLE()
+
+void StringListConfigControl::OnAction( wxCommandEvent& event )
+{
+ int i_action = event.GetId() - wxID_HIGHEST;
+
+ module_config_t *p_item = config_FindConfig( p_this, GetName().mb_str() );
+ if( !p_item ) return;
+
+ 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;
+ }
}
wxString StringListConfigControl::GetPszValue()
{
- return combo->GetStringSelection();
+ int selected = combo->GetSelection();
+ if( selected != -1 )
+ {
+ return wxL2U((char *)combo->GetClientData( selected ));
+ }
+ return wxString();
}
/*****************************************************************************
* FileConfigControl implementation
*****************************************************************************/
-FileConfigControl::FileConfigControl( module_config_t *p_item,
+FileConfigControl::FileConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_item, parent )
+ : ConfigControl( p_this, p_item, parent )
{
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
*****************************************************************************/
-IntegerConfigControl::IntegerConfigControl( module_config_t *p_item,
+IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_item, parent )
+ : ConfigControl( p_this, p_item, parent )
{
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
spin = new wxSpinCtrl( this, -1,
p_item->i_value),
wxDefaultPosition, wxDefaultSize,
wxSP_ARROW_KEYS,
- -16000, 16000, p_item->i_value);
+ -10000000, 10000000, 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 );
}
return spin->GetValue();
}
+/*****************************************************************************
+ * IntegerListConfigControl implementation
+ *****************************************************************************/
+IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
+ wxWindow *parent )
+ : 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 );
+ combo = new wxComboBox( this, -1, wxT(""),
+ wxDefaultPosition, wxDefaultSize,
+ 0, NULL, wxCB_READONLY );
+
+ UpdateCombo( p_item );
+
+ combo->SetToolTip( wxU(p_item->psz_longtext) );
+ sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
+
+ sizer->Layout();
+ this->SetSizerAndFit( sizer );
+}
+
+IntegerListConfigControl::~IntegerListConfigControl()
+{
+}
+
+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++ )
+ {
+ 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 );
+ 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(-1, IntegerListConfigControl::OnAction)
+END_EVENT_TABLE()
+
+void IntegerListConfigControl::OnAction( wxCommandEvent& event )
+{
+ 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;
+
+ 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;
+ }
+}
+
+int IntegerListConfigControl::GetIntValue()
+{
+ int selected = combo->GetSelection();
+ if( selected != -1 )
+ {
+ return (int)combo->GetClientData( selected );
+ }
+ return -1;
+}
+
/*****************************************************************************
* RangedIntConfigControl implementation
*****************************************************************************/
-RangedIntConfigControl::RangedIntConfigControl( module_config_t *p_item,
+RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_item, parent )
+ : ConfigControl( p_this, p_item, parent )
{
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
slider = new wxSlider( this, -1, p_item->i_value, p_item->i_min,
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
*****************************************************************************/
-FloatConfigControl::FloatConfigControl( module_config_t *p_item,
+FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_item, parent )
+ : ConfigControl( p_this, p_item, parent )
{
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
textctrl = new wxTextCtrl( this, -1,
/*****************************************************************************
* BoolConfigControl implementation
*****************************************************************************/
-BoolConfigControl::BoolConfigControl( module_config_t *p_item,
+BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_item, parent )
+ : ConfigControl( p_this, p_item, parent )
{
checkbox = new wxCheckBox( this, -1, wxU(p_item->psz_text) );
if( p_item->i_value ) checkbox->SetValue(TRUE);