]> git.sesse.net Git - vlc/blobdiff - modules/gui/wxwindows/preferences.cpp
* modules/video_output/opengl.c: forward control queries to opengl provider.
[vlc] / modules / gui / wxwindows / preferences.cpp
index bd6bbfa4d928749ff8a833877bc05086cbc203aa..d5c3f878a25489619db1674db389adeef34b0f62 100644 (file)
@@ -1,8 +1,8 @@
 /*****************************************************************************
  * preferences.cpp : wxWindows plugin for vlc
  *****************************************************************************
- * Copyright (C) 2000-2001 VideoLAN
- * $Id: preferences.cpp,v 1.35 2003/10/17 16:40:09 gbazin Exp $
+ * Copyright (C) 2000-2004 VideoLAN
+ * $Id$
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
 #include <vlc_help.h>
 
 #include "wxwindows.h"
-#include <wx/notebook.h>
-#include <wx/textctrl.h>
+#include "preferences_widgets.h"
+
 #include <wx/combobox.h>
-#include <wx/spinctrl.h>
 #include <wx/statline.h>
-#include <wx/treectrl.h>
 #include <wx/clntdata.h>
 #include <wx/dynarray.h>
 
@@ -88,32 +86,7 @@ private:
     wxTreeItemId plugins_item;
 };
 
-struct ConfigData
-{
-    ConfigData( wxPanel *_panel, int _i_conf_type,
-                vlc_bool_t _b_advanced, char *psz_name )
-    { panel = _panel; b_advanced = _b_advanced; b_config_list = VLC_FALSE;
-      i_config_type = _i_conf_type; option_name = wxU(psz_name); }
-
-    vlc_bool_t b_advanced;
-    int i_config_type;
-    vlc_bool_t b_config_list;
-
-    union control
-    {
-        wxComboBox *combobox;
-        wxRadioButton *radio;
-        wxSpinCtrl *spinctrl;
-        wxCheckBox *checkbox;
-        wxTextCtrl *textctrl;
-
-    } control;
-
-    wxPanel *panel;
-    wxString option_name;
-};
-
-WX_DEFINE_ARRAY(ConfigData *, ArrayOfConfigData);
+WX_DEFINE_ARRAY(ConfigControl *, ArrayOfConfigControls);
 
 class PrefsPanel : public wxPanel
 {
@@ -136,40 +109,26 @@ private:
     wxBoxSizer *config_sizer;
     wxScrolledWindow *config_window;
 
-    ArrayOfConfigData config_array;
+    ArrayOfConfigControls config_array;
 };
 
 class ConfigTreeData : public wxTreeItemData
 {
 public:
 
-    ConfigTreeData() { b_submodule = 0; panel = NULL; psz_section = NULL; }
-    virtual ~ConfigTreeData() { if( panel ) delete panel; }
+    ConfigTreeData() { b_submodule = 0; panel = NULL; psz_section = NULL;
+                       psz_help = NULL; }
+    virtual ~ConfigTreeData() { if( panel ) delete panel;
+                                if( psz_section) free(psz_section);
+                                if( psz_help) free(psz_help); }
 
     vlc_bool_t b_submodule;
 
-    char *psz_help;
-
     PrefsPanel *panel;
     wxBoxSizer *sizer;
     int i_object_id;
     char *psz_section;
-};
-
-class ConfigEvtHandler : public wxEvtHandler
-{
-public:
-    ConfigEvtHandler( intf_thread_t *p_intf, PrefsDialog *p_prefs_dialog );
-    virtual ~ConfigEvtHandler();
-
-    void ConfigEvtHandler::OnCommandEvent( wxCommandEvent& event );
-
-private:
-
-    DECLARE_EVENT_TABLE()
-
-    intf_thread_t *p_intf;
-    PrefsDialog *p_prefs_dialog;
+    char *psz_help;
 };
 
 /*****************************************************************************
@@ -208,13 +167,6 @@ BEGIN_EVENT_TABLE(PrefsTreeCtrl, wxTreeCtrl)
     EVT_COMMAND(Advanced_Event, wxEVT_USER_FIRST, PrefsTreeCtrl::OnAdvanced)
 END_EVENT_TABLE()
 
-BEGIN_EVENT_TABLE(ConfigEvtHandler, wxEvtHandler)
-    EVT_BUTTON(-1, ConfigEvtHandler::OnCommandEvent)
-    EVT_TEXT(-1, ConfigEvtHandler::OnCommandEvent)
-    EVT_RADIOBOX(-1, ConfigEvtHandler::OnCommandEvent)
-    EVT_SPINCTRL(-1, ConfigEvtHandler::OnCommandEvent)
-END_EVENT_TABLE()
-
 /*****************************************************************************
  * Constructor.
  *****************************************************************************/
