preferences_widgets.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:24k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * preferences_widgets.cpp : wxWindows plugin for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2000-2004 VideoLAN
  5.  * $Id: preferences_widgets.cpp 9088 2004-10-31 13:19:28Z gbazin $
  6.  *
  7.  * Authors: Gildas Bazin <gbazin@videolan.org>
  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.  * Preamble
  26.  *****************************************************************************/
  27. #include <stdlib.h>                                      /* malloc(), free() */
  28. #include <errno.h>                                                 /* ENOMEM */
  29. #include <string.h>                                            /* strerror() */
  30. #include <stdio.h>
  31. #include <vlc/vlc.h>
  32. #include <vlc/intf.h>
  33. #include <vlc_help.h>
  34. #include "wxwindows.h"
  35. #include "preferences_widgets.h"
  36. /*****************************************************************************
  37.  * CreateConfigControl wrapper
  38.  *****************************************************************************/
  39. ConfigControl *CreateConfigControl( vlc_object_t *p_this,
  40.                                     module_config_t *p_item, wxWindow *parent )
  41. {
  42.     ConfigControl *p_control = NULL;
  43.     switch( p_item->i_type )
  44.     {
  45.     case CONFIG_ITEM_MODULE:
  46.         p_control = new ModuleConfigControl( p_this, p_item, parent );
  47.         break;
  48.     case CONFIG_ITEM_STRING:
  49.         if( !p_item->i_list )
  50.         {
  51.             p_control = new StringConfigControl( p_this, p_item, parent );
  52.         }
  53.         else
  54.         {
  55.             p_control = new StringListConfigControl( p_this, p_item, parent );
  56.         }
  57.         break;
  58.     case CONFIG_ITEM_FILE:
  59.     case CONFIG_ITEM_DIRECTORY:
  60.         p_control = new FileConfigControl( p_this, p_item, parent );
  61.         break;
  62.     case CONFIG_ITEM_INTEGER:
  63.         if( p_item->i_list )
  64.         {
  65.             p_control = new IntegerListConfigControl( p_this, p_item, parent );
  66.         }
  67.         else if( p_item->i_min != 0 || p_item->i_max != 0 )
  68.         {
  69.             p_control = new RangedIntConfigControl( p_this, p_item, parent );
  70.         }
  71.         else
  72.         {
  73.             p_control = new IntegerConfigControl( p_this, p_item, parent );
  74.         }
  75.         break;
  76.     case CONFIG_ITEM_KEY:
  77.         p_control = new KeyConfigControl( p_this, p_item, parent );
  78.         break;
  79.     case CONFIG_ITEM_FLOAT:
  80.         p_control = new FloatConfigControl( p_this, p_item, parent );
  81.         break;
  82.     case CONFIG_ITEM_BOOL:
  83.         p_control = new BoolConfigControl( p_this, p_item, parent );
  84.         break;
  85.     default:
  86.         break;
  87.     }
  88.     return p_control;
  89. }
  90. /*****************************************************************************
  91.  * ConfigControl implementation
  92.  *****************************************************************************/
  93. ConfigControl::ConfigControl( vlc_object_t *_p_this,
  94.                               module_config_t *p_item, wxWindow *parent )
  95.   : wxPanel( parent ), p_this( _p_this ),
  96.     pf_update_callback( NULL ), p_update_data( NULL ),
  97.     name( wxU(p_item->psz_name) ), i_type( p_item->i_type ),
  98.     b_advanced( p_item->b_advanced )
  99. {
  100.     sizer = new wxBoxSizer( wxHORIZONTAL );
  101. }
  102. ConfigControl::~ConfigControl()
  103. {
  104. }
  105. wxSizer *ConfigControl::Sizer()
  106. {
  107.     return sizer;
  108. }
  109. wxString ConfigControl::GetName()
  110. {
  111.     return name;
  112. }
  113. int ConfigControl::GetType()
  114. {
  115.     return i_type;
  116. }
  117. vlc_bool_t ConfigControl::IsAdvanced()
  118. {
  119.     return b_advanced;
  120. }
  121. void ConfigControl::SetUpdateCallback( void (*p_callback)( void * ),
  122.                                              void *p_data )
  123. {
  124.     pf_update_callback = p_callback;
  125.     p_update_data = p_data;
  126. }
  127. void ConfigControl::OnUpdate( wxCommandEvent& WXUNUSED(event) )
  128. {
  129.     if( pf_update_callback )
  130.     {
  131.         pf_update_callback( p_update_data );
  132.     }
  133. }
  134. /*****************************************************************************
  135.  * KeyConfigControl implementation
  136.  *****************************************************************************/
  137. wxString *KeyConfigControl::m_keysList = NULL;
  138. KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
  139.                                     module_config_t *p_item, wxWindow *parent )
  140.   : ConfigControl( p_this, p_item, parent )
  141. {
  142.     // Number of keys descriptions
  143.     unsigned int i_keys = sizeof(vlc_keys)/sizeof(key_descriptor_t);
  144.     // Init the keys decriptions array
  145.     if( m_keysList == NULL )
  146.     {
  147.         m_keysList = new wxString[i_keys];
  148.         for( unsigned int i = 0; i < i_keys; i++ )
  149.         {
  150.             m_keysList[i] = wxU(vlc_keys[i].psz_key_string);
  151.         }
  152.     }
  153.     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
  154.     alt = new wxCheckBox( this, -1, wxU(_("Alt")) );
  155.     alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
  156.     ctrl = new wxCheckBox( this, -1, wxU(_("Ctrl")) );
  157.     ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL );
  158.     shift = new wxCheckBox( this, -1, wxU(_("Shift")) );
  159.     shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
  160.     combo = new wxComboBox( this, -1, wxT(""), wxDefaultPosition,
  161.                             wxDefaultSize, i_keys, m_keysList,
  162.                             wxCB_READONLY );
  163.     for( unsigned int i = 0; i < i_keys; i++ )
  164.     {
  165.         combo->SetClientData( i, (void*)vlc_keys[i].i_key_code );
  166.         if( (unsigned int)vlc_keys[i].i_key_code ==
  167.             ( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) )
  168.         {
  169.             combo->SetSelection( i );
  170.             combo->SetValue( wxU(_(vlc_keys[i].psz_key_string)) );
  171.         }
  172.     }
  173.     sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
  174.     sizer->Add( alt,   1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
  175.     sizer->Add( ctrl,  1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
  176.     sizer->Add( shift, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
  177.     sizer->Add( combo, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
  178.     sizer->Layout();
  179.     this->SetSizerAndFit( sizer );
  180. }
  181. KeyConfigControl::~KeyConfigControl()
  182. {
  183.     if( m_keysList )
  184.     {
  185.         delete[] m_keysList;
  186.         m_keysList = NULL;
  187.     }
  188. }
  189. int KeyConfigControl::GetIntValue()
  190. {
  191.     int result = 0;
  192.     if( alt->IsChecked() )
  193.     {
  194.         result |= KEY_MODIFIER_ALT;
  195.     }
  196.     if( ctrl->IsChecked() )
  197.     {
  198.         result |= KEY_MODIFIER_CTRL;
  199.     }
  200.     if( shift->IsChecked() )
  201.     {
  202.         result |= KEY_MODIFIER_SHIFT;
  203.     }
  204.     int selected = combo->GetSelection();
  205.     if( selected != -1 )
  206.     {
  207.         result |= (int)combo->GetClientData( selected );
  208.     }
  209.     return result;
  210. }
  211. /*****************************************************************************
  212.  * ModuleConfigControl implementation
  213.  *****************************************************************************/
  214. ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
  215.                                           module_config_t *p_item,
  216.                                           wxWindow *parent )
  217.   : ConfigControl( p_this, p_item, parent )
  218. {
  219.     vlc_list_t *p_list;
  220.     module_t *p_parser;
  221.     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
  222.     combo = new wxComboBox( this, -1, wxL2U(p_item->psz_value),
  223.                             wxDefaultPosition, wxDefaultSize,
  224.                             0, NULL, wxCB_READONLY | wxCB_SORT );
  225.     /* build a list of available modules */
  226.     p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
  227.     combo->Append( wxU(_("Default")), (void *)NULL );
  228.     combo->SetSelection( 0 );
  229.     for( int i_index = 0; i_index < p_list->i_count; i_index++ )
  230.     {
  231.         p_parser = (module_t *)p_list->p_values[i_index].p_object ;
  232.         if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
  233.         {
  234.             combo->Append( wxU(p_parser->psz_longname),
  235.                            p_parser->psz_object_name );
  236.             if( p_item->psz_value && !strcmp(p_item->psz_value,
  237.                                              p_parser->psz_object_name) )
  238.                 combo->SetValue( wxU(p_parser->psz_longname) );
  239.         }
  240.     }
  241.     vlc_list_release( p_list );
  242.     combo->SetToolTip( wxU(p_item->psz_longtext) );
  243.     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  244.     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  245.     sizer->Layout();
  246.     this->SetSizerAndFit( sizer );
  247. }
  248. ModuleConfigControl::~ModuleConfigControl()
  249. {
  250.     ;
  251. }
  252. wxString ModuleConfigControl::GetPszValue()
  253. {
  254.     return wxU( (char *)combo->GetClientData( combo->GetSelection() ));
  255. }
  256. /*****************************************************************************
  257.  * StringConfigControl implementation
  258.  *****************************************************************************/
  259. StringConfigControl::StringConfigControl( vlc_object_t *p_this,
  260.                                           module_config_t *p_item,
  261.                                           wxWindow *parent )
  262.   : ConfigControl( p_this, p_item, parent )
  263. {
  264.     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
  265.     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  266.     textctrl = new wxTextCtrl( this, -1,
  267.                                wxL2U(p_item->psz_value),
  268.                                wxDefaultPosition,
  269.                                wxDefaultSize,
  270.                                wxTE_PROCESS_ENTER);
  271.     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
  272.     sizer->Add( textctrl, 1, wxALL, 5 );
  273.     sizer->Layout();
  274.     this->SetSizerAndFit( sizer );
  275. }
  276. StringConfigControl::~StringConfigControl()
  277. {
  278.     ;
  279. }
  280. wxString StringConfigControl::GetPszValue()
  281. {
  282.     return textctrl->GetValue();
  283. }
  284. BEGIN_EVENT_TABLE(StringConfigControl, wxPanel)
  285.     /* Text events */
  286.     EVT_TEXT(-1, StringConfigControl::OnUpdate)
  287. END_EVENT_TABLE()
  288. /*****************************************************************************
  289.  * StringListConfigControl implementation
  290.  *****************************************************************************/
  291. StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
  292.                                                   module_config_t *p_item,
  293.                                                   wxWindow *parent )
  294.   : ConfigControl( p_this, p_item, parent )
  295. {
  296.     psz_default_value = p_item->psz_value;
  297.     if( psz_default_value ) psz_default_value = strdup( psz_default_value );
  298.     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
  299.     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  300.     combo = new wxComboBox( this, -1, wxT(""),
  301.                             wxDefaultPosition, wxDefaultSize,
  302.                             0, NULL, wxCB_READONLY );
  303.     UpdateCombo( p_item );
  304.     combo->SetToolTip( wxU(p_item->psz_longtext) );
  305.     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  306.     for( int i = 0; i < p_item->i_action; i++ )
  307.     {
  308.         wxButton *button =
  309.             new wxButton( this, wxID_HIGHEST+i,
  310.                           wxU(p_item->ppsz_action_text[i]) );
  311.         sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  312.     }
  313.     sizer->Layout();
  314.     this->SetSizerAndFit( sizer );
  315. }
  316. StringListConfigControl::~StringListConfigControl()
  317. {
  318.     if( psz_default_value ) free( psz_default_value );
  319. }
  320. void StringListConfigControl::UpdateCombo( module_config_t *p_item )
  321. {
  322.     vlc_bool_t b_found = VLC_FALSE;
  323.     int i_index;
  324.     /* build a list of available options */
  325.     for( i_index = 0; i_index < p_item->i_list; i_index++ )
  326.     {
  327.         combo->Append( ( p_item->ppsz_list_text &&
  328.                          p_item->ppsz_list_text[i_index] ) ?
  329.                        wxU(p_item->ppsz_list_text[i_index]) :
  330.                        wxL2U(p_item->ppsz_list[i_index]) );
  331.         combo->SetClientData( i_index, (void *)p_item->ppsz_list[i_index] );
  332.         if( ( p_item->psz_value &&
  333.               !strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) ) ||
  334.              ( !p_item->psz_value && !*p_item->ppsz_list[i_index] ) )
  335.         {
  336.             combo->SetSelection( i_index );
  337.             combo->SetValue( ( p_item->ppsz_list_text &&
  338.                                p_item->ppsz_list_text[i_index] ) ?
  339.                              wxU(p_item->ppsz_list_text[i_index]) :
  340.                              wxL2U(p_item->ppsz_list[i_index]) );
  341.             b_found = VLC_TRUE;
  342.         }
  343.     }
  344.     if( p_item->psz_value && !b_found )
  345.     {
  346.         /* Add custom entry to list */
  347.         combo->Append( wxL2U(p_item->psz_value) );
  348.         combo->SetClientData( i_index, (void *)psz_default_value );
  349.         combo->SetSelection( i_index );
  350.         combo->SetValue( wxL2U(p_item->psz_value) );
  351.     }
  352. }
  353. BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
  354.     /* Button events */
  355.     EVT_BUTTON(-1, StringListConfigControl::OnAction)
  356.     /* Text events */
  357.     EVT_TEXT(-1, StringListConfigControl::OnUpdate)
  358. END_EVENT_TABLE()
  359. void StringListConfigControl::OnAction( wxCommandEvent& event )
  360. {
  361.     int i_action = event.GetId() - wxID_HIGHEST;
  362.     module_config_t *p_item = config_FindConfig( p_this, GetName().mb_str() );
  363.     if( !p_item ) return;
  364.     if( i_action < 0 || i_action >= p_item->i_action ) return;
  365.     vlc_value_t val;
  366.     wxString value = GetPszValue();
  367.     *((const char **)&val.psz_string) = value.mb_str();
  368.     p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
  369.     if( p_item->b_dirty )
  370.     {
  371.         combo->Clear();
  372.         UpdateCombo( p_item );
  373.         p_item->b_dirty = VLC_FALSE;
  374.     }
  375. }
  376. wxString StringListConfigControl::GetPszValue()
  377. {
  378.     int selected = combo->GetSelection();
  379.     if( selected != -1 )
  380.     {
  381.         return wxL2U((char *)combo->GetClientData( selected ));
  382.     }
  383.     return wxString();
  384. }
  385. /*****************************************************************************
  386.  * FileConfigControl implementation
  387.  *****************************************************************************/
  388. FileConfigControl::FileConfigControl( vlc_object_t *p_this,
  389.                                       module_config_t *p_item,
  390.                                       wxWindow *parent )
  391.   : ConfigControl( p_this, p_item, parent )
  392. {
  393.     directory = p_item->i_type == CONFIG_ITEM_DIRECTORY;
  394.     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
  395.     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  396.     textctrl = new wxTextCtrl( this, -1,
  397.                                wxL2U(p_item->psz_value),
  398.                                wxDefaultPosition,
  399.                                wxDefaultSize,
  400.                                wxTE_PROCESS_ENTER);
  401.     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
  402.     sizer->Add( textctrl, 1, wxALL, 5 );
  403.     browse = new wxButton( this, wxID_HIGHEST, wxU(_("Browse...")) );
  404.     sizer->Add( browse, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  405.     sizer->Layout();
  406.     this->SetSizerAndFit( sizer );
  407. }
  408. BEGIN_EVENT_TABLE(FileConfigControl, wxPanel)
  409.     /* Button events */
  410.     EVT_BUTTON(wxID_HIGHEST, FileConfigControl::OnBrowse)
  411. END_EVENT_TABLE()
  412. void FileConfigControl::OnBrowse( wxCommandEvent& event )
  413. {
  414.     if( directory )
  415.     {
  416.         wxDirDialog dialog( this, wxU(_("Choose directory")) );
  417.         if( dialog.ShowModal() == wxID_OK )
  418.         {
  419.             textctrl->SetValue( dialog.GetPath() );
  420.         }
  421.     }
  422.     else
  423.     {
  424.         wxFileDialog dialog( this, wxU(_("Choose file")),
  425.                              wxT(""), wxT(""), wxT("*.*"),
  426. #if defined( __WXMSW__ )
  427.                              wxOPEN
  428. #else
  429.                              wxOPEN | wxSAVE
  430. #endif
  431.                            );
  432.         if( dialog.ShowModal() == wxID_OK )
  433.         {
  434.             textctrl->SetValue( dialog.GetPath() );
  435.         }
  436.     }
  437. }
  438. FileConfigControl::~FileConfigControl()
  439. {
  440.     ;
  441. }
  442. wxString FileConfigControl::GetPszValue()
  443. {
  444.     return textctrl->GetValue();
  445. }
  446. /*****************************************************************************
  447.  * IntegerConfigControl implementation
  448.  *****************************************************************************/
  449. BEGIN_EVENT_TABLE(IntegerConfigControl, wxPanel)
  450.     EVT_TEXT(-1, IntegerConfigControl::OnUpdate)
  451.     EVT_COMMAND_SCROLL(-1, IntegerConfigControl::OnUpdate)
  452. END_EVENT_TABLE()
  453. IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
  454.                                             module_config_t *p_item,
  455.                                             wxWindow *parent )
  456.   : ConfigControl( p_this, p_item, parent )
  457. {
  458.     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
  459.     spin = new wxSpinCtrl( this, -1,
  460.                            wxString::Format(wxT("%d"),
  461.                                             p_item->i_value),
  462.                            wxDefaultPosition, wxDefaultSize,
  463.                            wxSP_ARROW_KEYS,
  464.                            -100000000, 100000000, p_item->i_value);
  465.     spin->SetToolTip( wxU(p_item->psz_longtext) );
  466.     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  467.     sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  468.     sizer->Layout();
  469.     this->SetSizerAndFit( sizer );
  470.     i_value = p_item->i_value;
  471. }
  472. IntegerConfigControl::~IntegerConfigControl()
  473. {
  474.     ;
  475. }
  476. int IntegerConfigControl::GetIntValue()
  477. {
  478.     /* We avoid using GetValue because of a recursion bug with wxSpinCtrl with
  479.      * wxGTK. */
  480.     return i_value; //spin->GetValue();
  481. }
  482. void IntegerConfigControl::OnUpdate( wxCommandEvent &event )
  483. {
  484.     i_value = event.GetInt();
  485.     ConfigControl::OnUpdate( event );
  486. }
  487. /*****************************************************************************
  488.  * IntegerListConfigControl implementation
  489.  *****************************************************************************/
  490. IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
  491.                                                     module_config_t *p_item,
  492.                                                     wxWindow *parent )
  493.   : ConfigControl( p_this, p_item, parent )
  494. {
  495.     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
  496.     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  497.     combo = new wxComboBox( this, -1, wxT(""),
  498.                             wxDefaultPosition, wxDefaultSize,
  499.                             0, NULL, wxCB_READONLY );
  500.     UpdateCombo( p_item );
  501.     combo->SetToolTip( wxU(p_item->psz_longtext) );
  502.     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  503.     sizer->Layout();
  504.     this->SetSizerAndFit( sizer );
  505. }
  506. IntegerListConfigControl::~IntegerListConfigControl()
  507. {
  508. }
  509. void IntegerListConfigControl::UpdateCombo( module_config_t *p_item )
  510. {
  511.     /* build a list of available options */
  512.     for( int i_index = 0; i_index < p_item->i_list; i_index++ )
  513.     {
  514.         if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
  515.         {
  516.             combo->Append( wxU(p_item->ppsz_list_text[i_index]) );
  517.         }
  518.         else
  519.         {
  520.             combo->Append( wxString::Format(wxT("%i"),
  521.                                             p_item->pi_list[i_index]) );
  522.         }
  523.         combo->SetClientData( i_index, (void *)p_item->pi_list[i_index] );
  524.         if( p_item->i_value == p_item->pi_list[i_index] )
  525.         {
  526.             combo->SetSelection( i_index );
  527.             if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
  528.             {
  529.                 combo->SetValue( wxU(p_item->ppsz_list_text[i_index]) );
  530.             }
  531.             else
  532.             {
  533.                 combo->SetValue( wxString::Format(wxT("%i"),
  534.                                                   p_item->pi_list[i_index]) );
  535.             }
  536.         }
  537.     }
  538. }
  539. BEGIN_EVENT_TABLE(IntegerListConfigControl, wxPanel)
  540.     /* Button events */
  541.     EVT_BUTTON(-1, IntegerListConfigControl::OnAction)
  542. END_EVENT_TABLE()
  543. void IntegerListConfigControl::OnAction( wxCommandEvent& event )
  544. {
  545.     int i_action = event.GetId() - wxID_HIGHEST;
  546.     module_config_t *p_item;
  547.     p_item = config_FindConfig( p_this, GetName().mb_str() );
  548.     if( !p_item ) return;
  549.     if( i_action < 0 || i_action >= p_item->i_action ) return;
  550.     vlc_value_t val;
  551.     val.i_int = GetIntValue();
  552.     p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
  553.     if( p_item->b_dirty )
  554.     {
  555.         combo->Clear();
  556.         UpdateCombo( p_item );
  557.         p_item->b_dirty = VLC_FALSE;
  558.     }
  559. }
  560. int IntegerListConfigControl::GetIntValue()
  561. {
  562.     int selected = combo->GetSelection();
  563.     if( selected != -1 )
  564.     {
  565.         return (int)combo->GetClientData( selected );
  566.     }
  567.     return -1;
  568. }
  569. /*****************************************************************************
  570.  * RangedIntConfigControl implementation
  571.  *****************************************************************************/
  572. BEGIN_EVENT_TABLE(RangedIntConfigControl, wxPanel)
  573.     EVT_COMMAND_SCROLL(-1, RangedIntConfigControl::OnUpdate)
  574. END_EVENT_TABLE()
  575. RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
  576.                                                 module_config_t *p_item,
  577.                                                 wxWindow *parent )
  578.   : ConfigControl( p_this, p_item, parent )
  579. {
  580.     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
  581.     slider = new wxSlider( this, -1, p_item->i_value, p_item->i_min,
  582.                            p_item->i_max, wxDefaultPosition, wxDefaultSize,
  583.                            wxSL_LABELS | wxSL_HORIZONTAL );
  584.     slider->SetToolTip( wxU(p_item->psz_longtext) );
  585.     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  586.     sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  587.     sizer->Layout();
  588.     this->SetSizerAndFit( sizer );
  589. }
  590. RangedIntConfigControl::~RangedIntConfigControl()
  591. {
  592.     ;
  593. }
  594. int RangedIntConfigControl::GetIntValue()
  595. {
  596.     return slider->GetValue();
  597. }
  598. /*****************************************************************************
  599.  * FloatConfigControl implementation
  600.  *****************************************************************************/
  601. BEGIN_EVENT_TABLE(FloatConfigControl, wxPanel)
  602.     EVT_TEXT(-1, FloatConfigControl::OnUpdate)
  603. END_EVENT_TABLE()
  604. FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
  605.                                         module_config_t *p_item,
  606.                                         wxWindow *parent )
  607.   : ConfigControl( p_this, p_item, parent )
  608. {
  609.     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
  610.     textctrl = new wxTextCtrl( this, -1,
  611.                                wxString::Format(wxT("%f"),
  612.                                                 p_item->f_value),
  613.                                wxDefaultPosition, wxDefaultSize,
  614.                                wxTE_PROCESS_ENTER );
  615.     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
  616.     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
  617.     sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  618.     sizer->Layout();
  619.     this->SetSizerAndFit( sizer );
  620. }
  621. FloatConfigControl::~FloatConfigControl()
  622. {
  623.     ;
  624. }
  625. float FloatConfigControl::GetFloatValue()
  626. {
  627.     float f_value;
  628.     if( (wxSscanf(textctrl->GetValue(), wxT("%f"), &f_value) == 1) )
  629.         return f_value;
  630.     else return 0.0;
  631. }
  632. /*****************************************************************************
  633.  * BoolConfigControl implementation
  634.  *****************************************************************************/
  635. BEGIN_EVENT_TABLE(BoolConfigControl, wxPanel)
  636.     EVT_CHECKBOX(-1, BoolConfigControl::OnUpdate)
  637. END_EVENT_TABLE()
  638. BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
  639.                                       module_config_t *p_item,
  640.                                       wxWindow *parent )
  641.   : ConfigControl( p_this, p_item, parent )
  642. {
  643.     checkbox = new wxCheckBox( this, -1, wxU(p_item->psz_text) );
  644.     if( p_item->i_value ) checkbox->SetValue(TRUE);
  645.     checkbox->SetToolTip( wxU(p_item->psz_longtext) );
  646.     sizer->Add( checkbox, 0, wxALL, 5 );
  647.     sizer->Layout();
  648.     this->SetSizerAndFit( sizer );
  649. }
  650. BoolConfigControl::~BoolConfigControl()
  651. {
  652.     ;
  653. }
  654. int BoolConfigControl::GetIntValue()
  655. {
  656.     if( checkbox->IsChecked() ) return 1;
  657.     else return 0;
  658. }