1 /*****************************************************************************
2 * preferences_widgets.cpp : wxWindows plugin for vlc
3 *****************************************************************************
4 * Copyright (C) 2000-2004 the VideoLAN team
7 * Authors: Gildas Bazin <gbazin@videolan.org>
8 * Sigmund Augdal Helberg <dnumgis@videolan.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 #include "wxwidgets.hpp"
26 #include "preferences_widgets.h"
28 #include <vlc_config_cat.h>
30 #include <wx/statline.h>
31 #include <wx/spinctrl.h>
33 /*****************************************************************************
34 * CreateConfigControl wrapper
35 *****************************************************************************/
36 ConfigControl *CreateConfigControl( vlc_object_t *p_this,
37 module_config_t *p_item, wxWindow *parent )
39 ConfigControl *p_control = NULL;
41 /*Skip deprecated options */
42 if( p_item->psz_current )
47 switch( p_item->i_type )
49 case CONFIG_ITEM_MODULE:
50 p_control = new ModuleConfigControl( p_this, p_item, parent );
52 case CONFIG_ITEM_MODULE_CAT:
53 p_control = new ModuleCatConfigControl( p_this, p_item, parent );
55 case CONFIG_ITEM_MODULE_LIST_CAT:
56 p_control = new ModuleListCatConfigControl( p_this, p_item, parent );
59 case CONFIG_ITEM_STRING:
62 p_control = new StringConfigControl( p_this, p_item, parent );
66 p_control = new StringListConfigControl( p_this, p_item, parent );
70 case CONFIG_ITEM_FILE:
71 case CONFIG_ITEM_DIRECTORY:
72 p_control = new FileConfigControl( p_this, p_item, parent );
75 case CONFIG_ITEM_INTEGER:
78 p_control = new IntegerListConfigControl( p_this, p_item, parent );
80 else if( p_item->i_min != 0 || p_item->i_max != 0 )
82 p_control = new RangedIntConfigControl( p_this, p_item, parent );
86 p_control = new IntegerConfigControl( p_this, p_item, parent );
91 p_control = new KeyConfigControl( p_this, p_item, parent );
94 case CONFIG_ITEM_FLOAT:
95 p_control = new FloatConfigControl( p_this, p_item, parent );
98 case CONFIG_ITEM_BOOL:
99 p_control = new BoolConfigControl( p_this, p_item, parent );
103 p_control = new SectionConfigControl( p_this, p_item, parent );
113 /*****************************************************************************
114 * ConfigControl implementation
115 *****************************************************************************/
116 ConfigControl::ConfigControl( vlc_object_t *_p_this,
117 module_config_t *p_item, wxWindow *parent )
118 : wxPanel( parent ), p_this( _p_this ),
119 pf_update_callback( NULL ), p_update_data( NULL ),
120 name( wxU(p_item->psz_name) ), i_type( p_item->i_type ),
121 b_advanced( p_item->b_advanced )
124 sizer = new wxBoxSizer( wxHORIZONTAL );
127 ConfigControl::~ConfigControl()
131 wxSizer *ConfigControl::Sizer()
136 wxString ConfigControl::GetName()
141 int ConfigControl::GetType()
146 vlc_bool_t ConfigControl::IsAdvanced()
151 void ConfigControl::SetUpdateCallback( void (*p_callback)( void * ),
154 pf_update_callback = p_callback;
155 p_update_data = p_data;
158 void ConfigControl::OnUpdate( wxCommandEvent& WXUNUSED(event) )
160 if( pf_update_callback )
162 pf_update_callback( p_update_data );
166 void ConfigControl::OnUpdateScroll( wxScrollEvent& WXUNUSED(event) )
168 wxCommandEvent cevent;
173 /*****************************************************************************
174 * KeyConfigControl implementation
175 *****************************************************************************/
176 wxString *KeyConfigControl::m_keysList = NULL;
178 KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
179 module_config_t *p_item, wxWindow *parent )
180 : ConfigControl( p_this, p_item, parent )
182 // Number of keys descriptions
183 unsigned int i_keys = sizeof(vlc_keys)/sizeof(key_descriptor_t);
185 // Init the keys decriptions array
186 if( m_keysList == NULL )
188 m_keysList = new wxString[i_keys];
189 for( unsigned int i = 0; i < i_keys; i++ )
191 m_keysList[i] = wxU(vlc_keys[i].psz_key_string);
195 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
196 alt = new wxCheckBox( this, -1, wxU(_("Alt")) );
197 alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
198 ctrl = new wxCheckBox( this, -1, wxU(_("Ctrl")) );
199 ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL );
200 shift = new wxCheckBox( this, -1, wxU(_("Shift")) );
201 shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
202 combo = new wxComboBox( this, -1, wxT(""), wxDefaultPosition,
203 wxDefaultSize, i_keys, m_keysList,
205 for( unsigned int i = 0; i < i_keys; i++ )
207 combo->SetClientData( i, (void*)vlc_keys[i].i_key_code );
208 if( (unsigned int)vlc_keys[i].i_key_code ==
209 ( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) )
211 combo->SetSelection( i );
212 combo->SetValue( wxU(_(vlc_keys[i].psz_key_string)) );
216 sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
217 sizer->Add( alt, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
218 sizer->Add( ctrl, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
219 sizer->Add( shift, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
220 sizer->Add( combo, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
222 this->SetSizerAndFit( sizer );
225 KeyConfigControl::~KeyConfigControl()
234 int KeyConfigControl::GetIntValue()
237 if( alt->IsChecked() )
239 result |= KEY_MODIFIER_ALT;
241 if( ctrl->IsChecked() )
243 result |= KEY_MODIFIER_CTRL;
245 if( shift->IsChecked() )
247 result |= KEY_MODIFIER_SHIFT;
249 int selected = combo->GetSelection();
252 result |= (int)combo->GetClientData( selected );
257 /*****************************************************************************
258 * ModuleConfigControl implementation
259 *****************************************************************************/
260 ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
261 module_config_t *p_item,
263 : ConfigControl( p_this, p_item, parent )
268 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
269 combo = new wxComboBox( this, -1, wxL2U(p_item->psz_value),
270 wxDefaultPosition, wxDefaultSize,
271 0, NULL, wxCB_READONLY | wxCB_SORT );
273 /* build a list of available modules */
274 p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
275 combo->Append( wxU(_("Default")), (void *)NULL );
276 combo->SetSelection( 0 );
277 for( int i_index = 0; i_index < p_list->i_count; i_index++ )
279 p_parser = (module_t *)p_list->p_values[i_index].p_object ;
281 if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
283 combo->Append( wxU(p_parser->psz_longname),
284 p_parser->psz_object_name );
285 if( p_item->psz_value && !strcmp(p_item->psz_value,
286 p_parser->psz_object_name) )
287 combo->SetValue( wxU(p_parser->psz_longname) );
290 vlc_list_release( p_list );
292 combo->SetToolTip( wxU(p_item->psz_longtext) );
293 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
294 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
296 this->SetSizerAndFit( sizer );
299 ModuleCatConfigControl::~ModuleCatConfigControl()
304 wxString ModuleCatConfigControl::GetPszValue()
306 return wxU( (char *)combo->GetClientData( combo->GetSelection() ));
309 /*****************************************************************************
310 * ModuleCatConfigControl implementation
311 *****************************************************************************/
312 ModuleCatConfigControl::ModuleCatConfigControl( vlc_object_t *p_this,
313 module_config_t *p_item,
315 : ConfigControl( p_this, p_item, parent )
320 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
321 combo = new wxComboBox( this, -1, wxL2U(p_item->psz_value),
322 wxDefaultPosition, wxDefaultSize,
323 0, NULL, wxCB_READONLY | wxCB_SORT );
325 combo->Append( wxU(_("Default")), (void *)NULL );
326 combo->SetSelection( 0 );
328 /* build a list of available modules */
329 p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
330 for( int i_index = 0; i_index < p_list->i_count; i_index++ )
332 p_parser = (module_t *)p_list->p_values[i_index].p_object ;
334 if( !strcmp( p_parser->psz_object_name, "main" ) )
337 module_config_t *p_config = p_parser->p_config;
340 /* Hack: required subcategory is stored in i_min */
341 if( p_config->i_type == CONFIG_SUBCATEGORY &&
342 p_config->i_value == p_item->i_min )
344 combo->Append( wxU(p_parser->psz_longname),
345 p_parser->psz_object_name );
346 if( p_item->psz_value && !strcmp(p_item->psz_value,
347 p_parser->psz_object_name) )
348 combo->SetValue( wxU(p_parser->psz_longname) );
350 } while( p_config->i_type != CONFIG_HINT_END && p_config++ );
352 vlc_list_release( p_list );
354 combo->SetToolTip( wxU(p_item->psz_longtext) );
355 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
356 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
358 this->SetSizerAndFit( sizer );
361 ModuleConfigControl::~ModuleConfigControl()
366 wxString ModuleConfigControl::GetPszValue()
368 return wxU( (char *)combo->GetClientData( combo->GetSelection() ));
372 /*****************************************************************************
373 * ModuleListCatonfigControl implementation
374 *****************************************************************************/
375 BEGIN_EVENT_TABLE(ModuleListCatConfigControl, wxPanel)
376 EVT_CHECKBOX( wxID_HIGHEST , ModuleListCatConfigControl::OnUpdate )
380 ModuleListCatConfigControl::ModuleListCatConfigControl( vlc_object_t *p_this,
381 module_config_t *p_item,
383 : ConfigControl( p_this, p_item, parent )
389 sizer = new wxBoxSizer( wxVERTICAL );
390 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
393 text = new wxTextCtrl( this, -1, wxU(p_item->psz_value),
394 wxDefaultPosition,wxSize( 300, 20 ) );
397 /* build a list of available modules */
398 p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
399 for( int i_index = 0; i_index < p_list->i_count; i_index++ )
401 p_parser = (module_t *)p_list->p_values[i_index].p_object ;
403 if( !strcmp( p_parser->psz_object_name, "main" ) )
406 module_config_t *p_config = p_parser->p_config;
409 /* Hack: required subcategory is stored in i_min */
410 if( p_config->i_type == CONFIG_SUBCATEGORY &&
411 p_config->i_value == p_item->i_min )
413 moduleCheckBox *mc = new moduleCheckBox;
414 mc->checkbox = new wxCheckBox( this, wxID_HIGHEST,
415 wxU(p_parser->psz_longname));
416 mc->psz_module = strdup( p_parser->psz_object_name );
417 pp_checkboxes.push_back( mc );
419 if( p_item->psz_value &&
420 strstr( p_item->psz_value, p_parser->psz_object_name ) )
422 mc->checkbox->SetValue( true );
424 sizer->Add( mc->checkbox );
426 } while( p_config->i_type != CONFIG_HINT_END && p_config++ );
428 vlc_list_release( p_list );
430 text->SetToolTip( wxU(p_item->psz_longtext) );
431 sizer->Add(text, 0, wxEXPAND|wxALL, 5 );
433 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, 1 ) ) ) );
436 this->SetSizerAndFit( sizer );
439 ModuleListCatConfigControl::~ModuleListCatConfigControl()
444 wxString ModuleListCatConfigControl::GetPszValue()
446 return text->GetValue() ;
449 void ModuleListCatConfigControl::OnUpdate( wxCommandEvent &event )
451 bool b_waschecked = false;
452 wxString newtext = text->GetValue();
454 for( unsigned int i = 0 ; i< pp_checkboxes.size() ; i++ )
456 b_waschecked = newtext.Find( wxU(pp_checkboxes[i]->psz_module)) != -1 ;
457 /* For some reasons, ^^ doesn't compile :( */
458 if( (pp_checkboxes[i]->checkbox->IsChecked() && ! b_waschecked )||
459 (! pp_checkboxes[i]->checkbox->IsChecked() && b_waschecked) )
463 /* Maybe not the clest solution */
464 if( ! newtext.Replace(wxString(wxT(":"))
465 +wxU(pp_checkboxes[i]->psz_module),
468 if( ! newtext.Replace(wxString(wxU(pp_checkboxes[i]->psz_module))
471 newtext.Replace(wxU(pp_checkboxes[i]->psz_module),wxU(""));
477 if( newtext.Len() == 0 )
479 newtext = wxU(pp_checkboxes[i]->psz_module);
483 newtext += wxU( ":" );
484 newtext += wxU(pp_checkboxes[i]->psz_module);
489 text->SetValue( newtext );
492 /*****************************************************************************
493 * StringConfigControl implementation
494 *****************************************************************************/
495 StringConfigControl::StringConfigControl( vlc_object_t *p_this,
496 module_config_t *p_item,
498 : ConfigControl( p_this, p_item, parent )
500 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
501 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
502 textctrl = new wxTextCtrl( this, -1,
503 wxL2U(p_item->psz_value),
507 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
508 sizer->Add( textctrl, 1, wxALL, 5 );
510 this->SetSizerAndFit( sizer );
513 StringConfigControl::~StringConfigControl()
518 wxString StringConfigControl::GetPszValue()
520 return textctrl->GetValue();
523 BEGIN_EVENT_TABLE(StringConfigControl, wxPanel)
525 EVT_TEXT(-1, StringConfigControl::OnUpdate)
528 /*****************************************************************************
529 * StringListConfigControl implementation
530 *****************************************************************************/
531 StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
532 module_config_t *p_item,
534 : ConfigControl( p_this, p_item, parent )
536 psz_default_value = p_item->psz_value;
537 if( psz_default_value ) psz_default_value = strdup( psz_default_value );
539 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
540 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
541 combo = new wxComboBox( this, -1, wxT(""),
542 wxDefaultPosition, wxDefaultSize,
543 0, NULL, wxCB_READONLY );
544 UpdateCombo( p_item );
546 combo->SetToolTip( wxU(p_item->psz_longtext) );
547 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
549 for( int i = 0; i < p_item->i_action; i++ )
552 new wxButton( this, wxID_HIGHEST+i,
553 wxU(p_item->ppsz_action_text[i]) );
554 sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
558 this->SetSizerAndFit( sizer );
561 StringListConfigControl::~StringListConfigControl()
563 if( psz_default_value ) free( psz_default_value );
566 void StringListConfigControl::UpdateCombo( module_config_t *p_item )
568 vlc_bool_t b_found = VLC_FALSE;
571 /* build a list of available options */
572 for( i_index = 0; i_index < p_item->i_list; i_index++ )
574 combo->Append( ( p_item->ppsz_list_text &&
575 p_item->ppsz_list_text[i_index] ) ?
576 wxU(p_item->ppsz_list_text[i_index]) :
577 wxL2U(p_item->ppsz_list[i_index]) );
578 combo->SetClientData( i_index, (void *)p_item->ppsz_list[i_index] );
579 if( ( p_item->psz_value &&
580 !strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) ) ||
581 ( !p_item->psz_value && !*p_item->ppsz_list[i_index] ) )
583 combo->SetSelection( i_index );
584 combo->SetValue( ( p_item->ppsz_list_text &&
585 p_item->ppsz_list_text[i_index] ) ?
586 wxU(p_item->ppsz_list_text[i_index]) :
587 wxL2U(p_item->ppsz_list[i_index]) );
592 if( p_item->psz_value && !b_found )
594 /* Add custom entry to list */
595 combo->Append( wxL2U(p_item->psz_value) );
596 combo->SetClientData( i_index, (void *)psz_default_value );
597 combo->SetSelection( i_index );
598 combo->SetValue( wxL2U(p_item->psz_value) );
602 BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
604 EVT_BUTTON(-1, StringListConfigControl::OnAction)
607 EVT_TEXT(-1, StringListConfigControl::OnUpdate)
610 void StringListConfigControl::OnAction( wxCommandEvent& event )
612 int i_action = event.GetId() - wxID_HIGHEST;
614 module_config_t *p_item = config_FindConfig( p_this, GetName().mb_str() );
615 if( !p_item ) return;
617 if( i_action < 0 || i_action >= p_item->i_action ) return;
620 wxString value = GetPszValue();
621 *((const char **)&val.psz_string) = value.mb_str();
622 p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
624 if( p_item->b_dirty )
627 UpdateCombo( p_item );
628 p_item->b_dirty = VLC_FALSE;
632 wxString StringListConfigControl::GetPszValue()
634 int selected = combo->GetSelection();
637 return wxL2U((char *)combo->GetClientData( selected ));
642 /*****************************************************************************
643 * FileConfigControl implementation
644 *****************************************************************************/
645 FileConfigControl::FileConfigControl( vlc_object_t *p_this,
646 module_config_t *p_item,
648 : ConfigControl( p_this, p_item, parent )
650 directory = p_item->i_type == CONFIG_ITEM_DIRECTORY;
651 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
652 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
653 textctrl = new wxTextCtrl( this, -1,
654 wxL2U(p_item->psz_value),
658 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
659 sizer->Add( textctrl, 1, wxALL, 5 );
660 browse = new wxButton( this, wxID_HIGHEST, wxU(_("Browse...")) );
661 sizer->Add( browse, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
663 this->SetSizerAndFit( sizer );
666 BEGIN_EVENT_TABLE(FileConfigControl, wxPanel)
668 EVT_BUTTON(wxID_HIGHEST, FileConfigControl::OnBrowse)
671 void FileConfigControl::OnBrowse( wxCommandEvent& event )
675 wxDirDialog dialog( this, wxU(_("Choose directory")) );
677 if( dialog.ShowModal() == wxID_OK )
679 textctrl->SetValue( dialog.GetPath() );
684 wxFileDialog dialog( this, wxU(_("Choose file")),
685 wxT(""), wxT(""), wxT("*.*"),
686 #if defined( __WXMSW__ )
692 if( dialog.ShowModal() == wxID_OK )
694 textctrl->SetValue( dialog.GetPath() );
699 FileConfigControl::~FileConfigControl()
704 wxString FileConfigControl::GetPszValue()
706 return textctrl->GetValue();
709 /*****************************************************************************
710 * IntegerConfigControl implementation
711 *****************************************************************************/
712 BEGIN_EVENT_TABLE(IntegerConfigControl, wxPanel)
713 EVT_TEXT(-1, IntegerConfigControl::OnUpdate)
714 EVT_COMMAND_SCROLL(-1, IntegerConfigControl::OnUpdateScroll)
717 IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
718 module_config_t *p_item,
720 : ConfigControl( p_this, p_item, parent )
722 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
723 spin = new wxSpinCtrl( this, -1,
724 wxString::Format(wxT("%d"),
726 wxDefaultPosition, wxDefaultSize,
728 -100000000, 100000000, p_item->i_value);
729 spin->SetToolTip( wxU(p_item->psz_longtext) );
730 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
731 sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
733 this->SetSizerAndFit( sizer );
734 i_value = p_item->i_value;
737 IntegerConfigControl::~IntegerConfigControl()
742 int IntegerConfigControl::GetIntValue()
744 /* We avoid using GetValue because of a recursion bug with wxSpinCtrl with
746 return i_value; //spin->GetValue();
749 void IntegerConfigControl::OnUpdate( wxCommandEvent &event )
751 i_value = event.GetInt();
752 ConfigControl::OnUpdate( event );
754 void IntegerConfigControl::OnUpdateScroll( wxScrollEvent &event )
756 wxCommandEvent cevent;
757 cevent.SetInt(event.GetPosition());
761 /*****************************************************************************
762 * IntegerListConfigControl implementation
763 *****************************************************************************/
764 IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
765 module_config_t *p_item,
767 : ConfigControl( p_this, p_item, parent )
769 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
770 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
771 combo = new wxComboBox( this, -1, wxT(""),
772 wxDefaultPosition, wxDefaultSize,
773 0, NULL, wxCB_READONLY );
775 UpdateCombo( p_item );
777 combo->SetToolTip( wxU(p_item->psz_longtext) );
778 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
781 this->SetSizerAndFit( sizer );
784 IntegerListConfigControl::~IntegerListConfigControl()
788 void IntegerListConfigControl::UpdateCombo( module_config_t *p_item )
790 /* build a list of available options */
791 for( int i_index = 0; i_index < p_item->i_list; i_index++ )
793 if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
795 combo->Append( wxU(p_item->ppsz_list_text[i_index]) );
799 combo->Append( wxString::Format(wxT("%i"),
800 p_item->pi_list[i_index]) );
802 combo->SetClientData( i_index, (void *)p_item->pi_list[i_index] );
803 if( p_item->i_value == p_item->pi_list[i_index] )
805 combo->SetSelection( i_index );
806 if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
808 combo->SetValue( wxU(p_item->ppsz_list_text[i_index]) );
812 combo->SetValue( wxString::Format(wxT("%i"),
813 p_item->pi_list[i_index]) );
819 BEGIN_EVENT_TABLE(IntegerListConfigControl, wxPanel)
821 EVT_BUTTON(-1, IntegerListConfigControl::OnAction)
824 EVT_TEXT(-1, IntegerListConfigControl::OnUpdate)
827 void IntegerListConfigControl::OnAction( wxCommandEvent& event )
829 int i_action = event.GetId() - wxID_HIGHEST;
831 module_config_t *p_item;
832 p_item = config_FindConfig( p_this, GetName().mb_str() );
833 if( !p_item ) return;
835 if( i_action < 0 || i_action >= p_item->i_action ) return;
838 val.i_int = GetIntValue();
839 p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
841 if( p_item->b_dirty )
844 UpdateCombo( p_item );
845 p_item->b_dirty = VLC_FALSE;
849 int IntegerListConfigControl::GetIntValue()
851 int selected = combo->GetSelection();
854 return (int)combo->GetClientData( selected );
859 /*****************************************************************************
860 * RangedIntConfigControl implementation
861 *****************************************************************************/
862 BEGIN_EVENT_TABLE(RangedIntConfigControl, wxPanel)
863 EVT_COMMAND_SCROLL(-1, RangedIntConfigControl::OnUpdateScroll)
866 RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
867 module_config_t *p_item,
869 : ConfigControl( p_this, p_item, parent )
871 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
872 slider = new wxSlider( this, -1, p_item->i_value, p_item->i_min,
873 p_item->i_max, wxDefaultPosition, wxDefaultSize,
874 wxSL_LABELS | wxSL_HORIZONTAL );
875 slider->SetToolTip( wxU(p_item->psz_longtext) );
876 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
877 sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
879 this->SetSizerAndFit( sizer );
882 RangedIntConfigControl::~RangedIntConfigControl()
887 int RangedIntConfigControl::GetIntValue()
889 return slider->GetValue();
893 /*****************************************************************************
894 * FloatConfigControl implementation
895 *****************************************************************************/
896 BEGIN_EVENT_TABLE(FloatConfigControl, wxPanel)
897 EVT_TEXT(-1, FloatConfigControl::OnUpdate)
900 FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
901 module_config_t *p_item,
903 : ConfigControl( p_this, p_item, parent )
905 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
906 textctrl = new wxTextCtrl( this, -1,
907 wxString::Format(wxT("%f"),
909 wxDefaultPosition, wxDefaultSize,
910 wxTE_PROCESS_ENTER );
911 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
912 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
913 sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
915 this->SetSizerAndFit( sizer );
918 FloatConfigControl::~FloatConfigControl()
923 float FloatConfigControl::GetFloatValue()
926 if( (wxSscanf(textctrl->GetValue(), wxT("%f"), &f_value) == 1) )
931 /*****************************************************************************
932 * BoolConfigControl implementation
933 *****************************************************************************/
934 BEGIN_EVENT_TABLE(BoolConfigControl, wxPanel)
935 EVT_CHECKBOX(-1, BoolConfigControl::OnUpdate)
938 BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
939 module_config_t *p_item,
941 : ConfigControl( p_this, p_item, parent )
943 checkbox = new wxCheckBox( this, -1, wxU(p_item->psz_text) );
944 if( p_item->i_value ) checkbox->SetValue(TRUE);
945 checkbox->SetToolTip( wxU(p_item->psz_longtext) );
946 sizer->Add( checkbox, 0, wxALL, 5 );
948 this->SetSizerAndFit( sizer );
951 BoolConfigControl::~BoolConfigControl()
956 int BoolConfigControl::GetIntValue()
958 if( checkbox->IsChecked() ) return 1;
962 /*****************************************************************************
963 * SectionConfigControl implementation
964 *****************************************************************************/
965 SectionConfigControl::SectionConfigControl( vlc_object_t *p_this,
966 module_config_t *p_item,
968 : ConfigControl( p_this, p_item, parent )
971 sizer = new wxBoxSizer( wxVERTICAL );
972 sizer->Add( new wxStaticText( this, -1, wxU( p_item->psz_text ) ) );
973 sizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND, 5 );
975 this->SetSizerAndFit( sizer );
978 SectionConfigControl::~SectionConfigControl()