/*****************************************************************************
* preferences_widgets.cpp : wxWindows plugin for vlc
*****************************************************************************
- * Copyright (C) 2000-2001 VideoLAN
- * $Id: preferences_widgets.cpp,v 1.3 2003/10/20 00:09:27 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
#include <vlc/vlc.h>
#include <vlc/intf.h>
-#include <vlc_help.h>
+#include <vlc_config_cat.h>
#include "wxwindows.h"
#include "preferences_widgets.h"
+#include <wx/statline.h>
+
+/*****************************************************************************
+ * CreateConfigControl wrapper
+ *****************************************************************************/
+ConfigControl *CreateConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item, wxWindow *parent )
+{
+ ConfigControl *p_control = NULL;
+
+ switch( p_item->i_type )
+ {
+ case CONFIG_ITEM_MODULE:
+ p_control = new ModuleConfigControl( p_this, p_item, parent );
+ break;
+ case CONFIG_ITEM_MODULE_LIST_CAT:
+ p_control = new ModuleListCatConfigControl( p_this, p_item, parent );
+ break;
+
+ case CONFIG_ITEM_STRING:
+ if( !p_item->i_list )
+ {
+ p_control = new StringConfigControl( p_this, p_item, parent );
+ }
+ else
+ {
+ p_control = new StringListConfigControl( p_this, p_item, parent );
+ }
+ break;
+
+ case CONFIG_ITEM_FILE:
+ case CONFIG_ITEM_DIRECTORY:
+ p_control = new FileConfigControl( p_this, p_item, parent );
+ break;
+
+ case CONFIG_ITEM_INTEGER:
+ if( p_item->i_list )
+ {
+ 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_this, p_item, parent );
+ }
+ break;
+
+ case CONFIG_ITEM_KEY:
+ p_control = new KeyConfigControl( p_this, p_item, parent );
+ break;
+
+ case CONFIG_ITEM_FLOAT:
+ p_control = new FloatConfigControl( p_this, p_item, parent );
+ break;
+
+ case CONFIG_ITEM_BOOL:
+ p_control = new BoolConfigControl( p_this, p_item, parent );
+ break;
+
+ case CONFIG_SECTION:
+ p_control = new SectionConfigControl( p_this, p_item, parent );
+ break;
+
+ default:
+ break;
+ }
+
+ return p_control;
+}
+
/*****************************************************************************
* ConfigControl implementation
*****************************************************************************/
-ConfigControl::ConfigControl( wxWindow *parent ): wxPanel( parent )
+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 );
- i_value = 0;
- f_value = 0;
- psz_value = NULL;
}
ConfigControl::~ConfigControl()
{
- if( psz_value ) free( psz_value );
}
wxSizer *ConfigControl::Sizer()
return sizer;
}
-int ConfigControl::GetIntValue()
+wxString ConfigControl::GetName()
{
- return i_value;
+ return name;
}
-float ConfigControl::GetFloatValue()
+int ConfigControl::GetType()
{
- return f_value;
+ return i_type;
}
-wxString ConfigControl::GetPszValue()
+vlc_bool_t ConfigControl::IsAdvanced()
{
- return wxString(psz_value ? wxU(psz_value) : wxT(""));
+ 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
*****************************************************************************/
-KeyConfigControl::KeyConfigControl( module_config_t *p_item, wxWindow *parent )
- : ConfigControl( parent )
+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 );
ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL );
shift = new wxCheckBox( this, -1, wxU(_("Shift")) );
shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
- combo = new wxComboBox( this, -1, wxU("f"), wxDefaultPosition,
- wxDefaultSize, 0, NULL,
- wxCB_READONLY | wxCB_SORT );
- for( unsigned int i = 0; i < sizeof(keys)/sizeof(key_descriptor_s); i++ )
+ combo = new wxComboBox( this, -1, wxT(""), wxDefaultPosition,
+ wxDefaultSize, i_keys, m_keysList,
+ wxCB_READONLY );
+ for( unsigned int i = 0; i < i_keys; i++ )
{
- /* HPReg says casting the int to void * is fine */
- combo->Append( wxU(_(keys[i].psz_key_string)),
- (void*)keys[i].i_key_code );
- if( keys[i].i_key_code == ( p_item->i_value & ~KEY_MODIFIER ) )
+ 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(_(vlc_keys[i].psz_key_string)) );
}
}
+
sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
sizer->Add( alt, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
sizer->Add( ctrl, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
KeyConfigControl::~KeyConfigControl()
{
- ;
+ if( m_keysList )
+ {
+ delete[] m_keysList;
+ m_keysList = NULL;
+ }
}
int KeyConfigControl::GetIntValue()
/*****************************************************************************
* ModuleConfigControl implementation
*****************************************************************************/
-ModuleConfigControl::ModuleConfigControl( intf_thread_t *p_intf,
+ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( 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 );
-
+
/* build a list of available modules */
- p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+ p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
combo->Append( wxU(_("Default")), (void *)NULL );
combo->SetSelection( 0 );
- for( int i_index = 0; i_index < p_list->i_count; i_index++ )
+ for( unsigned int i_index = 0; i_index < p_list->i_count; i_index++ )
{
p_parser = (module_t *)p_list->p_values[i_index].p_object ;
-
+
if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
{
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) );
}
}
vlc_list_release( p_list );
-
+
combo->SetToolTip( wxU(p_item->psz_longtext) );
sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
wxString ModuleConfigControl::GetPszValue()
{
- return combo->GetStringSelection();
+ return wxU( (char *)combo->GetClientData( combo->GetSelection() ));
+}
+
+/*****************************************************************************
+ * ModuleListCatonfigControl implementation
+ *****************************************************************************/
+BEGIN_EVENT_TABLE(ModuleListCatConfigControl, wxPanel)
+ EVT_CHECKBOX( wxID_HIGHEST , ModuleListCatConfigControl::OnUpdate )
+END_EVENT_TABLE()
+
+
+ModuleListCatConfigControl::ModuleListCatConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
+ wxWindow *parent )
+ : ConfigControl( p_this, p_item, parent )
+{
+ vlc_list_t *p_list;
+ module_t *p_parser;
+
+ delete sizer;
+ sizer = new wxBoxSizer( wxVERTICAL );
+ label = new wxStaticText(this, -1, wxU(p_item->psz_text));
+ sizer->Add( label );
+
+ text = new wxTextCtrl( this, -1, wxU(p_item->psz_value),
+ wxDefaultPosition,wxSize( 300, 20 ) );
+
+
+ /* build a list of available modules */
+ p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+ for( unsigned int i_index = 0; i_index < p_list->i_count; i_index++ )
+ {
+ p_parser = (module_t *)p_list->p_values[i_index].p_object ;
+
+ if( !strcmp( p_parser->psz_object_name, "main" ) )
+ continue;
+
+ module_config_t *p_config = p_parser->p_config;
+ if( p_config ) do
+ {
+ /* Hack: required subcategory is stored in i_min */
+ if( p_config->i_type == CONFIG_SUBCATEGORY &&
+ p_config->i_value == p_item->i_min )
+ {
+ moduleCheckBox *mc = new moduleCheckBox;
+ mc->checkbox = new wxCheckBox( this, wxID_HIGHEST,
+ wxU(p_parser->psz_longname));
+ mc->psz_module = strdup( p_parser->psz_object_name );
+ pp_checkboxes.push_back( mc );
+
+ if( p_item->psz_value &&
+ strstr( p_item->psz_value, p_parser->psz_object_name ) )
+ {
+ mc->checkbox->SetValue( true );
+ }
+ sizer->Add( mc->checkbox );
+ }
+ } while( p_config->i_type != CONFIG_HINT_END && p_config++ );
+ }
+ vlc_list_release( p_list );
+
+ text->SetToolTip( wxU(p_item->psz_longtext) );
+ sizer->Add(text, wxEXPAND );
+
+ sizer->Add (new wxStaticText( this, -1, wxU( vlc_wraptext( _("Select modules that you want. To get more advanced control, you can also modify the resulting chain by yourself") , 72, ISUTF8 ) ) ) );
+
+ sizer->Layout();
+ this->SetSizerAndFit( sizer );
+}
+
+ModuleListCatConfigControl::~ModuleListCatConfigControl()
+{
+ ;
+}
+
+wxString ModuleListCatConfigControl::GetPszValue()
+{
+ return wxU( text->GetValue().c_str() ) ;
+}
+
+void ModuleListCatConfigControl::OnUpdate( wxCommandEvent &event )
+{
+ wxString newtext = wxU("");
+ for( int i = 0 ; i< pp_checkboxes.size() ; i++ )
+ {
+ if( pp_checkboxes[i]->checkbox->IsChecked() )
+ {
+ if( newtext.Len() == 0 )
+ {
+ newtext = newtext + wxU( pp_checkboxes[i]->psz_module );
+ }
+ else
+ {
+ newtext += wxU( "," );
+ newtext += wxU(pp_checkboxes[i]->psz_module);
+ }
+ }
+ }
+ text->SetValue( newtext );
}
/*****************************************************************************
* StringConfigControl implementation
*****************************************************************************/
-StringConfigControl::StringConfigControl( module_config_t *p_item,
+StringConfigControl::StringConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( 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( parent )
+ : 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, wxU(p_item->psz_value),
+ combo = new wxComboBox( this, -1, wxT(""),
wxDefaultPosition, wxDefaultSize,
- 0, NULL, wxCB_READONLY|wxCB_SORT );
-
- /* build a list of available options */
- for( int i_index = 0; p_item->ppsz_list[i_index];
- i_index++ )
+ 0, NULL, wxCB_READONLY );
+ UpdateCombo( p_item );
+
+ 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()
{
- ;
+ 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( 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]) );
+ 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(-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( 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,
+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 )
- : ConfigControl( 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);
+ -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 );
+ i_value = p_item->i_value;
}
IntegerConfigControl::~IntegerConfigControl()
int IntegerConfigControl::GetIntValue()
{
- return spin->GetValue();
+ /* We avoid using GetValue because of a recursion bug with wxSpinCtrl with
+ * wxGTK. */
+ return i_value; //spin->GetValue();
+}
+
+void IntegerConfigControl::OnUpdate( wxCommandEvent &event )
+{
+ i_value = event.GetInt();
+ ConfigControl::OnUpdate( event );
+}
+
+/*****************************************************************************
+ * 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,
+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 )
- : ConfigControl( 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,
- p_item->i_max );
+ p_item->i_max, wxDefaultPosition, wxDefaultSize,
+ 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,
+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 )
- : ConfigControl( 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,
+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 )
- : ConfigControl( 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);
int BoolConfigControl::GetIntValue()
{
- if( checkbox->IsChecked() )
- {
- return 1;
- }
- else
- {
- return 0;
- }
+ if( checkbox->IsChecked() ) return 1;
+ else return 0;
+}
+
+/*****************************************************************************
+ * SectionConfigControl implementation
+ *****************************************************************************/
+SectionConfigControl::SectionConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
+ wxWindow *parent )
+ : ConfigControl( p_this, p_item, parent )
+{
+ delete sizer;
+ sizer = new wxBoxSizer( wxVERTICAL );
+ sizer->Add( new wxStaticText( this, -1, wxU( p_item->psz_text ) ) );
+ sizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND, 5 );
+ sizer->Layout();
+ this->SetSizerAndFit( sizer );
+}
+
+SectionConfigControl::~SectionConfigControl()
+{
+ ;
}