1 /*****************************************************************************
2 * preferences_widgets.cpp : wxWindows plugin for vlc
3 *****************************************************************************
4 * Copyright (C) 2000-2001 VideoLAN
5 * $Id: preferences_widgets.cpp,v 1.11 2003/11/05 02:43:55 gbazin Exp $
7 * Authors: Gildas Bazin <gbazin@netcourrier.com>
8 * Sigmund Augdal <sigmunau@idi.ntnu.no>
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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
28 #include <stdlib.h> /* malloc(), free() */
29 #include <errno.h> /* ENOMEM */
30 #include <string.h> /* strerror() */
38 #include "wxwindows.h"
39 #include "preferences_widgets.h"
41 /*****************************************************************************
42 * CreateConfigControl wrapper
43 *****************************************************************************/
44 ConfigControl *CreateConfigControl( vlc_object_t *p_this,
45 module_config_t *p_item, wxWindow *parent )
47 ConfigControl *p_control = NULL;
49 switch( p_item->i_type )
51 case CONFIG_ITEM_MODULE:
52 p_control = new ModuleConfigControl( p_this, p_item, parent );
55 case CONFIG_ITEM_STRING:
58 p_control = new StringConfigControl( p_this, p_item, parent );
62 p_control = new StringListConfigControl( p_this, p_item, parent );
66 case CONFIG_ITEM_FILE:
67 case CONFIG_ITEM_DIRECTORY:
68 p_control = new FileConfigControl( p_this, p_item, parent );
71 case CONFIG_ITEM_INTEGER:
74 p_control = new IntegerListConfigControl( p_this, p_item, parent );
76 else if( p_item->i_min != 0 || p_item->i_max != 0 )
78 p_control = new RangedIntConfigControl( p_this, p_item, parent );
82 p_control = new IntegerConfigControl( p_this, p_item, parent );
87 p_control = new KeyConfigControl( p_this, p_item, parent );
90 case CONFIG_ITEM_FLOAT:
91 p_control = new FloatConfigControl( p_this, p_item, parent );
94 case CONFIG_ITEM_BOOL:
95 p_control = new BoolConfigControl( p_this, p_item, parent );
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 ), name( wxU(p_item->psz_name) ),
111 i_type( p_item->i_type ), b_advanced( p_item->b_advanced )
113 sizer = new wxBoxSizer( wxHORIZONTAL );
117 ConfigControl::~ConfigControl()
121 int ConfigControl::i_counter = 0;
123 wxSizer *ConfigControl::Sizer()
128 wxString ConfigControl::GetName()
133 int ConfigControl::GetType()
138 vlc_bool_t ConfigControl::IsAdvanced()
143 /*****************************************************************************
144 * KeyConfigControl implementation
145 *****************************************************************************/
146 static wxString KeysList[] =
218 KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
219 module_config_t *p_item, wxWindow *parent )
220 : ConfigControl( p_this, p_item, parent )
222 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
223 alt = new wxCheckBox( this, -1, wxU(_("Alt")) );
224 alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
225 ctrl = new wxCheckBox( this, -1, wxU(_("Ctrl")) );
226 ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL );
227 shift = new wxCheckBox( this, -1, wxU(_("Shift")) );
228 shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
229 combo = new wxComboBox( this, -1, wxT(""), wxDefaultPosition,
230 wxDefaultSize, WXSIZEOF(KeysList), KeysList,
232 for( unsigned int i = 0; i < WXSIZEOF(KeysList); i++ )
234 combo->SetClientData( i, (void*)keys[i].i_key_code );
235 if( keys[i].i_key_code ==
236 ( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) )
238 combo->SetSelection( i );
239 combo->SetValue( wxU(_(keys[i].psz_key_string)) );
243 sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
244 sizer->Add( alt, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
245 sizer->Add( ctrl, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
246 sizer->Add( shift, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
247 sizer->Add( combo, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
249 this->SetSizerAndFit( sizer );
252 KeyConfigControl::~KeyConfigControl()
257 int KeyConfigControl::GetIntValue()
260 if( alt->IsChecked() )
262 result |= KEY_MODIFIER_ALT;
264 if( ctrl->IsChecked() )
266 result |= KEY_MODIFIER_CTRL;
268 if( shift->IsChecked() )
270 result |= KEY_MODIFIER_SHIFT;
272 int selected = combo->GetSelection();
275 result |= (int)combo->GetClientData( selected );
280 /*****************************************************************************
281 * ModuleConfigControl implementation
282 *****************************************************************************/
283 ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
284 module_config_t *p_item,
286 : ConfigControl( p_this, p_item, parent )
291 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
292 combo = new wxComboBox( this, -1, wxU(p_item->psz_value),
293 wxDefaultPosition, wxDefaultSize,
294 0, NULL, wxCB_READONLY | wxCB_SORT );
296 /* build a list of available modules */
297 p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
298 combo->Append( wxU(_("Default")), (void *)NULL );
299 combo->SetSelection( 0 );
300 for( int i_index = 0; i_index < p_list->i_count; i_index++ )
302 p_parser = (module_t *)p_list->p_values[i_index].p_object ;
304 if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
306 combo->Append( wxU(p_parser->psz_longname),
307 p_parser->psz_object_name );
308 if( p_item->psz_value && !strcmp(p_item->psz_value,
309 p_parser->psz_object_name) )
310 combo->SetValue( wxU(p_parser->psz_longname) );
313 vlc_list_release( p_list );
315 combo->SetToolTip( wxU(p_item->psz_longtext) );
316 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
317 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
319 this->SetSizerAndFit( sizer );
322 ModuleConfigControl::~ModuleConfigControl()
327 wxString ModuleConfigControl::GetPszValue()
329 return wxU( (char *)combo->GetClientData( combo->GetSelection() ));
332 /*****************************************************************************
333 * StringConfigControl implementation
334 *****************************************************************************/
335 StringConfigControl::StringConfigControl( vlc_object_t *p_this,
336 module_config_t *p_item,
338 : ConfigControl( p_this, p_item, parent )
340 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
341 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
342 textctrl = new wxTextCtrl( this, -1,
343 wxU(p_item->psz_value),
347 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
348 sizer->Add( textctrl, 1, wxALL, 5 );
350 this->SetSizerAndFit( sizer );
353 StringConfigControl::~StringConfigControl()
358 wxString StringConfigControl::GetPszValue()
360 return textctrl->GetValue();
363 /*****************************************************************************
364 * StringListConfigControl implementation
365 *****************************************************************************/
366 StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
367 module_config_t *p_item,
369 : ConfigControl( p_this, p_item, parent ), psz_name( NULL )
371 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
372 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
373 combo = new wxComboBox( this, -1, wxT(""),
374 wxDefaultPosition, wxDefaultSize,
375 0, NULL, wxCB_READONLY );
376 UpdateCombo( p_item );
378 combo->SetToolTip( wxU(p_item->psz_longtext) );
379 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
381 if( p_item->pf_list_update )
384 new wxButton( this, wxID_HIGHEST, wxU(_("Refresh")) );
385 sizer->Add( refresh, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
387 psz_name = strdup( p_item->psz_name );
388 pf_list_update = p_item->pf_list_update;
392 this->SetSizerAndFit( sizer );
395 StringListConfigControl::~StringListConfigControl()
397 if( psz_name ) free( psz_name );
400 void StringListConfigControl::UpdateCombo( module_config_t *p_item )
402 /* build a list of available options */
403 for( int i_index = 0; i_index < p_item->i_list; i_index++ )
405 combo->Append( ( p_item->ppsz_list_text &&
406 p_item->ppsz_list_text[i_index] ) ?
407 wxU(p_item->ppsz_list_text[i_index]) :
408 wxU(p_item->ppsz_list[i_index]) );
409 combo->SetClientData( i_index, (void *)p_item->ppsz_list[i_index] );
410 if( ( p_item->psz_value &&
411 !strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) ) ||
412 ( !p_item->psz_value && !*p_item->ppsz_list[i_index] ) )
414 combo->SetSelection( i_index );
415 combo->SetValue( ( p_item->ppsz_list_text &&
416 p_item->ppsz_list_text[i_index] ) ?
417 wxU(p_item->ppsz_list_text[i_index]) :
418 wxU(p_item->ppsz_list[i_index]) );
423 BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
425 EVT_BUTTON(wxID_HIGHEST+i_counter%100, StringListConfigControl::OnRefresh)
428 void StringListConfigControl::OnRefresh( wxCommandEvent& event )
433 module_config_t *p_item;
435 pf_list_update( p_this, psz_name, val, val, 0 );
436 p_item = config_FindConfig( p_this, psz_name );
439 UpdateCombo( p_item );
443 wxString StringListConfigControl::GetPszValue()
445 int selected = combo->GetSelection();
448 return (char *)combo->GetClientData( selected );
453 /*****************************************************************************
454 * FileConfigControl implementation
455 *****************************************************************************/
456 FileConfigControl::FileConfigControl( vlc_object_t *p_this,
457 module_config_t *p_item,
459 : ConfigControl( p_this, p_item, parent )
461 directory = p_item->i_type == CONFIG_ITEM_DIRECTORY;
462 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
463 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
464 textctrl = new wxTextCtrl( this, -1,
465 wxU(p_item->psz_value),
469 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
470 sizer->Add( textctrl, 1, wxALL, 5 );
471 browse = new wxButton( this, wxID_HIGHEST, wxU(_("Browse...")) );
472 sizer->Add( browse, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
474 this->SetSizerAndFit( sizer );
477 BEGIN_EVENT_TABLE(FileConfigControl, wxPanel)
479 EVT_BUTTON(wxID_HIGHEST+i_counter%100, FileConfigControl::OnBrowse)
482 void FileConfigControl::OnBrowse( wxCommandEvent& event )
486 wxDirDialog dialog( this, wxU(_("Choose Directory")) );
488 if( dialog.ShowModal() == wxID_OK )
490 textctrl->SetValue( dialog.GetPath() );
495 wxFileDialog dialog( this, wxU(_("Choose File")),
496 wxT(""), wxT(""), wxT("*.*"),
497 #if defined( __WXMSW__ )
506 FileConfigControl::~FileConfigControl()
511 wxString FileConfigControl::GetPszValue()
513 return textctrl->GetValue();
516 /*****************************************************************************
517 * IntegerConfigControl implementation
518 *****************************************************************************/
519 IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
520 module_config_t *p_item,
522 : ConfigControl( p_this, p_item, parent )
524 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
525 spin = new wxSpinCtrl( this, -1,
526 wxString::Format(wxT("%d"),
528 wxDefaultPosition, wxDefaultSize,
530 -16000, 16000, p_item->i_value);
531 spin->SetToolTip( wxU(p_item->psz_longtext) );
532 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
533 sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
535 this->SetSizerAndFit( sizer );
538 IntegerConfigControl::~IntegerConfigControl()
543 int IntegerConfigControl::GetIntValue()
545 return spin->GetValue();
548 /*****************************************************************************
549 * IntegerListConfigControl implementation
550 *****************************************************************************/
551 IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
552 module_config_t *p_item,
554 : ConfigControl( p_this, p_item, parent )
556 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
557 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
558 combo = new wxComboBox( this, -1, wxT(""),
559 wxDefaultPosition, wxDefaultSize,
560 0, NULL, wxCB_READONLY );
562 UpdateCombo( p_item );
564 combo->SetToolTip( wxU(p_item->psz_longtext) );
565 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
567 if( p_item->pf_list_update )
570 new wxButton( this, wxID_HIGHEST, wxU(_("Refresh")) );
571 sizer->Add( refresh, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
573 psz_name = strdup( p_item->psz_name );
574 pf_list_update = p_item->pf_list_update;
578 this->SetSizerAndFit( sizer );
581 IntegerListConfigControl::~IntegerListConfigControl()
583 if( psz_name ) free( psz_name );
586 void IntegerListConfigControl::UpdateCombo( module_config_t *p_item )
588 /* build a list of available options */
589 for( int i_index = 0; i_index < p_item->i_list; i_index++ )
591 combo->Append( ( p_item->ppsz_list_text &&
592 p_item->ppsz_list_text[i_index] ) ?
593 wxU(p_item->ppsz_list_text[i_index]) :
594 wxString::Format(wxT("%i"),
595 p_item->pi_list[i_index]) );
596 combo->SetClientData( i_index, (void *)p_item->pi_list[i_index] );
597 if( p_item->i_value == p_item->pi_list[i_index] )
599 combo->SetSelection( i_index );
600 combo->SetValue( ( p_item->ppsz_list_text &&
601 p_item->ppsz_list_text[i_index] ) ?
602 wxU(p_item->ppsz_list_text[i_index]) :
603 wxString::Format(wxT("%i"),
604 p_item->pi_list[i_index]) );
609 BEGIN_EVENT_TABLE(IntegerListConfigControl, wxPanel)
611 EVT_BUTTON(wxID_HIGHEST+i_counter%100, IntegerListConfigControl::OnRefresh)
614 void IntegerListConfigControl::OnRefresh( wxCommandEvent& event )
619 module_config_t *p_item;
621 pf_list_update( p_this, psz_name, val, val, 0 );
622 p_item = config_FindConfig( p_this, psz_name );
625 UpdateCombo( p_item );
629 int IntegerListConfigControl::GetIntValue()
631 int selected = combo->GetSelection();
634 return (int)combo->GetClientData( selected );
639 /*****************************************************************************
640 * RangedIntConfigControl implementation
641 *****************************************************************************/
642 RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
643 module_config_t *p_item,
645 : ConfigControl( p_this, p_item, parent )
647 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
648 slider = new wxSlider( this, -1, p_item->i_value, p_item->i_min,
649 p_item->i_max, wxDefaultPosition, wxDefaultSize,
650 wxSL_LABELS | wxSL_HORIZONTAL );
651 slider->SetToolTip( wxU(p_item->psz_longtext) );
652 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
653 sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
655 this->SetSizerAndFit( sizer );
658 RangedIntConfigControl::~RangedIntConfigControl()
663 int RangedIntConfigControl::GetIntValue()
665 return slider->GetValue();
668 /*****************************************************************************
669 * FloatConfigControl implementation
670 *****************************************************************************/
671 FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
672 module_config_t *p_item,
674 : ConfigControl( p_this, p_item, parent )
676 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
677 textctrl = new wxTextCtrl( this, -1,
678 wxString::Format(wxT("%f"),
680 wxDefaultPosition, wxDefaultSize,
681 wxTE_PROCESS_ENTER );
682 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
683 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
684 sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
686 this->SetSizerAndFit( sizer );
689 FloatConfigControl::~FloatConfigControl()
694 float FloatConfigControl::GetFloatValue()
697 if( (wxSscanf(textctrl->GetValue(), wxT("%f"), &f_value) == 1) )
702 /*****************************************************************************
703 * BoolConfigControl implementation
704 *****************************************************************************/
705 BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
706 module_config_t *p_item,
708 : ConfigControl( p_this, p_item, parent )
710 checkbox = new wxCheckBox( this, -1, wxU(p_item->psz_text) );
711 if( p_item->i_value ) checkbox->SetValue(TRUE);
712 checkbox->SetToolTip( wxU(p_item->psz_longtext) );
713 sizer->Add( checkbox, 0, wxALL, 5 );
715 this->SetSizerAndFit( sizer );
718 BoolConfigControl::~BoolConfigControl()
723 int BoolConfigControl::GetIntValue()
725 if( checkbox->IsChecked() )