@@ -318,9 +270,9 @@ void PrefsDialog::OnSave( wxCommandEvent& WXUNUSED(event) )
 void PrefsDialog::OnResetAll( wxCommandEvent& WXUNUSED(event) )
 {
     wxMessageDialog dlg( this,
-        wxU(_("Beware this will reset your VLC Media Player config file.\n"
+        wxU(_("Beware this will reset your VLC media player preferences.\n"
               "Are you sure you want to continue?")),
-        wxU(_("Reset config file")), wxYES_NO|wxNO_DEFAULT|wxCENTRE );
+        wxU(_("Reset Preferences")), wxYES_NO|wxNO_DEFAULT|wxCENTRE );
 
     if ( dlg.ShowModal() == wxID_YES )
     {
@@ -339,41 +291,6 @@ void PrefsDialog::OnAdvanced( wxCommandEvent& event )
     prefs_tree->AddPendingEvent( newevent );
 }
 
-/*****************************************************************************
- * GetCapabilityHelp: Display the help for one capability.
- *****************************************************************************/
-static char * GetCapabilityHelp( char *psz_capability, int i_type)
-{
-    if( psz_capability == NULL) return "";
-
-    if( !strcasecmp(psz_capability,"access") )
-        return i_type == 1 ? ACCESS_TITLE : ACCESS_HELP;
-    if( !strcasecmp(psz_capability,"audio filter") )
-        return i_type == 1 ? AUDIO_FILTER_TITLE : AUDIO_FILTER_HELP;
-    if( !strcasecmp(psz_capability,"audio output") )
-        return i_type == 1 ? AOUT_TITLE : AOUT_HELP;
-    if( !strcasecmp(psz_capability,"chroma") )
-        return i_type == 1 ? CHROMA_TITLE : CHROMA_HELP;
-    if( !strcasecmp(psz_capability,"decoder") )
-        return i_type == 1 ? DECODER_TITLE : DECODER_HELP;
-    if( !strcasecmp(psz_capability,"demux") )
-        return i_type == 1 ? DEMUX_TITLE : DEMUX_HELP;
-    if( !strcasecmp(psz_capability,"interface") )
-        return i_type == 1 ? INTERFACE_TITLE : INTERFACE_HELP;
-    if( !strcasecmp(psz_capability,"sout access") )
-        return i_type == 1 ? SOUT_TITLE : SOUT_HELP;
-    if( !strcasecmp(psz_capability,"subtitle demux") )
-        return i_type == 1 ? SUBTITLE_DEMUX_TITLE : SUBTITLE_DEMUX_HELP;
-    if( !strcasecmp(psz_capability,"text renderer") )
-        return i_type == 1 ? TEXT_TITLE : TEXT_HELP;
-    if( !strcasecmp(psz_capability,"video output") )
-        return i_type == 1 ? VOUT__TITLE : VOUT_HELP;
-    if( !strcasecmp(psz_capability,"video filter") )
-        return i_type == 1 ? VIDEO_FILTER_TITLE : VIDEO_FILTER_HELP;
-
-    return "";
-}
-
 /*****************************************************************************
  * PrefsTreeCtrl class definition.
  *****************************************************************************/
@@ -407,11 +324,10 @@ PrefsTreeCtrl::PrefsTreeCtrl( wxWindow *_p_parent, intf_thread_t *_p_intf,
      * Build a tree of the main options
      */
     ConfigTreeData *config_data = new ConfigTreeData;
-    config_data->psz_section = NULL;
     config_data->i_object_id = GENERAL_ID;
-    config_data->psz_help = wraptext( GENERAL_HELP, WRAPCOUNT, ISUTF8 );
+    config_data->psz_help = wraptext( GENERAL_HELP, 72 , ISUTF8 );
     config_data->psz_section = strdup( GENERAL_TITLE );
-    general_item = AppendItem( root_item, wxU(_("General Settings")),
+    general_item = AppendItem( root_item, wxU(_("General settings")),
                                 -1, -1, config_data );
 
     for( i_index = 0; i_index < p_list->i_count; i_index++ )
@@ -438,7 +354,7 @@ PrefsTreeCtrl::PrefsTreeCtrl( wxWindow *_p_parent, intf_thread_t *_p_intf,
                 if( p_item->psz_longtext )
                 {
                     config_data->psz_help =
-                        wraptext( p_item->psz_longtext, WRAPCOUNT, ISUTF8 );
+                        wraptext( p_item->psz_longtext, 72 , ISUTF8 );
                 }
                 else
                 {
@@ -462,12 +378,11 @@ PrefsTreeCtrl::PrefsTreeCtrl( wxWindow *_p_parent, intf_thread_t *_p_intf,
      * Build a tree of all the plugins
      */
     config_data = new ConfigTreeData;
-    config_data->psz_section = NULL;
     config_data->i_object_id = PLUGIN_ID;
-    config_data->psz_help = wraptext( PLUGIN_HELP, WRAPCOUNT, ISUTF8 );
+    config_data->psz_help = wraptext( PLUGIN_HELP, 72, ISUTF8 );
     config_data->psz_section = strdup( PLUGIN_TITLE );
-    plugins_item = AppendItem( root_item, wxU(_("Plugins")),
-                        -1,-1,config_data );
+    plugins_item = AppendItem( root_item, wxU(_("Modules")),
+                        -1, -1,config_data );
 
     for( i_index = 0; i_index < p_list->i_count; i_index++ )
     {
@@ -515,10 +430,10 @@ PrefsTreeCtrl::PrefsTreeCtrl( wxWindow *_p_parent, intf_thread_t *_p_intf,
             ConfigTreeData *config_data = new ConfigTreeData;
             config_data->psz_section =
                 wraptext( GetCapabilityHelp( p_module->psz_capability , 1 ),
-                          WRAPCOUNT, ISUTF8 );
+                          72, ISUTF8 );
             config_data->psz_help =
                 wraptext( GetCapabilityHelp( p_module->psz_capability , 2 ),
-                          WRAPCOUNT, ISUTF8 );
+                          72, ISUTF8 );
             config_data->i_object_id = CAPABILITY_ID;
             capability_item = AppendItem( plugins_item,
                                           wxU(p_module->psz_capability),
@@ -544,8 +459,8 @@ PrefsTreeCtrl::PrefsTreeCtrl( wxWindow *_p_parent, intf_thread_t *_p_intf,
          i_child_index < GetChildrenCount( plugins_item, FALSE );
          i_child_index++ )
     {
-        capability_item = GetNextChild( plugins_item, cookie );
         SortChildren( capability_item );
+        capability_item = GetNextChild( plugins_item, cookie );
     }
 
     /* Clean-up everything */
@@ -712,10 +627,11 @@ ConfigTreeData *PrefsTreeCtrl::FindModuleConfig( ConfigTreeData *config_data )
 
 void PrefsTreeCtrl::OnSelectTreeItem( wxTreeEvent& event )
 {
-    ConfigTreeData *config_data;
+    ConfigTreeData *config_data = NULL;
 
-    config_data = FindModuleConfig( (ConfigTreeData *)GetItemData(
-                                    event.GetOldItem() ) );
+    if( event.GetOldItem() )
+        config_data = FindModuleConfig( (ConfigTreeData *)GetItemData(
+                                        event.GetOldItem() ) );
     if( config_data && config_data->panel )
     {
         config_data->panel->Hide();
@@ -776,21 +692,13 @@ PrefsPanel::PrefsPanel( wxWindow* parent, intf_thread_t *_p_intf,
   :  wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize )
 {
     module_config_t *p_item;
-    vlc_list_t      *p_list;
-    module_t        *p_parser;
 
     wxStaticText *label;
     wxStaticText *help;
-    wxComboBox *combo;
-    wxSpinCtrl *spin;
-    wxCheckBox *checkbox;
-    wxTextCtrl *textctrl;
-    wxButton *button;
     wxArrayString array;
 
-    vlc_bool_t b_has_advanced = VLC_FALSE;
     module_t *p_module = NULL;
-    
+
     /* Initializations */
     p_intf = _p_intf;
     p_prefs_dialog =_p_prefs_dialog,
@@ -861,7 +769,7 @@ PrefsPanel::PrefsPanel( wxWindow* parent, intf_thread_t *_p_intf,
         /* Now put all the config options into a scrolled window */
         config_sizer = new wxBoxSizer( wxVERTICAL );
         config_window = new wxScrolledWindow( this, -1, wxDefaultPosition,
-            wxDefaultSize, wxSTATIC_BORDER | wxHSCROLL | wxVSCROLL );
+            wxDefaultSize, wxBORDER_NONE | wxHSCROLL | wxVSCROLL );
         config_window->SetAutoLayout( TRUE );
         config_window->SetScrollRate( 5, 5 );
 
@@ -872,195 +780,17 @@ PrefsPanel::PrefsPanel( wxWindow* parent, intf_thread_t *_p_intf,
                 strcmp( psz_section, p_item->psz_text ) )
                 break;
 
-            /* put each config option in a separate panel so we can hide
-             * advanced options easily */
-            wxPanel *panel = new wxPanel( config_window, -1, wxDefaultPosition,
-                                          wxDefaultSize );
-            wxBoxSizer *panel_sizer = new wxBoxSizer( wxHORIZONTAL );
-            ConfigData *config_data =
-                new ConfigData( panel, p_item->i_type,
-                                p_item->b_advanced, p_item->psz_name );
-
-            switch( p_item->i_type )
-            {
-            case CONFIG_ITEM_MODULE:
-                label = new wxStaticText(panel, -1, wxU(p_item->psz_text));
-                combo = new wxComboBox( panel, -1, wxU(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 );
-                combo->Append( wxU(_("Default")), (void *)NULL );
-                combo->SetSelection( 0 );
-                for( 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, 
-                            p_parser->psz_object_name) )
-                            combo->SetValue( wxU(p_parser->psz_longname) );
-                    }
-                }
-                vlc_list_release( p_list );
-
-                combo->SetToolTip( wxU(p_item->psz_longtext) );
-                config_data->control.combobox = combo;
-                panel_sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL
-                                  | wxALL, 5 );
-                panel_sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL 
-                                  | wxALL, 5 );
-                break;
-
-            case CONFIG_ITEM_STRING:
-            case CONFIG_ITEM_FILE:
-            case CONFIG_ITEM_DIRECTORY:
-                label = new wxStaticText(panel, -1, wxU(p_item->psz_text));
-                panel_sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL 
-                                  | wxALL, 5 );
-
-                if( !p_item->ppsz_list )
-                {
-                    textctrl = new wxTextCtrl( panel, -1, 
-                                               wxU(p_item->psz_value),
-                                               wxDefaultPosition,
-                                               wxDefaultSize,
-                                               wxTE_PROCESS_ENTER);
-                    textctrl->SetToolTip( wxU(p_item->psz_longtext) );
-                    config_data->control.textctrl = textctrl;
-                    panel_sizer->Add( textctrl, 1, wxALL, 5 );
-                }
-                else
-                {
-                    combo = new wxComboBox( panel, -1, wxU(p_item->psz_value),
-                                            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++ )
-                    {
-                        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 );
-                    }
-
-                    if( p_item->psz_value )
-                        combo->SetValue( wxU(p_item->psz_value) );
-                    combo->SetToolTip( wxU(p_item->psz_longtext) );
-                    config_data->control.combobox = combo;
-                    config_data->b_config_list = VLC_TRUE;
-                    panel_sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL
-                                      |wxALL, 5 );
-                }
-
-                if( p_item->i_type == CONFIG_ITEM_FILE )
-                {
-                    button = new wxButton( panel, -1, wxU(_("Browse...")) );
-                    panel_sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL
-                                      |wxALL, 5);
-                    button->SetClientData((void *)config_data);
-                }
-                if( p_item->b_advanced ) b_has_advanced = VLC_TRUE;
-                break;
-
-            case CONFIG_ITEM_INTEGER:
-                label = new wxStaticText(panel, -1, wxU(p_item->psz_text));
-                spin = new wxSpinCtrl( panel, -1,
-                                       wxString::Format(wxT("%d"),
-                                                        p_item->i_value),
-                                       wxDefaultPosition, wxDefaultSize,
-                                       wxSP_ARROW_KEYS,
-                                       -16000, 16000, p_item->i_value);
-                spin->SetToolTip( wxU(p_item->psz_longtext) );
-                config_data->control.spinctrl = spin;
-                panel_sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL 
-                                  | wxALL, 5 );
-                panel_sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL 
-                                  | wxALL, 5 );
-
-                spin->SetClientData((void *)config_data);
-                if( p_item->b_advanced ) b_has_advanced = VLC_TRUE;
-                break;
-
-            case CONFIG_ITEM_KEY:
-            {
-                label = new wxStaticText(panel, -1, wxU(p_item->psz_text));
-                wxCheckBox *alt = new wxCheckBox( panel, -1, wxU(_("Alt")) );
-                alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
-                wxCheckBox *ctrl = new wxCheckBox( panel, -1, wxU(_("Ctrl")) );
-                ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL );
-                wxCheckBox *shift = new wxCheckBox( panel, -1, 
-                                                    wxU(_("Shift")) );
-                shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
-                combo = new wxComboBox( panel, -1, wxU("f"), 
-                                        wxDefaultPosition, wxDefaultSize, 0
-                                        , NULL, wxCB_READONLY | wxCB_SORT );
-                for( int i=0; i < sizeof(keys)/sizeof(key_descriptor_s); i++ )
-                {
-                    combo->Append( wxU(_(keys[i].psz_key_string)),
-                                   (void*)&keys[i].i_key_code );
-                }
-                combo->SetValue( wxU( KeyToString( 
-                                 p_item->i_value&~KEY_MODIFIER )));
-                config_data->control.combobox = combo;
-                panel_sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL 
-                                  | wxALL | wxEXPAND, 5 );
-                panel_sizer->Add( alt, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
-                panel_sizer->Add( ctrl, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5);
-                panel_sizer->Add( shift, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5);
-                panel_sizer->Add( combo, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5);
-                break;
-            }
-
-            case CONFIG_ITEM_FLOAT:
-                label = new wxStaticText(panel, -1, wxU(p_item->psz_text));
-                textctrl = new wxTextCtrl( panel, -1,
-                                           wxString::Format(wxT("%f"),
-                                                            p_item->f_value),
-                                           wxDefaultPosition, wxDefaultSize,
-                                           wxTE_PROCESS_ENTER );
-                textctrl->SetToolTip( wxU(p_item->psz_longtext) );
-                config_data->control.textctrl = textctrl;
-                panel_sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL 
-                                  | wxALL, 5 );
-                panel_sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL 
-                                  | wxALL, 5);
-                if( p_item->b_advanced ) b_has_advanced = VLC_TRUE;
-                break;
-
-            case CONFIG_ITEM_BOOL:
-                checkbox = new wxCheckBox( panel, -1, wxU(p_item->psz_text) );
-                if( p_item->i_value ) checkbox->SetValue(TRUE);
-                checkbox->SetToolTip( wxU(p_item->psz_longtext) );
-                config_data->control.checkbox = checkbox;
-                panel_sizer->Add( checkbox, 0, wxALL, 5 );
-                if( p_item->b_advanced ) b_has_advanced = VLC_TRUE;
-                break;
-
-            default:
-                delete panel; panel = NULL;
-                delete panel_sizer;
-                delete config_data;
-                break;
-            }
+            ConfigControl *control =
+                CreateConfigControl( VLC_OBJECT(p_intf),
+                                     p_item, config_window );
 
             /* Don't add items that were not recognized */
