Changeset a8855655eb349eea1910b82c57261946f08934e7

Show
Ignore:
Timestamp:
22/09/03 16:40:12 (5 years ago)
Author:
Clément Stenac <zorglub@videolan.org>
git-committer:
Clément Stenac <zorglub@videolan.org> 1064241612 +0000
git-parent:

[03f4adcdce0be78eab1bb2978aaf8bb0dc3331e0]

git-author:
Clément Stenac <zorglub@videolan.org> 1064241612 +0000
Message:

* modules/gui/wxwindows/preferences.cpp:

  • Created the "General Settings" section
  • Added help strings in the two main sections,

in the libvlc categories,
and in the module capabilities

* modules/gui/wxwindows/playlist.cpp & wxwindows.h

-Implemented random, loop and repeat using variables
-The eye candy of the dialog box is not very good

but I have no idea how to improve it.

-Focus on the currently playing item

* src/libvlc.h:

  • Added help strings for the libvlc categories
  • Changed a few "advanced" flag

* include/vlc_help.h:

  • Help strings for the two main sections
  • Help string for the module capabilities (both by Anil)

* po/*: updated potfiles with the new strings

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/gui/wxwindows/playlist.cpp

    rc66b7a8 ra885565  
    33 ***************************************************************************** 
    44 * Copyright (C) 2000-2001 VideoLAN 
    5  * $Id: playlist.cpp,v 1.20 2003/09/21 18:07:51 gbazin Exp $ 
     5 * $Id: playlist.cpp,v 1.21 2003/09/22 14:40:10 zorglub Exp $ 
    66 * 
    77 * Authors: Olivier Teuli� <ipkiss@via.ecp.fr> 
     
    6060    Random_Event, 
    6161    Loop_Event, 
     62    Repeat_Event, 
    6263    SelectAll_Event, 
    6364 
     
    8283    EVT_MENU(SelectAll_Event, Playlist::OnSelectAll) 
    8384    EVT_CHECKBOX(Random_Event, Playlist::OnRandom) 
     85    EVT_CHECKBOX(Repeat_Event, Playlist::OnRepeat) 
    8486    EVT_CHECKBOX(Loop_Event, Playlist::OnLoop) 
    8587 
     
    108110    /* Initializations */ 
    109111    p_intf = _p_intf; 
     112    vlc_value_t  val; 
    110113    i_update_counter = 0; 
    111114    b_need_update = VLC_FALSE; 
    112115    vlc_mutex_init( p_intf, &lock ); 
    113116    SetIcon( *p_intf->p_sys->p_icon ); 
     117 
     118    var_Create( p_intf, "random", VLC_VAR_BOOL ); 
     119    var_Change( p_intf, "random", VLC_VAR_INHERITVALUE, & val, NULL ); 
     120    var_Create( p_intf, "loop", VLC_VAR_BOOL ); 
     121    var_Create( p_intf, "loop", VLC_VAR_BOOL ); 
     122    var_Change( p_intf, "repeat", VLC_VAR_INHERITVALUE, & val, NULL ); 
     123    var_Change( p_intf, "repeat", VLC_VAR_INHERITVALUE, & val, NULL ); 
    114124 
    115125    /* Create our "Manage" menu */ 
     
    148158     * playlist window is ridiculously small */ 
    149159    listview = new wxListView( playlist_panel, ListView_Event, 
    150                                wxDefaultPosition, wxSize( 355, 300 ), 
     160                               wxDefaultPosition, wxSize( 305, 300 ), 
    151161                               wxLC_REPORT | wxSUNKEN_BORDER ); 
    152162    listview->InsertColumn( 0, wxU(_("Url")) ); 
    153     listview->InsertColumn( 1, wxU(_("Duration")) ); 
    154     listview->SetColumnWidth( 0, 250 ); 
    155     listview->SetColumnWidth( 1, 100 ); 
     163    #if 0 
     164    listview->InsertColumn( 1, wxU(_("Duration")) ); 
     165    #endif 
     166    listview->SetColumnWidth( 0, 300 ); 
     167    #if 0 
     168    listview->SetColumnWidth( 1, 100 ); 
     169    #endif 
    156170 
    157171    /* Create the Random checkbox */ 
    158172    wxCheckBox *random_checkbox =  
    159173        new wxCheckBox( playlist_panel, Random_Event, wxU(_("Random")) ); 
    160     int b_random = config_GetInt( p_intf, "random") ; 
    161     random_checkbox->SetValue( b_random ); 
     174     
     175    var_Get( p_intf, "random", &val); 
     176    vlc_bool_t b_random = val.b_bool; 
     177    random_checkbox->SetValue( b_random == VLC_FALSE ? 0 : 1); 
    162178 
    163179    /* Create the Loop Checkbox */ 
    164180    wxCheckBox *loop_checkbox =  
    165181        new wxCheckBox( playlist_panel, Loop_Event, wxU(_("Loop")) ); 
    166     int b_loop = config_GetInt( p_intf, "loop") ;  
     182 
     183    var_Get( p_intf, "loop", &val ); 
     184    int b_loop = val.b_bool ;  
    167185    loop_checkbox->SetValue( b_loop ); 
     186 
     187    /* Create the Repeat one checkbox */ 
     188    wxCheckBox *repeat_checkbox =  
     189    new wxCheckBox( playlist_panel, Repeat_Event, wxU(_("Repeat one")) ); 
     190 
     191    var_Get( p_intf, "repeat", &val ); 
     192    int b_repeat = val.b_bool ;  
     193    repeat_checkbox->SetValue( b_repeat ); 
    168194 
    169195    /* Create the Search Textbox */ 
    170196    search_text = 
    171197    new wxTextCtrl( playlist_panel, SearchText_Event, wxT(""),  
    172             wxDefaultPosition, wxSize( 100, -1),  
     198            wxDefaultPosition, wxSize( 140, -1),  
    173199            wxTE_PROCESS_ENTER);     
    174200 
     
    179205  
    180206    /* Place everything in sizers */ 
    181     wxBoxSizer *search_sizer = new wxBoxSizer( wxHORIZONTAL ); 
    182     search_sizer->Add( search_text, 0, wxEXPAND|wxALL, 5); 
    183     search_sizer->Add( search_button, 0, wxEXPAND|wxALL, 5); 
    184     search_sizer->Add( random_checkbox, 0,  
    185                  wxEXPAND|wxALIGN_RIGHT|wxALL, 5); 
    186     search_sizer->Add( loop_checkbox, 0,  
    187                       wxEXPAND|wxALIGN_RIGHT|wxALL, 5); 
     207    wxBoxSizer *button_sizer = new wxBoxSizer( wxVERTICAL ); 
     208    button_sizer->Add( random_checkbox, 0,  
     209                 wxEXPAND|wxALIGN_RIGHT, 5); 
     210    button_sizer->Add( loop_checkbox, 0,  
     211                      wxEXPAND|wxALIGN_RIGHT, 5); 
     212    button_sizer->Add( repeat_checkbox, 0,  
     213                      wxEXPAND|wxALIGN_RIGHT, 5); 
     214 
     215    button_sizer->Layout(); 
     216 
     217    wxBoxSizer *search_sizer = new wxBoxSizer( wxVERTICAL ); 
     218    search_sizer->Add( search_text, 0, wxALL|wxALIGN_CENTER, 5); 
     219    search_sizer->Add( search_button, 0, wxALL|wxALIGN_CENTER, 5); 
     220 
    188221    search_sizer->Layout(); 
     222 
     223    wxBoxSizer *bottom_sizer = new wxBoxSizer( wxHORIZONTAL ); 
     224    bottom_sizer->Add( search_sizer , 0, wxALL|wxALIGN_CENTER, 5 ); 
     225    bottom_sizer->Add( button_sizer , 0, wxALL|wxALIGN_CENTER, 5 ); 
     226     
     227    bottom_sizer->Layout(); 
    189228 
    190229    wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL ); 
     
    192231    wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL ); 
    193232    panel_sizer->Add( listview, 1, wxEXPAND | wxALL, 5 ); 
    194     panel_sizer->Add( search_sizer, 0 , wxALIGN_CENTRE); 
     233     
     234    panel_sizer->Add( bottom_sizer, 0 , wxALIGN_CENTRE); 
    195235    panel_sizer->Layout(); 
    196236 
     
    255295        listview->InsertItem( i, filename ); 
    256296        /* FIXME: we should try to find the actual duration... */ 
    257         listview->SetItem( i, 1, wxU(_("no info")) ); 
     297    /* While we don't use it, hide it, it's ugly */ 
     298    #if 0 
     299        listview->SetItem( i, 1, wxU(_("no info")) ); 
     300    #endif 
    258301    } 
    259302    vlc_mutex_unlock( &p_playlist->object_lock ); 
     
    264307    listitem.SetTextColour( *wxRED ); 
    265308    listview->SetItem( listitem ); 
     309 
     310//    listview->Select( p_playlist->i_index, TRUE ); 
     311    listview->Focus( p_playlist->i_index ); 
    266312 
    267313    vlc_object_release( p_playlist ); 
     
    519565void Playlist::OnRandom( wxCommandEvent& event ) 
    520566{ 
    521     config_PutInt( p_intf , "random" ,  
    522            event.IsChecked() ? VLC_TRUE : VLC_FALSE ); 
     567    vlc_value_t val; 
     568    val.b_bool = event.IsChecked(); 
     569// ? VLC_TRUE : VLC_FALSE ; 
     570    playlist_t *p_playlist = 
     571        (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, 
     572                                       FIND_ANYWHERE ); 
     573    if( p_playlist == NULL ) 
     574    { 
     575        return; 
     576    } 
     577    var_Set( p_playlist , "random", val); 
     578    vlc_object_release( p_playlist ); 
    523579} 
    524580void Playlist::OnLoop ( wxCommandEvent& event ) 
    525581{ 
    526     config_PutInt( p_intf, "loop", 
    527            event.IsChecked() ? VLC_TRUE : VLC_FALSE );     
    528  
     582    vlc_value_t val; 
     583    val.b_bool = event.IsChecked(); 
     584// ? VLC_TRUE : VLC_FALSE ; 
     585    playlist_t *p_playlist = 
     586        (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, 
     587                                       FIND_ANYWHERE ); 
     588    if( p_playlist == NULL ) 
     589    { 
     590        return; 
     591    } 
     592    var_Set( p_playlist , "loop", val); 
     593    vlc_object_release( p_playlist ); 
     594
     595 
     596void Playlist::OnRepeat ( wxCommandEvent& event ) 
     597
     598    vlc_value_t val; 
     599    val.b_bool = event.IsChecked(); 
     600// ? VLC_TRUE : VLC_FALSE ; 
     601    playlist_t *p_playlist = 
     602        (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, 
     603                                       FIND_ANYWHERE ); 
     604    if( p_playlist == NULL ) 
     605    { 
     606        return; 
     607    } 
     608    var_Set( p_playlist , "repeat", val); 
     609    vlc_object_release( p_playlist ); 
    529610} 
    530611 
  • modules/gui/wxwindows/preferences.cpp

    r1b50257 ra885565  
    33 ***************************************************************************** 
    44 * Copyright (C) 2000-2001 VideoLAN 
    5  * $Id: preferences.cpp,v 1.27 2003/09/21 17:52:43 gbazin Exp $ 
     5 * $Id: preferences.cpp,v 1.28 2003/09/22 14:40:10 zorglub Exp $ 
    66 * 
    77 * Authors: Gildas Bazin <gbazin@netcourrier.com> 
     
    3333#include <vlc/intf.h> 
    3434 
     35#include <vlc_help.h> 
     36 
    3537#include "wxwindows.h" 
    3638#include <wx/notebook.h> 
     
    4749#endif 
    4850 
     51#define GENERAL_ID 1242 
     52#define PLUGIN_ID 1243 
     53#define CAPABILITY_ID 1244 
     54 
    4955/***************************************************************************** 
    5056 * Classes declarations. 
     
    7985 
    8086    wxTreeItemId root_item; 
     87    wxTreeItemId general_item; 
    8188    wxTreeItemId plugins_item; 
    8289}; 
     
    115122    PrefsPanel() { } 
    116123    PrefsPanel( wxWindow *parent, intf_thread_t *_p_intf, 
    117                 PrefsDialog *_p_prefs_dialog, int i_object_id, char * ); 
     124                PrefsDialog *_p_prefs_dialog, int i_object_id, char *, char * ); 
    118125    virtual ~PrefsPanel() {} 
    119126 
     
    141148 
    142149    vlc_bool_t b_submodule; 
     150 
     151    char *psz_help; 
    143152 
    144153    PrefsPanel *panel; 
     
    212221PrefsDialog::PrefsDialog( intf_thread_t *_p_intf, wxWindow *p_parent) 
    213222  :  wxFrame( p_parent, -1, wxU(_("Preferences")), wxDefaultPosition, 
    214               wxSize(650,450), wxDEFAULT_FRAME_STYLE ) 
     223              wxSize(700,450), wxDEFAULT_FRAME_STYLE ) 
    215224{ 
    216225    /* Initializations */ 
     
    331340 
    332341/***************************************************************************** 
     342 * GetCapabilityHelp: Display the help for one capability. 
     343 *****************************************************************************/ 
     344static char * GetCapabilityHelp( char *psz_capability) 
     345{ 
     346    if( psz_capability == NULL) 
     347    return NULL; 
     348 
     349    if( !strcasecmp(psz_capability,"access") ) 
     350    return strdup(ACCESS_HELP); 
     351    if( !strcasecmp(psz_capability,"audio filter") ) 
     352    return strdup(AUDIO_FILTER_HELP); 
     353    if( !strcasecmp(psz_capability,"audio output") ) 
     354    return strdup(AOUT_HELP); 
     355    if( !strcasecmp(psz_capability,"chroma") ) 
     356    return strdup(CHROMA_HELP); 
     357    if( !strcasecmp(psz_capability,"decoder") ) 
     358    return strdup(DECODER_HELP); 
     359    if( !strcasecmp(psz_capability,"demux") ) 
     360    return strdup(DEMUX_HELP); 
     361    if( !strcasecmp(psz_capability,"interface") ) 
     362    return strdup(INTERFACE_HELP); 
     363    if( !strcasecmp(psz_capability,"sout access") ) 
     364    return strdup(SOUT_HELP); 
     365    if( !strcasecmp(psz_capability,"subtitle demux") ) 
     366    return strdup(SUBTITLE_DEMUX_HELP); 
     367    if( !strcasecmp(psz_capability,"text renderer") ) 
     368    return strdup(TEXT_HELP); 
     369    if( !strcasecmp(psz_capability,"video output") ) 
     370    return strdup(VOUT_HELP); 
     371    if( !strcasecmp(psz_capability,"video filter") ) 
     372    return strdup(VIDEO_FILTER_HELP); 
     373 
     374    return strdup(UNKNOWN_HELP); 
     375} 
     376 
     377/***************************************************************************** 
    333378 * PrefsTreeCtrl class definition. 
    334379 *****************************************************************************/ 
     
    362407     * Build a tree of the main options 
    363408     */ 
     409    ConfigTreeData *config_data = new ConfigTreeData; 
     410    config_data->psz_section = NULL; 
     411    config_data->i_object_id = GENERAL_ID; 
     412    config_data->psz_help = strdup( GENERAL_HELP ); 
     413printf("dans pouet: %i\n",config_data->i_object_id); 
     414    general_item = AppendItem( root_item, wxU(_("General Settings")), 
     415                -1, -1, config_data ); 
     416 
    364417    for( i_index = 0; i_index < p_list->i_count; i_index++ ) 
    365418    { 
     
    383436                ConfigTreeData *config_data = new ConfigTreeData; 
    384437                config_data->psz_section = strdup(p_item->psz_text); 
     438        if( p_item->psz_longtext ) 
     439        { 
     440            config_data->psz_help = strdup( p_item->psz_longtext); 
     441        } 
     442        else 
     443        { 
     444            config_data->psz_help = NULL; 
     445        } 
    385446                config_data->i_object_id = p_module->i_object_id; 
    386447 
    387448                /* Add the category to the tree */ 
    388                 AppendItem( root_item, wxU(p_item->psz_text), 
     449                AppendItem( general_item, wxU(p_item->psz_text), 
    389450                            -1, -1, config_data ); 
    390451                break; 
     
    393454        while( p_item->i_type != CONFIG_HINT_END && p_item++ ); 
    394455 
    395         SortChildren( root_item ); 
     456        SortChildren( general_item ); 
    396457    } 
    397458 
     
    400461     * Build a tree of all the plugins 
    401462     */ 
    402     plugins_item = AppendItem( root_item, wxU(_("Plugins")) ); 
     463    config_data = new ConfigTreeData; 
     464    config_data->psz_section = NULL; 
     465    config_data->i_object_id = PLUGIN_ID; 
     466    config_data->psz_help = strdup( PLUGIN_HELP ); 
     467    plugins_item = AppendItem( root_item, wxU(_("Plugins")), 
     468            -1,-1,config_data ); 
    403469 
    404470    for( i_index = 0; i_index < p_list->i_count; i_index++ ) 
     
    445511        { 
    446512            /* We didn't find it, add it */ 
     513            ConfigTreeData *config_data = new ConfigTreeData; 
     514            config_data->psz_section = NULL; 
     515            config_data->psz_help =  
     516        GetCapabilityHelp( p_module->psz_capability ); 
     517            config_data->i_object_id = CAPABILITY_ID; 
    447518            capability_item = AppendItem( plugins_item, 
    448                                           wxU(p_module->psz_capability) ); 
     519                                          wxU(p_module->psz_capability), 
     520                      -1,-1,config_data ); 
    449521        } 
    450522 
     
    455527            ((module_t *)p_module->p_parent)->i_object_id : 
    456528            p_module->i_object_id; 
     529    config_data->psz_help = strdup( "" ); 
    457530        AppendItem( capability_item, wxU(p_module->psz_object_name), -1, -1, 
    458531                    config_data ); 
     
    654727                new PrefsPanel( p_parent, p_intf, p_prefs_dialog, 
    655728                                config_data->i_object_id, 
    656                                 config_data->psz_section ); 
     729                                config_data->psz_section, 
     730                config_data->psz_help); 
    657731            config_data->panel->SwitchAdvanced( b_advanced ); 
    658732        } 
     
    692766PrefsPanel::PrefsPanel( wxWindow* parent, intf_thread_t *_p_intf, 
    693767                        PrefsDialog *_p_prefs_dialog, 
    694                         int i_object_id, char *psz_section
     768                        int i_object_id, char *psz_section, char*psz_help
    695769  :  wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize ) 
    696770{ 
     
    700774 
    701775    wxStaticText *label; 
     776    wxStaticText *help; 
    702777    wxComboBox *combo; 
    703778    wxSpinCtrl *spin; 
     
    707782    wxArrayString array; 
    708783 
     784    vlc_bool_t b_has_advanced = VLC_FALSE; 
     785    module_t *p_module = NULL; 
     786     
    709787    /* Initializations */ 
    710788    p_intf = _p_intf; 
     
    716794    wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); 
    717795 
    718     /* Get a pointer to the module */ 
    719     module_t *p_module = (module_t *)vlc_object_get( p_intf, i_object_id ); 
    720     if( p_module->i_object_type != VLC_OBJECT_MODULE ) 
    721     { 
    722         /* 0OOoo something went really bad */ 
    723         return; 
    724     } 
    725  
    726     /* Enumerate config options and add corresponding config boxes 
    727      * (submodules don't have config options, they are stored in the 
    728      *  parent module) */ 
    729     if( p_module->b_submodule ) 
    730         p_item = ((module_t *)p_module->p_parent)->p_config; 
     796 
     797    if( i_object_id == PLUGIN_ID || i_object_id == GENERAL_ID || 
     798    i_object_id == CAPABILITY_ID )  
     799    { 
     800    wxStaticBox *static_box = new wxStaticBox( this, -1, wxT( "" ) ); 
     801        wxStaticBoxSizer *box_sizer = new wxStaticBoxSizer( static_box, 
     802                                                            wxVERTICAL ); 
     803        label = new wxStaticText( this, -1, 
     804            wxU(_( psz_help) ) ); 
     805 
     806        box_sizer->Add( label, 1,  wxEXPAND | wxLEFT | wxRIGHT, 5 ); 
     807 
     808    sizer->Add( box_sizer, 0, wxEXPAND | wxALL , 5 ); 
     809    }    
    731810    else 
    732         p_item = p_module->p_config; 
    733  
    734     /* Find the category if it has been specified */ 
    735     if( psz_section && p_item->i_type == CONFIG_HINT_CATEGORY ) 
    736     { 
    737         while( !p_item->i_type == CONFIG_HINT_CATEGORY || 
    738                strcmp( psz_section, p_item->psz_text ) ) 
    739         { 
    740             if( p_item->i_type == CONFIG_HINT_END ) 
    741                 break; 
    742             p_item++; 
    743         } 
    744     } 
    745  
    746     /* Add a head title to the panel */ 
    747     wxStaticBox *static_box = new wxStaticBox( this, -1, wxT("") ); 
    748     wxStaticBoxSizer *box_sizer = new wxStaticBoxSizer( static_box, 
    749                                                         wxHORIZONTAL ); 
    750     label = new wxStaticText( this, -1, 
    751                               wxU(psz_section ? p_item->psz_text : 
    752                               p_module->psz_longname) ); 
    753  
    754     box_sizer->Add( label, 1, wxALL, 5 ); 
    755     sizer->Add( box_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, 5 ); 
    756  
    757     /* Now put all the config options into a scrolled window */ 
    758     config_sizer = new wxBoxSizer( wxVERTICAL ); 
    759     config_window = new wxScrolledWindow( this, -1, wxDefaultPosition, 
    760         wxDefaultSize, wxSTATIC_BORDER | wxHSCROLL | wxVSCROLL ); 
    761     config_window->SetAutoLayout( TRUE ); 
    762     config_window->SetScrollRate( 5, 5 ); 
    763  
    764     if( p_item ) do 
    765     { 
    766         /* If a category has been specified, check we finished the job */ 
    767         if( psz_section && p_item->i_type == CONFIG_HINT_CATEGORY && 
    768             strcmp( psz_section, p_item->psz_text ) ) 
    769             break; 
    770  
    771         /* put each config option in a separate panel so we can hide advanced 
    772          * options easily */ 
    773         wxPanel *panel = new wxPanel( config_window, -1, wxDefaultPosition, 
    774                                       wxDefaultSize ); 
    775         wxBoxSizer *panel_sizer = new wxBoxSizer( wxHORIZONTAL ); 
    776         ConfigData *config_data = 
    777             new ConfigData( panel, p_item->i_type, 
    778                             p_item->b_advanced, p_item->psz_name ); 
    779  
    780         switch( p_item->i_type ) 
    781         { 
    782         case CONFIG_ITEM_MODULE: 
    783             label = new wxStaticText(panel, -1, wxU(p_item->psz_text)); 
    784             combo = new wxComboBox( panel, -1, wxU(p_item->psz_value), 
    785                                     wxDefaultPosition, wxDefaultSize, 
    786                                     0, NULL, wxCB_READONLY | wxCB_SORT ); 
    787  
    788             /* build a list of available modules */ 
    789             p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE ); 
    790             combo->Append( wxU(_("Default")), (void *)NULL ); 
    791             combo->SetSelection( 0 ); 
    792             for( int i_index = 0; i_index < p_list->i_count; i_index++ ) 
    793             { 
    794                 p_parser = (module_t *)p_list->p_values[i_index].p_object ; 
    795  
    796                 if( !strcmp( p_parser->psz_capability, 
    797                              p_item->psz_type ) ) 
    798                 { 
    799                     combo->Append( wxU(p_parser->psz_longname), 
    800                                    p_parser->psz_object_name ); 
    801                     if( p_item->psz_value && 
    802                         !strcmp(p_item->psz_value, p_parser->psz_object_name) ) 
    803                         combo->SetValue( wxU(p_parser->psz_longname) ); 
    804                 } 
    805             } 
    806             vlc_list_release( p_list ); 
    807  
    808             combo->SetToolTip( wxU(p_item->psz_longtext) ); 
    809             config_data->control.combobox = combo; 
    810             panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); 
    811             panel_sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); 
    812             break; 
    813  
    814         case CONFIG_ITEM_STRING: 
    815         case CONFIG_ITEM_FILE: 
    816         case CONFIG_ITEM_DIRECTORY: 
    817             label = new wxStaticText(panel, -1, wxU(p_item->psz_text)); 
    818             panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); 
    819  
    820             if( !p_item->ppsz_list ) 
    821             { 
    822                 textctrl = new wxTextCtrl( panel, -1, wxU(p_item->psz_value), 
    823                                            wxDefaultPosition, wxDefaultSize, 
    824                                            wxTE_PROCESS_ENTER); 
    825                 textctrl->SetToolTip( wxU(p_item->psz_longtext) ); 
    826                 config_data->control.textctrl = textctrl; 
    827                 panel_sizer->Add( textctrl, 1, wxALL, 5 ); 
    828             } 
    829             else 
    830             { 
    831                 combo = new wxComboBox( panel, -1, wxU(p_item->psz_value), 
     811    { 
     812        /* Get a pointer to the module */ 
     813        p_module = (module_t *)vlc_object_get( p_intf,  i_object_id ); 
     814        if( p_module->i_object_type != VLC_OBJECT_MODULE ) 
     815        { 
     816            /* 0OOoo something went really bad */ 
     817            return; 
     818        } 
     819 
     820        /* Enumerate config options and add corresponding config boxes 
     821         * (submodules don't have config options, they are stored in the 
     822         *  parent module) */ 
     823         if( p_module->b_submodule ) 
     824            p_item = ((module_t *)p_module->p_parent)->p_config; 
     825         else 
     826            p_item = p_module->p_config; 
     827     
     828         /* Find the category if it has been specified */ 
     829         if( psz_section && p_item->i_type == CONFIG_HINT_CATEGORY ) 
     830         { 
     831             while( !p_item->i_type == CONFIG_HINT_CATEGORY || 
     832                   strcmp( psz_section, p_item->psz_text ) ) 
     833             { 
     834                if( p_item->i_type == CONFIG_HINT_END ) 
     835                     break; 
     836                p_item++; 
     837             } 
     838         } 
     839         /* Add a head title to the panel */ 
     840     wxStaticBox *static_box = new wxStaticBox( this, -1, wxT( "" ) ); 
     841         wxStaticBoxSizer *box_sizer = new wxStaticBoxSizer( static_box, 
     842                                                            wxVERTICAL ); 
     843 
     844     wxStaticBox *help_box = NULL; 
     845     wxStaticBoxSizer *help_sizer = NULL;  
     846 
     847         label = new wxStaticText( this, -1, 
     848                                   wxU(_(psz_section ? p_item->psz_text : 
     849                                   p_module->psz_longname ))); 
     850         
     851         box_sizer->Add( label, 1,  wxEXPAND | wxLEFT | wxRIGHT, 5 ); 
     852 
     853         sizer->Add( box_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT , 5 ); 
     854 
     855         if( psz_help && psz_help[1] )  
     856     /* Check that we have at least something */ 
     857     { 
     858         help_box   = new wxStaticBox( this, -1, wxT( "" ) ); 
     859         help_sizer = new wxStaticBoxSizer( help_box, 
     860                                                wxHORIZONTAL ) ; 
     861         help = new wxStaticText( this, -1, 
     862                    wxT(_( psz_help) ), 
     863                wxDefaultPosition, wxDefaultSize, 
     864                wxST_NO_AUTORESIZE | wxALIGN_LEFT, 
     865                wxT("") ); 
     866             
     867         help_sizer->Add( help, 1,  wxALL | wxEXPAND , 5 ); 
     868         sizer->Add( help_sizer ,0 ,wxEXPAND | wxALL, 5 ); 
     869     }  
     870 
     871         /* Now put all the config options into a scrolled window */ 
     872         config_sizer = new wxBoxSizer( wxVERTICAL ); 
     873         config_window = new wxScrolledWindow( this, -1, wxDefaultPosition, 
     874            wxDefaultSize, wxSTATIC_BORDER | wxHSCROLL | wxVSCROLL ); 
     875         config_window->SetAutoLayout( TRUE ); 
     876         config_window->SetScrollRate( 5, 5 ); 
     877 
     878         if( p_item ) do 
     879         { 
     880            /* If a category has been specified, check we finished the job */ 
     881             if( psz_section && p_item->i_type == CONFIG_HINT_CATEGORY && 
     882                 strcmp( psz_section, p_item->psz_text ) ) 
     883                 break; 
     884    
     885            /* put each config option in a separate panel so we can hide advanced 
     886             * options easily */ 
     887             wxPanel *panel = new wxPanel( config_window, -1, wxDefaultPosition, 
     888                                           wxDefaultSize ); 
     889             wxBoxSizer *panel_sizer = new wxBoxSizer( wxHORIZONTAL ); 
     890             ConfigData *config_data = 
     891                 new ConfigData( panel, p_item->i_type, 
     892                                 p_item->b_advanced, p_item->psz_name ); 
     893 
     894             switch( p_item->i_type ) 
     895             { 
     896                 case CONFIG_ITEM_MODULE: 
     897                     label = new wxStaticText(panel, -1, wxU(p_item->psz_text)); 
     898                     combo = new wxComboBox( panel, -1, wxU(p_item->psz_value), 
     899                                             wxDefaultPosition, wxDefaultSize, 
     900                                             0, NULL, wxCB_READONLY | wxCB_SORT ); 
     901 
     902                    /* build a list of available modules */ 
     903                    p_list = vlc_list_find( p_intf,  
     904                VLC_OBJECT_MODULE, FIND_ANYWHERE ); 
     905                    combo->Append( wxU(_("Default")), (void *)NULL ); 
     906                    combo->SetSelection( 0 ); 
     907                    for( int i_index = 0; i_index < p_list->i_count; i_index++ ) 
     908                    { 
     909                        p_parser = (module_t *)p_list->p_values[i_index].p_object ; 
     910 
     911                        if( !strcmp( p_parser->psz_capability, 
     912                                 p_item->psz_type ) ) 
     913                        { 
     914                            combo->Append( wxU(p_parser->psz_longname), 
     915                                       p_parser->psz_object_name ); 
     916                            if( p_item->psz_value && 
     917                               !strcmp(p_item->psz_value,  
     918                    p_parser->psz_object_name) ) 
     919                                 combo->SetValue( wxU(p_parser->psz_longname) ); 
     920                        } 
     921                    } 
     922                    vlc_list_release( p_list ); 
     923 
     924                    combo->SetToolTip( wxU(p_item->psz_longtext) ); 
     925                    config_data->control.combobox = combo; 
     926                    panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL 
     927                        | wxALL, 5 ); 
     928                    panel_sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL  
     929                        | wxALL, 5 ); 
     930                    break; 
     931 
     932                case CONFIG_ITEM_STRING: 
     933                case CONFIG_ITEM_FILE: 
     934                case CONFIG_ITEM_DIRECTORY: 
     935                    label = new wxStaticText(panel, -1, wxU(p_item->psz_text)); 
     936                    panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL  
     937                            | wxALL, 5 ); 
     938  
     939                    if( !p_item->ppsz_list ) 
     940                    { 
     941                        textctrl = new wxTextCtrl( panel, -1,  
     942                wxU(p_item->psz_value), 
     943                                wxDefaultPosition, wxDefaultSize, 
     944                                wxTE_PROCESS_ENTER); 
     945                        textctrl->SetToolTip( wxU(p_item->psz_longtext) ); 
     946                        config_data->control.textctrl = textctrl; 
     947                        panel_sizer->Add( textctrl, 1, wxALL, 5 ); 
     948                    } 
     949                    else 
     950                    { 
     951                        combo = new wxComboBox( panel, -1, wxU(p_item->psz_value), 
    832952                                        wxDefaultPosition, wxDefaultSize, 
    833953                                        0, NULL, wxCB_READONLY | wxCB_SORT ); 
    834954 
    835                 /* build a list of available options */ 
    836                 for( int i_index = 0; p_item->ppsz_list[i_index]; i_index++ ) 
     955                        /* build a list of available options */ 
     956                        for( int i_index = 0; p_item->ppsz_list[i_index]; 
     957                         i_index++ ) 
     958                        { 
     959                            combo->Append( wxU(p_item->ppsz_list[i_index]) ); 
     960                            if( p_item->psz_value && !strcmp( p_item->psz_value, 
     961                                      p_item->ppsz_list[i_index] ) ) 
     962                                combo->SetSelection( i_index ); 
     963                        }   
     964     
     965                        if( p_item->psz_value ) 
     966                            combo->SetValue( wxU(p_item->psz_value) ); 
     967                        combo->SetToolTip( wxU(p_item->psz_longtext) ); 
     968                        config_data->control.combobox = combo; 
     969                        config_data->b_config_list = VLC_TRUE; 
     970                        panel_sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL 
     971                            |wxALL, 5 ); 
     972                    } 
     973   
     974                    if( p_item->i_type == CONFIG_ITEM_FILE ) 
     975                    { 
     976                         button = new wxButton( panel, -1, wxU(_("Browse...")) ); 
     977                         panel_sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL 
     978                            |wxALL, 5); 
     979                        button->SetClientData((void *)config_data); 
     980                    } 
     981                    if( p_item->b_advanced ) b_has_advanced = VLC_TRUE; 
     982                    break; 
     983 
     984                case CONFIG_ITEM_INTEGER: 
     985                    label = new wxStaticText(panel, -1, wxU(p_item->psz_text)); 
     986                    spin = new wxSpinCtrl( panel, -1, 
     987                                       wxString::Format(wxT("%d"),p_item->i_value), 
     988                                       wxDefaultPosition, wxDefaultSize, 
     989                                       wxSP_ARROW_KEYS, 
     990                                       -16000, 16000, p_item->i_value); 
     991                    spin->SetToolTip( wxU(p_item->psz_longtext) ); 
     992                    config_data->control.spinctrl = spin; 
     993                    panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL  
     994                        | wxALL, 5 ); 
     995                    panel_sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL  
     996                        | wxALL, 5 ); 
     997 
     998                    spin->SetClientData((void *)config_data); 
     999                    if( p_item->b_advanced ) b_has_advanced = VLC_TRUE; 
     1000                    break; 
     1001 
     1002                case CONFIG_ITEM_KEY: 
    8371003                { 
    838                     combo->Append( wxU(p_item->ppsz_list[i_index]) ); 
    839                     if( p_item->psz_value && !strcmp( p_item->psz_value, 
    840                                  p_item->ppsz_list[i_index] ) ) 
    841                         combo->SetSelection( i_index ); 
     1004                    label = new wxStaticText(panel, -1, wxU(p_item->psz_text)); 
     1005                    wxCheckBox *alt = new wxCheckBox( panel, -1, wxU(_("Alt")) ); 
     1006                    alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT ); 
     1007                    wxCheckBox *ctrl = new wxCheckBox( panel, -1, wxU(_("Ctrl")) ); 
     1008                    ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL ); 
     1009                    wxCheckBox *shift = new wxCheckBox( panel, -1,  
     1010                    wxU(_("Shift")) ); 
     1011                    shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT ); 
     1012                    combo = new wxComboBox( panel, -1, wxU("f"),  
     1013                wxDefaultPosition, wxDefaultSize, 0 
     1014                , NULL, wxCB_READONLY | wxCB_SORT ); 
     1015                    for( int i = 0; i < sizeof(keys)/sizeof(key_descriptor_s);  
     1016                    i++ ) 
     1017                    { 
     1018                        combo->Append( wxU(_(keys[i].psz_key_string)), 
     1019                         (void*)&keys[i].i_key_code ); 
     1020                    } 
     1021                    combo->SetValue( wxU( KeyToString(  
     1022                p_item->i_value&~KEY_MODIFIER ))); 
     1023                    config_data->control.combobox = combo; 
     1024                    panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL  
     1025                        | wxALL, 5 ); 
     1026                    panel_sizer->Add( alt, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); 
     1027                    panel_sizer->Add( ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); 
     1028                    panel_sizer->Add( shift, 0, wxALIGN_CENTER_VERTICAL | 
     1029                                 wxALL, 5 ); 
     1030                    panel_sizer->Add( combo, 0, wxALIGN_CENTER_VERTICAL  
     1031                                | wxALL, 5 ); 
     1032                    break; 
    8421033                } 
    843  
    844                 if( p_item->psz_value ) 
    845                     combo->SetValue( wxU(p_item->psz_value) ); 
    846                 combo->SetToolTip( wxU(p_item->psz_longtext) ); 
    847                 config_data->control.combobox = combo; 
    848                 config_data->b_config_list = VLC_TRUE; 
    849                 panel_sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); 
     1034             
     1035            case CONFIG_ITEM_FLOAT: 
     1036                    label = new wxStaticText(panel, -1, wxU(p_item->psz_text)); 
     1037                    textctrl = new wxTextCtrl( panel, -1, 
     1038                                 wxString::Format(wxT("%f"),p_item->f_value), 
     1039                                 wxDefaultPosition, wxDefaultSize, 
     1040                                 wxTE_PROCESS_ENTER ); 
     1041                    textctrl->SetToolTip( wxU(p_item->psz_longtext) ); 
     1042                    config_data->control.textctrl = textctrl; 
     1043                    panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL  
     1044                        | wxALL, 5 ); 
     1045                    panel_sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL  
     1046                        | wxALL, 5); 
     1047                    if( p_item->b_advanced ) b_has_advanced = VLC_TRUE; 
     1048                    break; 
     1049 
     1050                 case CONFIG_ITEM_BOOL: 
     1051                     checkbox = new wxCheckBox( panel, -1, wxU(p_item->psz_text) ); 
     1052                     if( p_item->i_value ) checkbox->SetValue(TRUE); 
     1053                     checkbox->SetToolTip( wxU(p_item->psz_longtext) ); 
     1054                     config_data->control.checkbox = checkbox; 
     1055                     panel_sizer->Add( checkbox, 0, wxALL, 5 ); 
     1056                     if( p_item->b_advanced ) b_has_advanced = VLC_TRUE; 
     1057                     break; 
     1058 
     1059 
     1060                 default: 
     1061                    delete panel; panel = NULL; 
     1062                    delete panel_sizer; 
     1063                delete config_data; 
     1064                break; 
    8501065            } 
    8511066 
    852             if( p_item->i_type == CONFIG_ITEM_FILE ) 
    853             { 
    854                 button = new wxButton( panel, -1, wxU(_("Browse...")) ); 
    855                 panel_sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); 
    856                 button->SetClientData((void *)config_data); 
    857             } 
    858             break; 
    859  
    860         case CONFIG_ITEM_INTEGER: 
    861             label = new wxStaticText(panel, -1, wxU(p_item->psz_text)); 
    862             spin = new wxSpinCtrl( panel, -1, 
    863                                    wxString::Format(wxT("%d"),p_item->i_value), 
    864                                    wxDefaultPosition, wxDefaultSize, 
    865                                    wxSP_ARROW_KEYS, 
    866                                    -16000, 16000, p_item->i_value); 
    867             spin->SetToolTip( wxU(p_item->psz_longtext) ); 
    868             config_data->control.spinctrl = spin; 
    869             panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); 
    870             panel_sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); 
    871  
    872             spin->SetClientData((void *)config_data); 
    873             break; 
    874  
    875         case CONFIG_ITEM_KEY: 
    876         { 
    877             label = new wxStaticText(panel, -1, wxU(p_item->psz_text)); 
    878             wxCheckBox *alt = new wxCheckBox( panel, -1, wxU(_("Alt")) ); 
    879             alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT ); 
    880             wxCheckBox *ctrl = new wxCheckBox( panel, -1, wxU(_("Ctrl")) ); 
    881             ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL ); 
    882             wxCheckBox *shift = new wxCheckBox( panel, -1, wxU(_("Shift")) ); 
    883             shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT ); 
    884             combo = new wxComboBox( panel, -1, wxU("f"), wxDefaultPosition, 
    885                 wxDefaultSize, 0, NULL, wxCB_READONLY | wxCB_SORT ); 
    886             for( int i = 0; i < sizeof(keys)/sizeof(key_descriptor_s); i++ ) 
    887             { 
    888                 combo->