1 /*****************************************************************************
2 * preferences_widgets.cpp : wxWindows plugin for vlc
3 *****************************************************************************
4 * Copyright (C) 2000-2001 VideoLAN
5 * $Id: preferences_widgets.cpp,v 1.10 2003/11/05 00:39:16 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_item, parent );
62 p_control = new StringListConfigControl( p_item, parent );
66 case CONFIG_ITEM_FILE:
67 case CONFIG_ITEM_DIRECTORY:
68 p_control = new FileConfigControl( p_item, parent );
71 case CONFIG_ITEM_INTEGER:
74 p_control = new IntegerListConfigControl( p_item, parent );
76 else if( p_item->i_min != 0 || p_item->i_max != 0 )
78 p_control = new RangedIntConfigControl( p_item, parent );
82 p_control = new IntegerConfigControl( p_item, parent );
87 p_control = new KeyConfigControl( p_item, parent );
90 case CONFIG_ITEM_FLOAT:
91 p_control = new FloatConfigControl( p_item, parent );
94 case CONFIG_ITEM_BOOL:
95 p_control = new BoolConfigControl( p_item, parent );
105 /*****************************************************************************
106 * ConfigControl implementation
107 *****************************************************************************/
108 ConfigControl::ConfigControl( module_config_t *p_item, wxWindow *parent )
109 : wxPanel( parent ), name( wxU(p_item->psz_name) ),
110 i_type( p_item->i_type ), b_advanced( p_item->b_advanced )
112 sizer = new wxBoxSizer( wxHORIZONTAL );
115 ConfigControl::~ConfigControl()
119 wxSizer *ConfigControl::Sizer()
124 wxString ConfigControl::GetName()
129 int ConfigControl::GetType()
134 vlc_bool_t ConfigControl::IsAdvanced()
139 /*****************************************************************************
140 * KeyConfigControl implementation
141 *****************************************************************************/
142 static wxString KeysList[] =
214 KeyConfigControl::KeyConfigControl( module_config_t *p_item, wxWindow *parent )
215 : ConfigControl( p_item, parent )
217 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
218 alt = new wxCheckBox( this, -1, wxU(_("Alt")) );
219 alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
220 ctrl = new wxCheckBox( this, -1, wxU(_("Ctrl")) );
221 ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL );
222 shift = new wxCheckBox( this, -1, wxU(_("Shift")) );
223 shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
224 combo = new wxComboBox( this, -1, wxT(""), wxDefaultPosition,
225 wxDefaultSize, WXSIZEOF(KeysList), KeysList,
227 for( unsigned int i = 0; i < WXSIZEOF(KeysList); i++ )
229 combo->SetClientData( i, (void*)keys[i].i_key_code );
230 if( keys[i].i_key_code ==
231 ( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) )
233 combo->SetSelection( i );
234 combo->SetValue( wxU(_(keys[i].psz_key_string)) );
238 sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
239 sizer->Add( alt, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
240 sizer->Add( ctrl, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
241 sizer->Add( shift, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
242 sizer->Add( combo, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
244 this->SetSizerAndFit( sizer );
247 KeyConfigControl::~KeyConfigControl()
252 int KeyConfigControl::GetIntValue()
255 if( alt->IsChecked() )
257 result |= KEY_MODIFIER_ALT;
259 if( ctrl->IsChecked() )
261 result |= KEY_MODIFIER_CTRL;
263 if( shift->IsChecked() )
265 result |= KEY_MODIFIER_SHIFT;
267 int selected = combo->GetSelection();
270 result |= (int)combo->GetClientData( selected );
275 /*****************************************************************************
276 * ModuleConfigControl implementation
277 *****************************************************************************/
278 ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
279 module_config_t *p_item,
281 : ConfigControl( p_item, parent )
286 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
287 combo = new wxComboBox( this, -1, wxU(p_item->psz_value),
288 wxDefaultPosition, wxDefaultSize,
289 0, NULL, wxCB_READONLY | wxCB_SORT );
291 /* build a list of available modules */
292 p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
293 combo->Append( wxU(_("Default")), (void *)NULL );
294 combo->SetSelection( 0 );
295 for( int i_index = 0; i_index < p_list->i_count; i_index++ )
297 p_parser = (module_t *)p_list->p_values[i_index].p_object ;
299 if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
301 combo->Append( wxU(p_parser->psz_longname),
302 p_parser->psz_object_name );
303 if( p_item->psz_value && !strcmp(p_item->psz_value,
304 p_parser->psz_object_name) )
305 combo->SetValue( wxU(p_parser->psz_longname) );
308 vlc_list_release( p_list );
310 combo->SetToolTip( wxU(p_item->psz_longtext) );
311 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
312 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
314 this->SetSizerAndFit( sizer );
317 ModuleConfigControl::~ModuleConfigControl()
322 wxString ModuleConfigControl::GetPszValue()
324 return wxU( (char *)combo->GetClientData( combo->GetSelection() ));
327 /*****************************************************************************
328 * StringConfigControl implementation
329 *****************************************************************************/
330 StringConfigControl::StringConfigControl( module_config_t *p_item,
332 : ConfigControl( p_item, parent )
334 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
335 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
336 textctrl = new wxTextCtrl( this, -1,
337 wxU(p_item->psz_value),
341 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
342 sizer->Add( textctrl, 1, wxALL, 5 );
344 this->SetSizerAndFit( sizer );
347 StringConfigControl::~StringConfigControl()
352 wxString StringConfigControl::GetPszValue()
354 return textctrl->GetValue();
357 /*****************************************************************************
358 * StringListConfigControl implementation
359 *****************************************************************************/
360 StringListConfigControl::StringListConfigControl( module_config_t *p_item,
362 : ConfigControl( p_item, parent )
364 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
365 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
366 combo = new wxComboBox( this, -1, wxT(""),
367 wxDefaultPosition, wxDefaultSize,
368 0, NULL, wxCB_READONLY );
370 /* build a list of available options */
371 for( int i_index = 0; i_index < p_item->i_list; i_index++ )
373 combo->Append( ( p_item->ppsz_list_text &&
374 p_item->ppsz_list_text[i_index] ) ?
375 wxU(p_item->ppsz_list_text[i_index]) :
376 wxU(p_item->ppsz_list[i_index]) );
377 combo->SetClientData( i_index, (void *)p_item->ppsz_list[i_index] );
378 if( p_item->psz_value && !strcmp( p_item->psz_value,
379 p_item->ppsz_list[i_index] ) )
381 combo->SetSelection( i_index );
382 combo->SetValue( ( p_item->ppsz_list_text &&
383 p_item->ppsz_list_text[i_index] ) ?
384 wxU(p_item->ppsz_list_text[i_index]) :
385 wxU(p_item->ppsz_list[i_index]) );
389 combo->SetToolTip( wxU(p_item->psz_longtext) );
390 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
392 this->SetSizerAndFit( sizer );
395 StringListConfigControl::~StringListConfigControl()
400 wxString StringListConfigControl::GetPszValue()
402 int selected = combo->GetSelection();
405 return (char *)combo->GetClientData( selected );
410 /*****************************************************************************
411 * FileConfigControl implementation
412 *****************************************************************************/
413 FileConfigControl::FileConfigControl( module_config_t *p_item,
415 : ConfigControl( p_item, parent )
417 directory = p_item->i_type == CONFIG_ITEM_DIRECTORY;
418 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
419 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
420 textctrl = new wxTextCtrl( this, -1,
421 wxU(p_item->psz_value),
425 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
426 sizer->Add( textctrl, 1, wxALL, 5 );
427 browse = new wxButton( this, wxID_HIGHEST, wxU(_("Browse...")) );
428 sizer->Add( browse, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
430 this->SetSizerAndFit( sizer );
433 BEGIN_EVENT_TABLE(FileConfigControl, wxPanel)
435 EVT_BUTTON(wxID_HIGHEST, FileConfigControl::OnBrowse)
438 void FileConfigControl::OnBrowse( wxCommandEvent& event )
442 wxDirDialog dialog( this, wxU(_("Choose Directory")) );
444 if( dialog.ShowModal() == wxID_OK )
446 textctrl->SetValue( dialog.GetPath() );
451 wxFileDialog dialog( this, wxU(_("Choose File")),
452 wxT(""), wxT(""), wxT("*.*"),
453 #if defined( __WXMSW__ )
462 FileConfigControl::~FileConfigControl()
467 wxString FileConfigControl::GetPszValue()
469 return textctrl->GetValue();
472 /*****************************************************************************
473 * IntegerConfigControl implementation
474 *****************************************************************************/
475 IntegerConfigControl::IntegerConfigControl( module_config_t *p_item,
477 : ConfigControl( p_item, parent )
479 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
480 spin = new wxSpinCtrl( this, -1,
481 wxString::Format(wxT("%d"),
483 wxDefaultPosition, wxDefaultSize,
485 -16000, 16000, p_item->i_value);
486 spin->SetToolTip( wxU(p_item->psz_longtext) );
487 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
488 sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
490 this->SetSizerAndFit( sizer );
493 IntegerConfigControl::~IntegerConfigControl()
498 int IntegerConfigControl::GetIntValue()
500 return spin->GetValue();
503 /*****************************************************************************
504 * IntegerListConfigControl implementation
505 *****************************************************************************/
506 IntegerListConfigControl::IntegerListConfigControl( module_config_t *p_item,
508 : ConfigControl( p_item, parent )
510 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
511 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
512 combo = new wxComboBox( this, -1, wxT(""),
513 wxDefaultPosition, wxDefaultSize,
514 0, NULL, wxCB_READONLY );
516 /* build a list of available options */
517 for( int i_index = 0; i_index < p_item->i_list; i_index++ )
519 combo->Append( ( p_item->ppsz_list_text &&
520 p_item->ppsz_list_text[i_index] ) ?
521 wxU(p_item->ppsz_list_text[i_index]) :
522 wxString::Format(wxT("%i"),
523 p_item->pi_list[i_index]) );
524 combo->SetClientData( i_index, (void *)p_item->pi_list[i_index] );
525 if( p_item->i_value == p_item->pi_list[i_index] )
527 combo->SetSelection( i_index );
528 combo->SetValue( ( p_item->ppsz_list_text &&
529 p_item->ppsz_list_text[i_index] ) ?
530 wxU(p_item->ppsz_list_text[i_index]) :
531 wxString::Format(wxT("%i"),
532 p_item->pi_list[i_index]) );
536 combo->SetToolTip( wxU(p_item->psz_longtext) );
537 sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
539 this->SetSizerAndFit( sizer );
542 IntegerListConfigControl::~IntegerListConfigControl()
547 int IntegerListConfigControl::GetIntValue()
549 int selected = combo->GetSelection();
552 return (int)combo->GetClientData( selected );
557 /*****************************************************************************
558 * RangedIntConfigControl implementation
559 *****************************************************************************/
560 RangedIntConfigControl::RangedIntConfigControl( module_config_t *p_item,
562 : ConfigControl( p_item, parent )
564 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
565 slider = new wxSlider( this, -1, p_item->i_value, p_item->i_min,
566 p_item->i_max, wxDefaultPosition, wxDefaultSize,
567 wxSL_LABELS | wxSL_HORIZONTAL );
568 slider->SetToolTip( wxU(p_item->psz_longtext) );
569 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
570 sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
572 this->SetSizerAndFit( sizer );
575 RangedIntConfigControl::~RangedIntConfigControl()
580 int RangedIntConfigControl::GetIntValue()
582 return slider->GetValue();
585 /*****************************************************************************
586 * FloatConfigControl implementation
587 *****************************************************************************/
588 FloatConfigControl::FloatConfigControl( module_config_t *p_item,
590 : ConfigControl( p_item, parent )
592 label = new wxStaticText(this, -1, wxU(p_item->psz_text));
593 textctrl = new wxTextCtrl( this, -1,
594 wxString::Format(wxT("%f"),
596 wxDefaultPosition, wxDefaultSize,
597 wxTE_PROCESS_ENTER );
598 textctrl->SetToolTip( wxU(p_item->psz_longtext) );
599 sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
600 sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
602 this->SetSizerAndFit( sizer );
605 FloatConfigControl::~FloatConfigControl()
610 float FloatConfigControl::GetFloatValue()
613 if( (wxSscanf(textctrl->GetValue(), wxT("%f"), &f_value) == 1) )
618 /*****************************************************************************
619 * BoolConfigControl implementation
620 *****************************************************************************/
621 BoolConfigControl::BoolConfigControl( module_config_t *p_item,
623 : ConfigControl( p_item, parent )
625 checkbox = new wxCheckBox( this, -1, wxU(p_item->psz_text) );
626 if( p_item->i_value ) checkbox->SetValue(TRUE);
627 checkbox->SetToolTip( wxU(p_item->psz_longtext) );
628 sizer->Add( checkbox, 0, wxALL, 5 );
630 this->SetSizerAndFit( sizer );
633 BoolConfigControl::~BoolConfigControl()
638 int BoolConfigControl::GetIntValue()
640 if( checkbox->IsChecked() )