-            if( panel == NULL ) continue;
-
-            panel_sizer->Layout();
-            panel->SetSizerAndFit( panel_sizer );
+            if( control == NULL ) continue;
 
             /* Add the config data to our array so we can keep a trace of it */
-            config_array.Add( config_data );
+            config_array.Add( control );
 
-            config_sizer->Add( panel, 0, wxEXPAND | wxALL, 2 );
+            config_sizer->Add( control, 0, wxEXPAND | wxALL, 2 );
         }
         while( p_item->i_type != CONFIG_HINT_END && p_item++ );
 
@@ -1080,54 +810,41 @@ PrefsPanel::PrefsPanel( wxWindow* parent, intf_thread_t *_p_intf,
             sizer->Add( help ,0 ,wxEXPAND | wxALL, 5 );
         }
 
-
-        /* Intercept all menu events in our custom event handler */
-        config_window->PushEventHandler(
-            new ConfigEvtHandler( p_intf, p_prefs_dialog ) );
-    } 
+        vlc_object_release( p_module );
+    }
     sizer->Layout();
     SetSizer( sizer );
 }
 
 void PrefsPanel::ApplyChanges()
 {
+    vlc_value_t val;
+
     for( size_t i = 0; i < config_array.GetCount(); i++ )
     {
-        ConfigData *config_data = config_array.Item(i);
+        ConfigControl *control = config_array.Item(i);
 
-        switch( config_data->i_config_type )
+        switch( control->GetType() )
         {
-        case CONFIG_ITEM_MODULE:
-            config_PutPsz( p_intf, config_data->option_name.mb_str(), (char *)
-                           config_data->control.combobox->GetClientData(
-                           config_data->control.combobox->GetSelection() ) );
-            break;
         case CONFIG_ITEM_STRING:
         case CONFIG_ITEM_FILE:
         case CONFIG_ITEM_DIRECTORY:
-            if( !config_data->b_config_list )
-                config_PutPsz( p_intf, config_data->option_name.mb_str(),
-                               config_data->control.textctrl->GetValue().mb_str() );
-            else
-                config_PutPsz( p_intf, config_data->option_name.mb_str(),
-                               config_data->control.combobox->GetValue().mb_str() );
-            break;
-        case CONFIG_ITEM_BOOL:
-            config_PutInt( p_intf, config_data->option_name.mb_str(),
-                           config_data->control.checkbox->IsChecked() );
+        case CONFIG_ITEM_MODULE:
+            config_PutPsz( p_intf, control->GetName().mb_str(),
+                           control->GetPszValue().mb_str() );
             break;
+        case CONFIG_ITEM_KEY:
+            /* So you don't need to restart to have the changes take effect */
+            val.i_int = control->GetIntValue();
+            var_Set( p_intf->p_vlc, control->GetName().mb_str(), val );
         case CONFIG_ITEM_INTEGER:
-            config_PutInt( p_intf, config_data->option_name.mb_str(),
-                           config_data->control.spinctrl->GetValue() );
+        case CONFIG_ITEM_BOOL:
+            config_PutInt( p_intf, control->GetName().mb_str(),
+                           control->GetIntValue() );
             break;
         case CONFIG_ITEM_FLOAT:
-            {
-                float f_value;
-                if( (wxSscanf(config_data->control.textctrl->GetValue(),
-                              wxT("%f"), &f_value) == 1) )
-                    config_PutFloat( p_intf, config_data->option_name.mb_str(),
-                                     f_value );
-            }
+            config_PutFloat( p_intf, control->GetName().mb_str(),
+                             control->GetFloatValue() );
             break;
         }
     }
@@ -1143,11 +860,11 @@ void PrefsPanel::SwitchAdvanced( vlc_bool_t b_new_advanced )
 
         for( size_t i = 0; i < config_array.GetCount(); i++ )
         {
-            ConfigData *config_data = config_array.Item(i);
-            if( config_data->b_advanced )
+            ConfigControl *control = config_array.Item(i);
+            if( control->IsAdvanced() )
             {
-                config_data->panel->Show( b_advanced );
-                config_sizer->Show( config_data->panel, b_advanced );
+                control->Show( b_advanced );
+                config_sizer->Show( control, b_advanced );
             }
         }
 
@@ -1155,72 +872,5 @@ void PrefsPanel::SwitchAdvanced( vlc_bool_t b_new_advanced )
         config_window->FitInside();
         config_window->Refresh();
     }
