]> git.sesse.net Git - vlc/blob - modules/gui/wxwindows/preferences_widgets.cpp
* modules/gui/wxwindows/*: use our new wxL2U() macro where needed.
[vlc] / modules / gui / wxwindows / preferences_widgets.cpp
1 /*****************************************************************************
2  * preferences_widgets.cpp : wxWindows plugin for vlc
3  *****************************************************************************
4  * Copyright (C) 2000-2001 VideoLAN
5  * $Id: preferences_widgets.cpp,v 1.18 2003/12/22 15:42:44 gbazin Exp $
6  *
7  * Authors: Gildas Bazin <gbazin@netcourrier.com>
8  *          Sigmund Augdal <sigmunau@idi.ntnu.no>
9  *
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.
14  *
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.
19  *
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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28 #include <stdlib.h>                                      /* malloc(), free() */
29 #include <errno.h>                                                 /* ENOMEM */
30 #include <string.h>                                            /* strerror() */
31 #include <stdio.h>
32
33 #include <vlc/vlc.h>
34 #include <vlc/intf.h>
35
36 #include <vlc_help.h>
37
38 #include "wxwindows.h"
39 #include "preferences_widgets.h"
40
41 /*****************************************************************************
42  * CreateConfigControl wrapper
43  *****************************************************************************/
44 ConfigControl *CreateConfigControl( vlc_object_t *p_this,
45                                     module_config_t *p_item, wxWindow *parent )
46 {
47     ConfigControl *p_control = NULL;
48
49     switch( p_item->i_type )
50     {
51     case CONFIG_ITEM_MODULE:
52         p_control = new ModuleConfigControl( p_this, p_item, parent );
53         break;
54
55     case CONFIG_ITEM_STRING:
56         if( !p_item->i_list )
57         {
58             p_control = new StringConfigControl( p_this, p_item, parent );
59         }
60         else
61         {
62             p_control = new StringListConfigControl( p_this, p_item, parent );
63         }
64         break;
65
66     case CONFIG_ITEM_FILE:
67     case CONFIG_ITEM_DIRECTORY:
68         p_control = new FileConfigControl( p_this, p_item, parent );
69         break;
70
71     case CONFIG_ITEM_INTEGER:
72         if( p_item->i_list )
73         {
74             p_control = new IntegerListConfigControl( p_this, p_item, parent );
75         }
76         else if( p_item->i_min != 0 || p_item->i_max != 0 )
77         {
78             p_control = new RangedIntConfigControl( p_this, p_item, parent );
79         }
80         else
81         {
82             p_control = new IntegerConfigControl( p_this, p_item, parent );
83         }
84         break;
85
86     case CONFIG_ITEM_KEY:
87         p_control = new KeyConfigControl( p_this, p_item, parent );
88         break;
89
90     case CONFIG_ITEM_FLOAT:
91         p_control = new FloatConfigControl( p_this, p_item, parent );
92         break;
93
94     case CONFIG_ITEM_BOOL:
95         p_control = new BoolConfigControl( p_this, p_item, parent );
96         break;
97
98     default:
99         break;
100     }
101
102     return p_control;
103 }
104
105 /*****************************************************************************
106  * ConfigControl implementation
107  *****************************************************************************/
108 ConfigControl::ConfigControl( vlc_object_t *_p_this,
109                               module_config_t *p_item, wxWindow *parent )
110   : wxPanel( parent ), p_this( _p_this ),
111     pf_update_callback( NULL ), p_update_data( NULL ),
112     name( wxU(p_item->psz_name) ), i_type( p_item->i_type ),
113     b_advanced( p_item->b_advanced )
114
115 {
116     sizer = new wxBoxSizer( wxHORIZONTAL );
117 }
118
119 ConfigControl::~ConfigControl()
120 {
121 }
122
123 wxSizer *ConfigControl::Sizer()
124 {
125     return sizer;
126 }
127
128 wxString ConfigControl::GetName()
129 {
130     return name;
131 }
132
133 int ConfigControl::GetType()
134 {
135     return i_type;
136 }
137
138 vlc_bool_t ConfigControl::IsAdvanced()
139 {
140     return b_advanced;
141 }
142
143 void ConfigControl::SetUpdateCallback( void (*p_callback)( void * ),
144                                              void *p_data )
145 {
146     pf_update_callback = p_callback;
147     p_update_data = p_data;
148 }
149
150 void ConfigControl::OnUpdate( wxCommandEvent& WXUNUSED(event) )
151 {
152     if( pf_update_callback )
153     {
154         pf_update_callback( p_update_data );
155     }
156 }
157
158 /*****************************************************************************
159  * KeyConfigControl implementation
160  *****************************************************************************/
161 static wxString KeysList[] =
162 {
163     wxT("Unset"),
164     wxT("Left"),
165     wxT("Right"),
166     wxT("Up"),
167     wxT("Down"),
168     wxT("Space"),
169     wxT("Enter"),
170     wxT("F1"),
171     wxT("F2"),
172     wxT("F3"),
173     wxT("F4"),
174     wxT("F5"),
175     wxT("F6"),
176     wxT("F7"),
177     wxT("F8"),
178     wxT("F9"),
179     wxT("F10"),
180     wxT("F11"),
181     wxT("F12"),
182     wxT("Home"),
183     wxT("End"),
184     wxT("Menu"),
185     wxT("Esc"),
186     wxT("Page Up"),
187     wxT("Page Down"),
188     wxT("Tab"),
189     wxT("Backspace"),
190     wxT("a"),
191     wxT("b"),
192     wxT("c"),
193     wxT("d"),
194     wxT("e"),
195     wxT("f"),
196     wxT("g"),
197     wxT("h"),
198     wxT("i"),
199     wxT("j"),
200     wxT("k"),
201     wxT("l"),
202     wxT("m"),
203     wxT("n"),
204     wxT("o"),
205     wxT("p"),
206     wxT("q"),
207     wxT("r"),
208     wxT("s"),
209     wxT("t"),
210     wxT("u"),
211     wxT("v"),
212     wxT("w"),
213     wxT("x"),
214     wxT("y"),
215     wxT("z"),
216     wxT("+"),
217     wxT("="),
218     wxT("-"),
219     wxT(","),
220     wxT("."),
221     wxT("<"),
222     wxT(">"),
223     wxT("`"),
224     wxT("/"),
225     wxT(";"),
226     wxT("'"),
227     wxT("\\"),
228     wxT("["),
229     wxT("]"),
230     wxT("*")
231 };
232
233 KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
234                                     module_config_t *p_item, wxWindow *parent )
235   : ConfigControl( p_this, p_item, parent )
236 {
237     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
238     alt = new wxCheckBox( this, -1, wxU(_("Alt")) );
239     alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
240     ctrl = new wxCheckBox( this, -1, wxU(_("Ctrl")) );
241     ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL );
242     shift = new wxCheckBox( this, -1, wxU(_("Shift")) );
243     shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
244     combo = new wxComboBox( this, -1, wxT(""), wxDefaultPosition,
245                             wxDefaultSize, WXSIZEOF(KeysList), KeysList,
246                             wxCB_READONLY );
247     for( unsigned int i = 0; i < WXSIZEOF(KeysList); i++ )
248     {
249         combo->SetClientData( i, (void*)vlc_keys[i].i_key_code );
250         if( (unsigned int)vlc_keys[i].i_key_code ==
251             ( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) )
252         {
253             combo->SetSelection( i );
254             combo->SetValue( wxU(_(vlc_keys[i].psz_key_string)) );
255         }
256     }
257
258     sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
259     sizer->Add( alt,   1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
260     sizer->Add( ctrl,  1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
261     sizer->Add( shift, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
262     sizer->Add( combo, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
263     sizer->Layout();
264     this->SetSizerAndFit( sizer );
265 }
266
267 KeyConfigControl::~KeyConfigControl()
268 {
269     ;
270 }
271
272 int KeyConfigControl::GetIntValue()
273 {
274     int result = 0;
275     if( alt->IsChecked() )
276     {
277         result |= KEY_MODIFIER_ALT;
278     }
279     if( ctrl->IsChecked() )
280     {
281         result |= KEY_MODIFIER_CTRL;
282     }
283     if( shift->IsChecked() )
284     {
285         result |= KEY_MODIFIER_SHIFT;
286     }
287     int selected = combo->GetSelection();
288     if( selected != -1 )
289     {
290         result |= (int)combo->GetClientData( selected );
291     }
292     return result;
293 }
294
295 /*****************************************************************************
296  * ModuleConfigControl implementation
297  *****************************************************************************/
298 ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
299                                           module_config_t *p_item,
300                                           wxWindow *parent )
301   : ConfigControl( p_this, p_item, parent )
302 {
303     vlc_list_t *p_list;
304     module_t *p_parser;
305
306     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
307     combo = new wxComboBox( this, -1, wxL2U(p_item->psz_value),
308                             wxDefaultPosition, wxDefaultSize,
309                             0, NULL, wxCB_READONLY | wxCB_SORT );
310
311     /* build a list of available modules */
312     p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
313     combo->Append( wxU(_("Default")), (void *)NULL );
314     combo->SetSelection( 0 );
315     for( int i_index = 0; i_index < p_list->i_count; i_index++ )
316     {
317         p_parser = (module_t *)p_list->p_values[i_index].p_object ;
318
319         if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
320         {
321             combo->Append( wxU(p_parser->psz_longname),
322                            p_parser->psz_object_name );
323             if( p_item->psz_value && !strcmp(p_item->psz_value,
324                                              p_parser->psz_object_name) )
325                 combo->SetValue( wxU(p_parser->psz_longname) );
326         }
327     }
328     vlc_list_release( p_list );
329
330     combo->SetToolTip( wxU(p_item->psz_longtext) );
331     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
332     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
333     sizer->Layout();
334     this->SetSizerAndFit( sizer );
335 }
336
337 ModuleConfigControl::~ModuleConfigControl()
338 {
339     ;
340 }
341
342 wxString ModuleConfigControl::GetPszValue()
343 {
344     return wxU( (char *)combo->GetClientData( combo->GetSelection() ));
345 }
346
347 /*****************************************************************************
348  * StringConfigControl implementation
349  *****************************************************************************/
350 StringConfigControl::StringConfigControl( vlc_object_t *p_this,
351                                           module_config_t *p_item,
352                                           wxWindow *parent )
353   : ConfigControl( p_this, p_item, parent )
354 {
355     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
356     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
357     textctrl = new wxTextCtrl( this, -1,
358                                wxL2U(p_item->psz_value),
359                                wxDefaultPosition,
360                                wxDefaultSize,
361                                wxTE_PROCESS_ENTER);
362     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
363     sizer->Add( textctrl, 1, wxALL, 5 );
364     sizer->Layout();
365     this->SetSizerAndFit( sizer );
366 }
367
368 StringConfigControl::~StringConfigControl()
369 {
370     ;
371 }
372
373 wxString StringConfigControl::GetPszValue()
374 {
375     return textctrl->GetValue();
376 }
377
378 BEGIN_EVENT_TABLE(StringConfigControl, wxPanel)
379     /* Text events */
380     EVT_TEXT(-1, StringConfigControl::OnUpdate)
381 END_EVENT_TABLE()
382
383 /*****************************************************************************
384  * StringListConfigControl implementation
385  *****************************************************************************/
386 StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
387                                                   module_config_t *p_item,
388                                                   wxWindow *parent )
389   : ConfigControl( p_this, p_item, parent ), psz_name( NULL )
390 {
391     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
392     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
393     combo = new wxComboBox( this, -1, wxT(""),
394                             wxDefaultPosition, wxDefaultSize,
395                             0, NULL, wxCB_READONLY );
396     UpdateCombo( p_item );
397
398     combo->SetToolTip( wxU(p_item->psz_longtext) );
399     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
400
401     if( p_item->pf_list_update )
402     {
403         wxButton *refresh =
404             new wxButton( this, wxID_HIGHEST, wxU(_("Refresh")) );
405         sizer->Add( refresh, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
406
407         psz_name = strdup( p_item->psz_name );
408         pf_list_update = p_item->pf_list_update;
409     }
410
411     sizer->Layout();
412     this->SetSizerAndFit( sizer );
413 }
414
415 StringListConfigControl::~StringListConfigControl()
416 {
417     if( psz_name ) free( psz_name );
418 }
419
420 void StringListConfigControl::UpdateCombo( module_config_t *p_item )
421 {
422     /* build a list of available options */
423     for( int i_index = 0; i_index < p_item->i_list; i_index++ )
424     {
425         combo->Append( ( p_item->ppsz_list_text &&
426                          p_item->ppsz_list_text[i_index] ) ?
427                        wxU(p_item->ppsz_list_text[i_index]) :
428                        wxL2U(p_item->ppsz_list[i_index]) );
429         combo->SetClientData( i_index, (void *)p_item->ppsz_list[i_index] );
430         if( ( p_item->psz_value &&
431               !strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) ) ||
432              ( !p_item->psz_value && !*p_item->ppsz_list[i_index] ) )
433         {
434             combo->SetSelection( i_index );
435             combo->SetValue( ( p_item->ppsz_list_text &&
436                                p_item->ppsz_list_text[i_index] ) ?
437                              wxU(p_item->ppsz_list_text[i_index]) :
438                              wxL2U(p_item->ppsz_list[i_index]) );
439         }
440     }
441 }
442
443 BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
444     /* Button events */
445     EVT_BUTTON(wxID_HIGHEST, StringListConfigControl::OnRefresh)
446
447     /* Text events */
448     EVT_TEXT(-1, StringListConfigControl::OnUpdate)
449 END_EVENT_TABLE()
450
451 void StringListConfigControl::OnRefresh( wxCommandEvent& event )
452 {
453     if( pf_list_update )
454     {
455         vlc_value_t val;
456         module_config_t *p_item;
457
458         pf_list_update( p_this, psz_name, val, val, 0 );
459         p_item = config_FindConfig( p_this, psz_name );
460
461         combo->Clear();
462         UpdateCombo( p_item );
463     }
464 }
465
466 wxString StringListConfigControl::GetPszValue()
467 {
468     int selected = combo->GetSelection();
469     if( selected != -1 )
470     {
471         return wxU((char *)combo->GetClientData( selected ));
472     }
473     return wxString();
474 }
475
476 /*****************************************************************************
477  * FileConfigControl implementation
478  *****************************************************************************/
479 FileConfigControl::FileConfigControl( vlc_object_t *p_this,
480                                       module_config_t *p_item,
481                                       wxWindow *parent )
482   : ConfigControl( p_this, p_item, parent )
483 {
484     directory = p_item->i_type == CONFIG_ITEM_DIRECTORY;
485     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
486     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
487     textctrl = new wxTextCtrl( this, -1,
488                                wxL2U(p_item->psz_value),
489                                wxDefaultPosition,
490                                wxDefaultSize,
491                                wxTE_PROCESS_ENTER);
492     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
493     sizer->Add( textctrl, 1, wxALL, 5 );
494     browse = new wxButton( this, wxID_HIGHEST, wxU(_("Browse...")) );
495     sizer->Add( browse, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
496     sizer->Layout();
497     this->SetSizerAndFit( sizer );
498 }
499
500 BEGIN_EVENT_TABLE(FileConfigControl, wxPanel)
501     /* Button events */
502     EVT_BUTTON(wxID_HIGHEST, FileConfigControl::OnBrowse)
503 END_EVENT_TABLE()
504
505 void FileConfigControl::OnBrowse( wxCommandEvent& event )
506 {
507     if( directory )
508     {
509         wxDirDialog dialog( this, wxU(_("Choose directory")) );
510
511         if( dialog.ShowModal() == wxID_OK )
512         {
513             textctrl->SetValue( dialog.GetPath() );
514         }
515     }
516     else
517     {
518         wxFileDialog dialog( this, wxU(_("Choose file")),
519                              wxT(""), wxT(""), wxT("*.*"),
520 #if defined( __WXMSW__ )
521                              wxOPEN
522 #else
523                              wxOPEN | wxSAVE
524 #endif
525                            );
526     }
527 }
528
529 FileConfigControl::~FileConfigControl()
530 {
531     ;
532 }
533
534 wxString FileConfigControl::GetPszValue()
535 {
536     return textctrl->GetValue();
537 }
538
539 /*****************************************************************************
540  * IntegerConfigControl implementation
541  *****************************************************************************/
542 IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
543                                             module_config_t *p_item,
544                                             wxWindow *parent )
545   : ConfigControl( p_this, p_item, parent )
546 {
547     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
548     spin = new wxSpinCtrl( this, -1,
549                            wxString::Format(wxT("%d"),
550                                             p_item->i_value),
551                            wxDefaultPosition, wxDefaultSize,
552                            wxSP_ARROW_KEYS,
553                            -16000, 16000, p_item->i_value);
554     spin->SetToolTip( wxU(p_item->psz_longtext) );
555     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
556     sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
557     sizer->Layout();
558     this->SetSizerAndFit( sizer );
559 }
560
561 IntegerConfigControl::~IntegerConfigControl()
562 {
563     ;
564 }
565
566 int IntegerConfigControl::GetIntValue()
567 {
568     return spin->GetValue();
569 }
570
571 /*****************************************************************************
572  * IntegerListConfigControl implementation
573  *****************************************************************************/
574 IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
575                                                     module_config_t *p_item,
576                                                     wxWindow *parent )
577   : ConfigControl( p_this, p_item, parent ), psz_name( NULL )
578 {
579     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
580     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
581     combo = new wxComboBox( this, -1, wxT(""),
582                             wxDefaultPosition, wxDefaultSize,
583                             0, NULL, wxCB_READONLY );
584
585     UpdateCombo( p_item );
586
587     combo->SetToolTip( wxU(p_item->psz_longtext) );
588     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
589
590     if( p_item->pf_list_update )
591     {
592         wxButton *refresh =
593             new wxButton( this, wxID_HIGHEST, wxU(_("Refresh")) );
594         sizer->Add( refresh, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
595
596         psz_name = strdup( p_item->psz_name );
597         pf_list_update = p_item->pf_list_update;
598     }
599
600     sizer->Layout();
601     this->SetSizerAndFit( sizer );
602 }
603
604 IntegerListConfigControl::~IntegerListConfigControl()
605 {
606     if( psz_name ) free( psz_name );
607 }
608
609 void IntegerListConfigControl::UpdateCombo( module_config_t *p_item )
610 {
611     /* build a list of available options */
612     for( int i_index = 0; i_index < p_item->i_list; i_index++ )
613     {
614         if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
615         {
616             combo->Append( wxU(p_item->ppsz_list_text[i_index]) );
617         }
618         else
619         {
620             combo->Append( wxString::Format(wxT("%i"),
621                                             p_item->pi_list[i_index]) );
622         }
623         combo->SetClientData( i_index, (void *)p_item->pi_list[i_index] );
624         if( p_item->i_value == p_item->pi_list[i_index] )
625         {
626             combo->SetSelection( i_index );
627             if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
628             {
629                 combo->SetValue( wxU(p_item->ppsz_list_text[i_index]) );
630             }
631             else
632             {
633                 combo->SetValue( wxString::Format(wxT("%i"),
634                                                   p_item->pi_list[i_index]) );
635             }
636         }
637     }
638 }
639
640 BEGIN_EVENT_TABLE(IntegerListConfigControl, wxPanel)
641     /* Button events */
642     EVT_BUTTON(wxID_HIGHEST, IntegerListConfigControl::OnRefresh)
643 END_EVENT_TABLE()
644
645 void IntegerListConfigControl::OnRefresh( wxCommandEvent& event )
646 {
647     if( pf_list_update )
648     {
649         vlc_value_t val;
650         module_config_t *p_item;
651
652         pf_list_update( p_this, psz_name, val, val, 0 );
653         p_item = config_FindConfig( p_this, psz_name );
654
655         combo->Clear();
656         UpdateCombo( p_item );
657     }
658 }
659
660 int IntegerListConfigControl::GetIntValue()
661 {
662     int selected = combo->GetSelection();
663     if( selected != -1 )
664     {
665         return (int)combo->GetClientData( selected );
666     }
667     return -1;
668 }
669
670 /*****************************************************************************
671  * RangedIntConfigControl implementation
672  *****************************************************************************/
673 RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
674                                                 module_config_t *p_item,
675                                                 wxWindow *parent )
676   : ConfigControl( p_this, p_item, parent )
677 {
678     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
679     slider = new wxSlider( this, -1, p_item->i_value, p_item->i_min,
680                            p_item->i_max, wxDefaultPosition, wxDefaultSize,
681                            wxSL_LABELS | wxSL_HORIZONTAL );
682     slider->SetToolTip( wxU(p_item->psz_longtext) );
683     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
684     sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
685     sizer->Layout();
686     this->SetSizerAndFit( sizer );
687 }
688
689 RangedIntConfigControl::~RangedIntConfigControl()
690 {
691     ;
692 }
693
694 int RangedIntConfigControl::GetIntValue()
695 {
696     return slider->GetValue();
697 }
698
699 /*****************************************************************************
700  * FloatConfigControl implementation
701  *****************************************************************************/
702 FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
703                                         module_config_t *p_item,
704                                         wxWindow *parent )
705   : ConfigControl( p_this, p_item, parent )
706 {
707     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
708     textctrl = new wxTextCtrl( this, -1,
709                                wxString::Format(wxT("%f"),
710                                                 p_item->f_value),
711                                wxDefaultPosition, wxDefaultSize,
712                                wxTE_PROCESS_ENTER );
713     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
714     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
715     sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
716     sizer->Layout();
717     this->SetSizerAndFit( sizer );
718 }
719
720 FloatConfigControl::~FloatConfigControl()
721 {
722     ;
723 }
724
725 float FloatConfigControl::GetFloatValue()
726 {
727     float f_value;
728     if( (wxSscanf(textctrl->GetValue(), wxT("%f"), &f_value) == 1) )
729         return f_value;
730     else return 0.0;
731 }
732
733 /*****************************************************************************
734  * BoolConfigControl implementation
735  *****************************************************************************/
736 BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
737                                       module_config_t *p_item,
738                                       wxWindow *parent )
739   : ConfigControl( p_this, p_item, parent )
740 {
741     checkbox = new wxCheckBox( this, -1, wxU(p_item->psz_text) );
742     if( p_item->i_value ) checkbox->SetValue(TRUE);
743     checkbox->SetToolTip( wxU(p_item->psz_longtext) );
744     sizer->Add( checkbox, 0, wxALL, 5 );
745     sizer->Layout();
746     this->SetSizerAndFit( sizer );
747 }
748
749 BoolConfigControl::~BoolConfigControl()
750 {
751     ;
752 }
753
754 int BoolConfigControl::GetIntValue()
755 {
756     if( checkbox->IsChecked() )
757     {
758         return 1;
759     }
760     else
761     {
762         return 0;
763     }
764 }