]> 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 9dee0518bc64fe37c0ae40eb0be314b728e130a9..d5c3f878a25489619db1674db389adeef34b0f62 100644 (file)
@@ -1,8 +1,8 @@
 /*****************************************************************************
  * preferences.cpp : wxWindows plugin for vlc
  *****************************************************************************
- * Copyright (C) 2000-2001 VideoLAN
- * $Id: preferences.cpp,v 1.36 2003/10/19 22:41:18 sigmunau Exp $
+ * Copyright (C) 2000-2004 VideoLAN
+ * $Id$
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
 
 #include "wxwindows.h"
 #include "preferences_widgets.h"
-#include <wx/notebook.h>
-#include <wx/textctrl.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>
 
@@ -89,22 +86,7 @@ private:
     wxTreeItemId plugins_item;
 };
 
-struct ConfigData
-{
-    ConfigData( int _i_conf_type, vlc_bool_t _b_advanced, char *psz_name )
-    { control = NULL; 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;
-
-    ConfigControl *control;
-
-    wxString option_name;
-};
-
-WX_DEFINE_ARRAY(ConfigData *, ArrayOfConfigData);
+WX_DEFINE_ARRAY(ConfigControl *, ArrayOfConfigControls);
 
 class PrefsPanel : public wxPanel
 {
@@ -127,24 +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;
+    char *psz_help;
 };
 
 /*****************************************************************************
@@ -286,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 )
     {
@@ -307,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.
  *****************************************************************************/
@@ -375,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++ )
@@ -406,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
                 {
@@ -430,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++ )
     {
@@ -483,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),
@@ -512,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 */
@@ -680,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();
@@ -750,7 +698,7 @@ PrefsPanel::PrefsPanel( wxWindow* parent, intf_thread_t *_p_intf,
     wxArrayString array;
 
     module_t *p_module = NULL;
-    
+
     /* Initializations */
     p_intf = _p_intf;
     p_prefs_dialog =_p_prefs_dialog,
@@ -821,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 );
 
@@ -832,65 +780,17 @@ PrefsPanel::PrefsPanel( wxWindow* parent, intf_thread_t *_p_intf,
                 strcmp( psz_section, p_item->psz_text ) )
                 break;
 
-            ConfigData *config_data =
-                new ConfigData( p_item->i_type, p_item->b_advanced,
-                                p_item->psz_name );
-            
-            switch( p_item->i_type )
-            {
-            case CONFIG_ITEM_MODULE:
-                config_data->control = new ModuleConfigControl( p_intf, p_item, config_window );
-                break;
-
-            case CONFIG_ITEM_STRING:
-                if( !p_item->ppsz_list )
-                {
-                    config_data->control = new StringConfigControl( p_item, config_window );
-                }
-                else
-                {
-                    config_data->control = new StringListConfigControl( p_item, config_window );
-                }
-                break;
-            case CONFIG_ITEM_FILE:
-            case CONFIG_ITEM_DIRECTORY:
-                config_data->control = new FileConfigControl( p_item, config_window );
-                break;
-
-            case CONFIG_ITEM_INTEGER:
-                if( p_item->i_min != 0 || p_item->i_max != 0 )
-                {
-                    config_data->control = new RangedIntConfigControl( p_item, config_window );
-                }
-                else
-                {
-                    config_data->control = new IntegerConfigControl( p_item, config_window );
-                }
-                break;
-
-            case CONFIG_ITEM_KEY:
-                config_data->control = new KeyConfigControl( p_item, config_window );
-                break;
-
-            case CONFIG_ITEM_FLOAT:
-                config_data->control = new FloatConfigControl( p_item, config_window );
-                break;
-
-            case CONFIG_ITEM_BOOL:
-                config_data->control = new BoolConfigControl( p_item, config_window );
-                break;
-
-            default:
-                break;
-            }
+            ConfigControl *control =
+                CreateConfigControl( VLC_OBJECT(p_intf),
+                                     p_item, config_window );
 
             /* Don't add items that were not recognized */
-            if( config_data->control == NULL ) continue;
+            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( config_data->control, 0, wxEXPAND | wxALL, 2 );
+            config_sizer->Add( control, 0, wxEXPAND | wxALL, 2 );
         }
         while( p_item->i_type != CONFIG_HINT_END && p_item++ );
 
@@ -910,35 +810,41 @@ PrefsPanel::PrefsPanel( wxWindow* parent, intf_thread_t *_p_intf,
             sizer->Add( help ,0 ,wxEXPAND | wxALL, 5 );
         }
 
-    } 
+        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_STRING:
         case CONFIG_ITEM_FILE:
         case CONFIG_ITEM_DIRECTORY:
         case CONFIG_ITEM_MODULE:
-            config_PutPsz( p_intf, config_data->option_name.mb_str(), (char *)
-                           config_data->control->GetPszValue() );
+            config_PutPsz( p_intf, control->GetName().mb_str(),
+                           control->GetPszValue().mb_str() );
             break;
-        case CONFIG_ITEM_INTEGER:
         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:
         case CONFIG_ITEM_BOOL:
-            config_PutInt( p_intf, config_data->option_name.mb_str(),
-                           config_data->control->GetIntValue() );
+            config_PutInt( p_intf, control->GetName().mb_str(),
+                           control->GetIntValue() );
             break;
         case CONFIG_ITEM_FLOAT:
-            config_PutFloat( p_intf, config_data->option_name.mb_str(),
-                             config_data->control->GetFloatValue() );
+            config_PutFloat( p_intf, control->GetName().mb_str(),
+                             control->GetFloatValue() );
             break;
         }
     }
@@ -954,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->control->Show( b_advanced );
-                config_sizer->Show( config_data->control, b_advanced );
+                control->Show( b_advanced );
+                config_sizer->Show( control, b_advanced );
             }
         }
 
@@ -966,5 +872,5 @@ void PrefsPanel::SwitchAdvanced( vlc_bool_t b_new_advanced )
         config_window->FitInside();
         config_window->Refresh();
     }
-    return;     
+    return;
 }