]> git.sesse.net Git - vlc/blobdiff - modules/gui/wxwindows/preferences_widgets.cpp
* Move GetCapabilityHelp from intf's to vlc_help.h
[vlc] / modules / gui / wxwindows / preferences_widgets.cpp
index c572e063967f4654d6d0ab0b20bba101b5ece3f5..b6b0bd16b0dde064d8e75355f77da5ec9bbc09d2 100644 (file)
@@ -1,8 +1,8 @@
 /*****************************************************************************
  * 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>
@@ -53,42 +53,46 @@ ConfigControl *CreateConfigControl( vlc_object_t *p_this,
         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:
@@ -101,9 +105,13 @@ ConfigControl *CreateConfigControl( vlc_object_t *p_this,
 /*****************************************************************************
  * 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 );
 }
@@ -132,6 +140,21 @@ vlc_bool_t ConfigControl::IsAdvanced()
     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
  *****************************************************************************/
@@ -207,8 +230,9 @@ static wxString KeysList[] =
     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")) );
@@ -222,12 +246,12 @@ KeyConfigControl::KeyConfigControl( module_config_t *p_item, wxWindow *parent )
                             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)) );
         }
     }
 
@@ -274,13 +298,13 @@ int KeyConfigControl::GetIntValue()
 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 );
 
@@ -296,7 +320,7 @@ ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
         {
             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) );
         }
@@ -323,14 +347,15 @@ wxString ModuleConfigControl::GetPszValue()
 /*****************************************************************************
  * 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);
@@ -350,59 +375,121 @@ wxString StringConfigControl::GetPszValue()
     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);
@@ -423,16 +510,16 @@ void FileConfigControl::OnBrowse( wxCommandEvent& event )
 {
     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
@@ -440,6 +527,10 @@ void FileConfigControl::OnBrowse( wxCommandEvent& event )
                              wxOPEN | wxSAVE
 #endif
                            );
+        if( dialog.ShowModal() == wxID_OK )
+        {
+            textctrl->SetValue( dialog.GetPath() );
+        }
     }
 }
 
@@ -447,7 +538,7 @@ FileConfigControl::~FileConfigControl()
 {
     ;
 }
-    
+
 wxString FileConfigControl::GetPszValue()
 {
     return textctrl->GetValue();
@@ -456,9 +547,10 @@ wxString FileConfigControl::GetPszValue()
 /*****************************************************************************
  * 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,
@@ -466,10 +558,10 @@ IntegerConfigControl::IntegerConfigControl( module_config_t *p_item,
                                             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 );
 }
@@ -484,12 +576,108 @@ int IntegerConfigControl::GetIntValue()
     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,
@@ -497,7 +685,7 @@ RangedIntConfigControl::RangedIntConfigControl( module_config_t *p_item,
                            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 );
 }
@@ -515,9 +703,10 @@ int RangedIntConfigControl::GetIntValue()
 /*****************************************************************************
  * 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,
@@ -548,9 +737,10 @@ float FloatConfigControl::GetFloatValue()
 /*****************************************************************************
  * 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);