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;
407 if( p_parser->b_submodule )
408 p_config = ((module_t*)p_parser->p_parent)->p_config;
410 p_config = p_parser->p_config;
414 /* Hack: required subcategory is stored in i_min */
415 if( p_config->i_type == CONFIG_SUBCATEGORY &&
416 p_config->i_value == p_item->i_min )
418 moduleCheckBox *mc = new moduleCheckBox;
419 mc->checkbox = new wxCheckBox( this, wxID_HIGHEST,
420 wxU(p_parser->psz_longname));
421 /* hack to handle submodules properly */
423 while( p_parser->pp_shortcuts[++i] != NULL );
425 mc->psz_module = strdup( i>=0?p_parser->pp_shortcuts[i]
426 :p_parser->psz_object_name );
427 pp_checkboxes.push_back( mc );
429 if( p_item->psz_value &&
430 strstr( p_item->psz_value, mc->psz_module ) )
432 mc->checkbox->SetValue( true );
434 sizer->Add( mc->checkbox );
436 } while( p_config->i_type != CONFIG_HINT_END && p_config++ );
438 vlc_list_release( p_list );
440 text->SetToolTip( wxU(p_item->psz_longtext) );
441 sizer->Add(text, 0, wxEXPAND|wxALL, 5 );
443 sizer->Add (new wxStaticText( this, -1, wxU( vlc_wraptext( _("Select "
444 "the desired modules. For more advanced control, the "
445 "resulting \"chain\" can be modified.") , 72 ) ) ) );
448 this->SetSizerAndFit( sizer );
451 ModuleListCatConfigControl::~ModuleListCatConfigControl()
456 wxString ModuleListCatConfigControl::GetPszValue()
458 return text->GetValue() ;
461 void ModuleListCatConfigControl::OnUpdate( wxCommandEvent &event )
463 bool b_waschecked = false;
464 wxString newtext = text->GetValue();
466 for( unsigned int i = 0 ; i< pp_checkboxes.size() ; i++ )
468 b_waschecked = newtext.Find( wxT(":")+wxU(pp_checkboxes[i]->psz_module)+wxT(":")) != -1 || newtext.BeforeFirst( ':' ) == wxString(wxU(pp_checkboxes[i]->psz_module)) || newtext.AfterLast( ':' ) == wxString(wxU(pp_checkboxes[i]->psz_module));
469 /* For some reasons, ^^ doesn't compile :( */
470 if( (pp_checkboxes[i]->checkbox->IsChecked() && ! b_waschecked )||
471 (! pp_checkboxes[i]->checkbox->IsChecked() && b_waschecked) )
475 /* Maybe not the clest solution */
476 if( ! newtext.Replace(wxString(wxT(":"))
477 +wxU(pp_checkboxes[i]->psz_module)+wxT(":"),
480 if( newtext.BeforeFirst( ':' ) == wxString(wxU(pp_checkboxes[i]->psz_module)) )
482 newtext = newtext.AfterFirst( ':' );
484 else if( newtext.AfterLast( ':' ) == wxString(wxU(pp_checkboxes[i]->psz_module)) )
486 newtext = newtext.BeforeLast( ':' );
488 else if( newtext == wxString(wxU(pp_checkboxes[i]->psz_module)) )
494 newtext.Replace(wxU(pp_checkboxes[i]->psz_module),wxU(""));
500 if( newtext.Len() == 0 )
502 newtext = wxU(pp_checkboxes[i]->psz_module);
506 newtext += wxU( ":" );
507 newtext += wxU(pp_checkboxes[i]->psz_module);
512 text->SetValue( newtext );
515 /*****************************************************************************
516 * StringConfigControl implementation
517 *****************************************************************************/
518 StringConfigControl::StringConfigControl( vlc_object_t *p_this,
519 module_config_t *p_item,
521 : ConfigControl( p_this, p_item, parent )
523 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
524 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
525 textctrl = new wxTextCtrl( this, -1,
526 wxL2U(p_item->psz_value),
530 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
531 sizer->Add( textctrl, 1, wxALL, 5 );
533 this->SetSizerAndFit( sizer );
536 StringConfigControl::~StringConfigControl()
541 wxString StringConfigControl::GetPszValue()
543 return textctrl->GetValue();
546 BEGIN_EVENT_TABLE(StringConfigControl, wxPanel)
548 EVT_TEXT(-1, StringConfigControl::OnUpdate)
551 /*****************************************************************************
552 * StringListConfigControl implementation
553 *****************************************************************************/
554 StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
555 module_config_t *p_item,
557 : ConfigControl( p_this, p_item, parent )
559 psz_default_value = p_item->psz_value;
560 if( psz_default_value ) psz_default_value = strdup( psz_default_value );
562 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
563 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
564 combo = new wxComboBox( this, -1, wxT(""),
565 wxDefaultPosition, wxDefaultSize,
566 0, NULL, wxCB_READONLY );
567 UpdateCombo( p_item );
569 combo->SetToolTip( wxU(p_item->psz_longtext) );
570 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
572 for( int i = 0; i < p_item->i_action; i++ )
575 new wxButton( this, wxID_HIGHEST+i,
576 wxU(_(p_item->ppsz_action_text[i])) );
577 sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
581 this->SetSizerAndFit( sizer );
584 StringListConfigControl::~StringListConfigControl()
586 if( psz_default_value ) free( psz_default_value );
589 void StringListConfigControl::UpdateCombo( module_config_t *p_item )
591 vlc_bool_t b_found = VLC_FALSE;
594 /* build a list of available options */
595 for( i_index = 0; i_index < p_item->i_list; i_index++ )
597 combo->Append( ( p_item->ppsz_list_text &&
598 p_item->ppsz_list_text[i_index] ) ?
599 wxU(p_item->ppsz_list_text[i_index]) :
600 wxL2U(p_item->ppsz_list[i_index]) );
601 combo->SetClientData( i_index, (void *)p_item->ppsz_list[i_index] );
602 if( ( p_item->psz_value &&
603 !strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) ) ||
604 ( !p_item->psz_value && !*p_item->ppsz_list[i_index] ) )
606 combo->SetSelection( i_index );
607 combo->SetValue( ( p_item->ppsz_list_text &&
608 p_item->ppsz_list_text[i_index] ) ?
609 wxU(p_item->ppsz_list_text[i_index]) :
610 wxL2U(p_item->ppsz_list[i_index]) );
615 if( p_item->psz_value && !b_found )
617 /* Add custom entry to list */
618 combo->Append( wxL2U(p_item->psz_value) );
619 combo->SetClientData( i_index, (void *)psz_default_value );
620 combo->SetSelection( i_index );
621 combo->SetValue( wxL2U(p_item->psz_value) );
625 BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
627 EVT_BUTTON(-1, StringListConfigControl::OnAction)
630 EVT_TEXT(-1, StringListConfigControl::OnUpdate)
633 void StringListConfigControl::OnAction( wxCommandEvent& event )
635 int i_action = event.GetId() - wxID_HIGHEST;
637 module_config_t *p_item = config_FindConfig( p_this, GetName().mb_str() );
638 if( !p_item ) return;
640 if( i_action < 0 || i_action >= p_item->i_action ) return;
643 wxString value = GetPszValue();
644 *((const char **)&val.psz_string) = value.mb_str();
645 p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
647 if( p_item->b_dirty )
650 UpdateCombo( p_item );
651 p_item->b_dirty = VLC_FALSE;
655 wxString StringListConfigControl::GetPszValue()
657 int selected = combo->GetSelection();
660 return wxL2U((char *)combo->GetClientData( selected ));
665 /*****************************************************************************
666 * FileConfigControl implementation
667 *****************************************************************************/
668 FileConfigControl::FileConfigControl( vlc_object_t *p_this,
669 module_config_t *p_item,
671 : ConfigControl( p_this, p_item, parent )
673 directory = p_item->i_type == CONFIG_ITEM_DIRECTORY;
674 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
675 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
676 textctrl = new wxTextCtrl( this, -1,
677 wxL2U(p_item->psz_value),
681 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
682 sizer->Add( textctrl, 1, wxALL, 5 );
683 browse = new wxButton( this, wxID_HIGHEST, wxU(_("Browse...")) );
684 sizer->Add( browse, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
686 this->SetSizerAndFit( sizer );
689 BEGIN_EVENT_TABLE(FileConfigControl, wxPanel)
691 EVT_BUTTON(wxID_HIGHEST, FileConfigControl::OnBrowse)
694 void FileConfigControl::OnBrowse( wxCommandEvent& event )
698 wxDirDialog dialog( this, wxU(_("Choose directory")) );
700 if( dialog.ShowModal() == wxID_OK )
702 textctrl->SetValue( dialog.GetPath() );
707 wxFileDialog dialog( this, wxU(_("Choose file")),
708 wxT(""), wxT(""), wxT("*.*"),
709 #if defined( __WXMSW__ )
715 if( dialog.ShowModal() == wxID_OK )
717 textctrl->SetValue( dialog.GetPath() );
722 FileConfigControl::~FileConfigControl()
727 wxString FileConfigControl::GetPszValue()
729 return textctrl->GetValue();
732 /*****************************************************************************
733 * IntegerConfigControl implementation
734 *****************************************************************************/
735 BEGIN_EVENT_TABLE(IntegerConfigControl, wxPanel)
736 EVT_TEXT(-1, IntegerConfigControl::OnUpdate)
737 EVT_COMMAND_SCROLL(-1, IntegerConfigControl::OnUpdateScroll)
740 IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
741 module_config_t *p_item,
743 : ConfigControl( p_this, p_item, parent )
745 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
746 spin = new wxSpinCtrl( this, -1,
747 wxString::Format(wxT("%d"),
749 wxDefaultPosition, wxDefaultSize,
751 -100000000, 100000000, p_item->i_value);
752 spin->SetToolTip( wxU(p_item->psz_longtext) );
753 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
754 sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
756 this->SetSizerAndFit( sizer );
757 i_value = p_item->i_value;
760 IntegerConfigControl::~IntegerConfigControl()
765 int IntegerConfigControl::GetIntValue()
767 /* We avoid using GetValue because of a recursion bug with wxSpinCtrl with
769 return spin->GetValue();
772 void IntegerConfigControl::OnUpdate( wxCommandEvent &event )
774 ConfigControl::OnUpdate( event );
776 void IntegerConfigControl::OnUpdateScroll( wxScrollEvent &event )
778 wxCommandEvent cevent;
779 cevent.SetInt(event.GetPosition());
783 /*****************************************************************************
784 * IntegerListConfigControl implementation
785 *****************************************************************************/
786 IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
787 module_config_t *p_item,
789 : ConfigControl( p_this, p_item, parent )
791 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
792 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
793 combo = new wxComboBox( this, -1, wxT(""),
794 wxDefaultPosition, wxDefaultSize,
795 0, NULL, wxCB_READONLY );
797 UpdateCombo( p_item );
799 combo->SetToolTip( wxU(p_item->psz_longtext) );
800 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
803 this->SetSizerAndFit( sizer );
806 IntegerListConfigControl::~IntegerListConfigControl()
810 void IntegerListConfigControl::UpdateCombo( module_config_t *p_item )
812 /* build a list of available options */
813 for( int i_index = 0; i_index < p_item->i_list; i_index++ )
815 if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
817 combo->Append( wxU(p_item->ppsz_list_text[i_index]) );
821 combo->Append( wxString::Format(wxT("%i"),
822 p_item->pi_list[i_index]) );
824 combo->SetClientData( i_index, (void *)p_item->pi_list[i_index] );
825 if( p_item->i_value == p_item->pi_list[i_index] )
827 combo->SetSelection( i_index );
828 if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
830 combo->SetValue( wxU(p_item->ppsz_list_text[i_index]) );
834 combo->SetValue( wxString::Format(wxT("%i"),
835 p_item->pi_list[i_index]) );
841 BEGIN_EVENT_TABLE(IntegerListConfigControl, wxPanel)
843 EVT_BUTTON(-1, IntegerListConfigControl::OnAction)
846 EVT_TEXT(-1, IntegerListConfigControl::OnUpdate)
849 void IntegerListConfigControl::OnAction( wxCommandEvent& event )
851 int i_action = event.GetId() - wxID_HIGHEST;
853 module_config_t *p_item;
854 p_item = config_FindConfig( p_this, GetName().mb_str() );
855 if( !p_item ) return;
857 if( i_action < 0 || i_action >= p_item->i_action ) return;
860 val.i_int = GetIntValue();
861 p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
863 if( p_item->b_dirty )
866 UpdateCombo( p_item );
867 p_item->b_dirty = VLC_FALSE;
871 int IntegerListConfigControl::GetIntValue()
873 int selected = combo->GetSelection();
876 return (int)combo->GetClientData( selected );
881 /*****************************************************************************
882 * RangedIntConfigControl implementation
883 *****************************************************************************/
884 BEGIN_EVENT_TABLE(RangedIntConfigControl, wxPanel)
885 EVT_COMMAND_SCROLL(-1, RangedIntConfigControl::OnUpdateScroll)
888 RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
889 module_config_t *p_item,
891 : ConfigControl( p_this, p_item, parent )
893 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
894 slider = new wxSlider( this, -1, p_item->i_value, p_item->i_min,
895 p_item->i_max, wxDefaultPosition, wxDefaultSize,
896 wxSL_LABELS | wxSL_HORIZONTAL );
897 slider->SetToolTip( wxU(p_item->psz_longtext) );
898 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
899 sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
901 this->SetSizerAndFit( sizer );
904 RangedIntConfigControl::~RangedIntConfigControl()
909 int RangedIntConfigControl::GetIntValue()
911 return slider->GetValue();
915 /*****************************************************************************
916 * FloatConfigControl implementation
917 *****************************************************************************/
918 BEGIN_EVENT_TABLE(FloatConfigControl, wxPanel)
919 EVT_TEXT(-1, FloatConfigControl::OnUpdate)
922 FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
923 module_config_t *p_item,
925 : ConfigControl( p_this, p_item, parent )
927 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
928 textctrl = new wxTextCtrl( this, -1,
929 wxString::Format(wxT("%f"),
931 wxDefaultPosition, wxDefaultSize,
932 wxTE_PROCESS_ENTER );
933 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
934 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
935 sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
937 this->SetSizerAndFit( sizer );
940 FloatConfigControl::~FloatConfigControl()
945 float FloatConfigControl::GetFloatValue()
948 if( (wxSscanf(textctrl->GetValue(), wxT("%f"), &f_value) == 1) )
953 /*****************************************************************************
954 * BoolConfigControl implementation
955 *****************************************************************************/
956 BEGIN_EVENT_TABLE(BoolConfigControl, wxPanel)
957 EVT_CHECKBOX(-1, BoolConfigControl::OnUpdate)
960 BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
961 module_config_t *p_item,
963 : ConfigControl( p_this, p_item, parent )
965 checkbox = new wxCheckBox( this, -1, wxU(p_item->psz_text) );
966 if( p_item->i_value ) checkbox->SetValue(TRUE);
967 checkbox->SetToolTip( wxU(p_item->psz_longtext) );
968 sizer->Add( checkbox, 0, wxALL, 5 );
970 this->SetSizerAndFit( sizer );
973 BoolConfigControl::~BoolConfigControl()
978 int BoolConfigControl::GetIntValue()
980 if( checkbox->IsChecked() ) return 1;
984 /*****************************************************************************
985 * SectionConfigControl implementation
986 *****************************************************************************/
987 SectionConfigControl::SectionConfigControl( vlc_object_t *p_this,
988 module_config_t *p_item,
990 : ConfigControl( p_this, p_item, parent )
993 sizer = new wxBoxSizer( wxVERTICAL );
994 sizer->Add( new wxStaticText( this, -1, wxU( p_item->psz_text ) ) );
995 sizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND, 5 );
997 this->SetSizerAndFit( sizer );
1000 SectionConfigControl::~SectionConfigControl()