-    return;     
-}
-
-/*****************************************************************************
- * A small helper class which intercepts all events
- *****************************************************************************/
-ConfigEvtHandler::ConfigEvtHandler( intf_thread_t *_p_intf,
-                                    PrefsDialog *_p_prefs_dialog )
-{
-    /* Initializations */
-    p_intf = _p_intf;
-    p_prefs_dialog = _p_prefs_dialog;
-}
-
-ConfigEvtHandler::~ConfigEvtHandler()
-{
-}
-
-void ConfigEvtHandler::OnCommandEvent( wxCommandEvent& event )
-{
-    if( !event.GetEventObject() )
-    {
-        event.Skip();
-        return;
-    }
-
-    ConfigData *config_data = (ConfigData *)
-        ((wxEvtHandler *)event.GetEventObject())->GetClientData();
-
-    if( !config_data )
-    {
-        event.Skip();
-        return;
-    }
-
-    if( config_data->i_config_type == CONFIG_ITEM_FILE )
-    {
-        wxFileDialog dialog( p_prefs_dialog, wxU(_("Open file")),
-                             wxT(""), wxT(""), wxT("*.*"),
-#if defined( __WXMSW__ )
-                             wxOPEN );
-#else
-                             wxOPEN | wxSAVE );
-#endif
-
-        if( dialog.ShowModal() == wxID_OK )
-        {
-            config_data->control.textctrl->SetValue( dialog.GetPath() );      
-        }
-    }
-
-    switch( config_data->i_config_type )
-    {
-    case CONFIG_ITEM_MODULE:
-        break;
-    case CONFIG_ITEM_STRING:
-        break;
-    case CONFIG_ITEM_FILE:
-        break;
-    case CONFIG_ITEM_INTEGER:
-        break;
-    case CONFIG_ITEM_FLOAT:
-        break;
-    case CONFIG_ITEM_BOOL:
-        break;
-    }
-
-    event.Skip();
+    return;
 }