/*****************************************************************************
* preferences.cpp : wxWindows plugin for vlc
*****************************************************************************
- * Copyright (C) 2000-2001 VideoLAN
- * $Id: preferences.cpp,v 1.19 2003/06/09 12:33:17 asmax Exp $
+ * Copyright (C) 2000-2004 VideoLAN
+ * $Id$
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
#include <stdio.h>
#include <vlc/vlc.h>
+#include <vlc/intf.h>
-#ifdef WIN32 /* mingw32 hack */
-#undef Yield
-#undef CreateDialog
-#endif
+#include <vlc_config_cat.h>
-/* Let vlc take care of the i18n stuff */
-#define WXINTL_NO_GETTEXT_MACRO
+#include "wxwindows.h"
+#include "preferences_widgets.h"
-#include <wx/wxprec.h>
-#include <wx/wx.h>
-#include <wx/window.h>
-#include <wx/notebook.h>
-#include <wx/textctrl.h>
#include <wx/combobox.h>
-#include <wx/spinctrl.h>
#include <wx/statline.h>
-#include <wx/treectrl.h>
#include <wx/clntdata.h>
#include <wx/dynarray.h>
-#include <vlc/intf.h>
-
-#if defined MODULE_NAME_IS_skins
-# include "../skins/src/skin_common.h"
-#endif
-
-#include "wxwindows.h"
-
#ifndef wxRB_SINGLE
# define wxRB_SINGLE 0
#endif
+#define TYPE_CATEGORY 0
+#define TYPE_SUBCATEGORY 1
+#define TYPE_MODULE 2
+
/*****************************************************************************
* Classes declarations.
*****************************************************************************/
+class ConfigTreeData;
class PrefsTreeCtrl : public wxTreeCtrl
{
public:
private:
/* Event handlers (these functions should _not_ be virtual) */
void OnSelectTreeItem( wxTreeEvent& event );
+ void OnAdvanced( wxCommandEvent& event );
+
+ ConfigTreeData *FindModuleConfig( ConfigTreeData *config_data );
DECLARE_EVENT_TABLE()
PrefsDialog *p_prefs_dialog;
wxBoxSizer *p_sizer;
wxWindow *p_parent;
+ vlc_bool_t b_advanced;
wxTreeItemId root_item;
wxTreeItemId plugins_item;
};
-struct ConfigData
-{
- ConfigData( wxPanel *_panel, int _i_conf_type,
- vlc_bool_t _b_advanced, char *psz_name )
- { panel = _panel; b_advanced = _b_advanced; b_config_list = VLC_FALSE;
- i_config_type = _i_conf_type; option_name = wxU(psz_name); }
-
- vlc_bool_t b_advanced;
- int i_config_type;
- vlc_bool_t b_config_list;
-
- union control
- {
- wxComboBox *combobox;
- wxRadioButton *radio;
- wxSpinCtrl *spinctrl;
- wxCheckBox *checkbox;
- wxTextCtrl *textctrl;
-
- } control;
-
- wxPanel *panel;
- wxString option_name;
-};
-
-WX_DEFINE_ARRAY(ConfigData *, ArrayOfConfigData);
+WX_DEFINE_ARRAY(ConfigControl *, ArrayOfConfigControls);
class PrefsPanel : public wxPanel
{
PrefsPanel() { }
PrefsPanel( wxWindow *parent, intf_thread_t *_p_intf,
- PrefsDialog *_p_prefs_dialog, int i_object_id, char * );
+ PrefsDialog *, ConfigTreeData* );
virtual ~PrefsPanel() {}
void ApplyChanges();
+ void SwitchAdvanced( vlc_bool_t );
private:
- void OnAdvanced( wxCommandEvent& WXUNUSED(event) );
- DECLARE_EVENT_TABLE()
-
intf_thread_t *p_intf;
PrefsDialog *p_prefs_dialog;
vlc_bool_t b_advanced;
+ wxStaticText *hidden_text;
wxBoxSizer *config_sizer;
wxScrolledWindow *config_window;
- ArrayOfConfigData config_array;
+ ArrayOfConfigControls config_array;
};
class ConfigTreeData : public wxTreeItemData
{
public:
- ConfigTreeData() { panel = NULL; psz_section = NULL; }
- virtual ~ConfigTreeData() { if( panel ) delete panel; }
+ ConfigTreeData() { b_submodule = 0; panel = NULL; psz_name = NULL;
+ psz_help = NULL; }
+ virtual ~ConfigTreeData() {
+ if( panel ) delete panel;
+ if( psz_name ) free( psz_name );
+ if( psz_help ) free( psz_help );
+ };
+
+ vlc_bool_t b_submodule;
PrefsPanel *panel;
wxBoxSizer *sizer;
- int i_object_id;
- char *psz_section;
-};
-
-class ConfigEvtHandler : public wxEvtHandler
-{
-public:
- ConfigEvtHandler( intf_thread_t *p_intf, PrefsDialog *p_prefs_dialog );
- virtual ~ConfigEvtHandler();
-
- void ConfigEvtHandler::OnCommandEvent( wxCommandEvent& event );
-private:
-
- DECLARE_EVENT_TABLE()
-
- intf_thread_t *p_intf;
- PrefsDialog *p_prefs_dialog;
+ int i_object_id;
+ int i_type;
+ char *psz_name;
+ char *psz_help;
};
/*****************************************************************************
EVT_BUTTON(wxID_CANCEL, PrefsDialog::OnCancel)
EVT_BUTTON(wxID_SAVE, PrefsDialog::OnSave)
EVT_BUTTON(ResetAll_Event, PrefsDialog::OnResetAll)
+ EVT_CHECKBOX(Advanced_Event, PrefsDialog::OnAdvanced)
/* Don't destroy the window when the user closes it */
EVT_CLOSE(PrefsDialog::OnCancel)
BEGIN_EVENT_TABLE(PrefsTreeCtrl, wxTreeCtrl)
EVT_TREE_SEL_CHANGED(PrefsTree_Ctrl, PrefsTreeCtrl::OnSelectTreeItem)
-END_EVENT_TABLE()
-
-BEGIN_EVENT_TABLE(PrefsPanel, wxPanel)
- /* Button events */
- EVT_CHECKBOX(Advanced_Event, PrefsPanel::OnAdvanced)
-
-END_EVENT_TABLE()
-
-BEGIN_EVENT_TABLE(ConfigEvtHandler, wxEvtHandler)
- EVT_BUTTON(-1, ConfigEvtHandler::OnCommandEvent)
- EVT_TEXT(-1, ConfigEvtHandler::OnCommandEvent)
- EVT_RADIOBOX(-1, ConfigEvtHandler::OnCommandEvent)
- EVT_SPINCTRL(-1, ConfigEvtHandler::OnCommandEvent)
+ EVT_COMMAND(Advanced_Event, wxEVT_USER_FIRST, PrefsTreeCtrl::OnAdvanced)
END_EVENT_TABLE()
/*****************************************************************************
*****************************************************************************/
PrefsDialog::PrefsDialog( intf_thread_t *_p_intf, wxWindow *p_parent)
: wxFrame( p_parent, -1, wxU(_("Preferences")), wxDefaultPosition,
- wxSize(650,450), wxDEFAULT_FRAME_STYLE )
+ wxSize(700,450), wxDEFAULT_FRAME_STYLE )
{
/* Initializations */
p_intf = _p_intf;
wxButton *reset_button = new wxButton( panel, ResetAll_Event,
wxU(_("Reset All")) );
+ wxPanel *dummy_panel = new wxPanel( this, -1 );
+ wxCheckBox *advanced_checkbox =
+ new wxCheckBox( panel, Advanced_Event, wxU(_("Advanced options")) );
+
+ if( config_GetInt( p_intf, "advanced" ) )
+ {
+ advanced_checkbox->SetValue(TRUE);
+ wxCommandEvent dummy_event;
+ dummy_event.SetInt(TRUE);
+ OnAdvanced( dummy_event );
+ }
+
/* Place everything in sizers */
wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
button_sizer->Add( ok_button, 0, wxALL, 5 );
button_sizer->Add( cancel_button, 0, wxALL, 5 );
button_sizer->Add( save_button, 0, wxALL, 5 );
button_sizer->Add( reset_button, 0, wxALL, 5 );
+ button_sizer->Add( dummy_panel, 1, wxALL, 5 );
+ button_sizer->Add( advanced_checkbox, 0, wxALL | wxALIGN_RIGHT |
+ wxALIGN_CENTER_VERTICAL, 0 );
button_sizer->Layout();
wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
panel_sizer->Add( controls_sizer, 1, wxEXPAND | wxALL, 5 );
panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALIGN_BOTTOM |
- wxALL, 5 );
+ wxALL | wxEXPAND, 5 );
panel_sizer->Layout();
panel->SetSizer( panel_sizer );
main_sizer->Add( panel, 1, wxEXPAND, 0 );
{
prefs_tree->ApplyChanges();
config_SaveConfigFile( p_intf, NULL );
+ this->Hide();
}
void PrefsDialog::OnResetAll( wxCommandEvent& WXUNUSED(event) )
{
wxMessageDialog dlg( this,
- wxU(_("Beware this will reset your VLC Media Player config file.\n"
+ wxU(_("Beware this will reset your VLC media player preferences.\n"
"Are you sure you want to continue?")),
- wxU(_("Reset config file")), wxYES_NO|wxNO_DEFAULT|wxCENTRE );
+ wxU(_("Reset Preferences")), wxYES_NO|wxNO_DEFAULT|wxCENTRE );
if ( dlg.ShowModal() == wxID_YES )
{
}
}
+void PrefsDialog::OnAdvanced( wxCommandEvent& event )
+{
+ wxCommandEvent newevent( wxEVT_USER_FIRST, Advanced_Event );
+ newevent.SetInt( event.GetInt() );
+
+ prefs_tree->AddPendingEvent( newevent );
+}
+
/*****************************************************************************
* PrefsTreeCtrl class definition.
*****************************************************************************/
wxTR_LINES_AT_ROOT | wxTR_HIDE_ROOT |
wxTR_HAS_BUTTONS | wxTR_TWIST_BUTTONS | wxSUNKEN_BORDER )
{
- vlc_list_t *p_list;
+ vlc_list_t *p_list = NULL;;
module_t *p_module;
module_config_t *p_item;
int i_index;
p_prefs_dialog = _p_prefs_dialog;
p_sizer = _p_sizer;
p_parent = _p_parent;
+ b_advanced = VLC_FALSE;
root_item = AddRoot( wxT("") );
p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE );
if( !p_list ) return;
- /*
- * Build a tree of the main options
- */
+ /* Build the categories list */
for( i_index = 0; i_index < p_list->i_count; i_index++ )
{
p_module = (module_t *)p_list->p_values[i_index].p_object;
}
if( i_index < p_list->i_count )
{
+ wxTreeItemId current_item;
+ char *psz_help;
/* We found the main module */
/* Enumerate config categories and store a reference so we can
if( p_item ) do
{
+ ConfigTreeData *config_data;
switch( p_item->i_type )
{
- case CONFIG_HINT_CATEGORY:
- ConfigTreeData *config_data = new ConfigTreeData;
- config_data->psz_section = strdup(p_item->psz_text);
- config_data->i_object_id = p_module->i_object_id;
+ case CONFIG_CATEGORY:
+ config_data = new ConfigTreeData;
+ config_data->psz_name = strdup( config_CategoryNameGet(
+ p_item->i_value ) );
+ psz_help = config_CategoryHelpGet( p_item->i_value );
+ if( psz_help )
+ {
+ config_data->psz_help = wraptext( strdup( psz_help ),
+ 72 , ISUTF8 );
+ }
+ else
+ {
+ config_data->psz_help = NULL;
+ }
+ config_data->i_type = TYPE_CATEGORY;
+ config_data->i_object_id = p_item->i_value;
/* Add the category to the tree */
- AppendItem( root_item, wxU(p_item->psz_text),
+ current_item = AppendItem( root_item,
+ wxU( config_data->psz_name ),
+ -1, -1, config_data );
+ break;
+ case CONFIG_SUBCATEGORY:
+ config_data = new ConfigTreeData;
+ config_data->psz_name = strdup( config_CategoryNameGet(
+ p_item->i_value ) );
+ psz_help = config_CategoryHelpGet( p_item->i_value );
+ if( psz_help )
+ {
+ config_data->psz_help = wraptext( strdup( psz_help ) ,
+ 72 , ISUTF8 );
+ }
+ else
+ {
+ config_data->psz_help = NULL;
+ }
+ config_data->i_type = TYPE_SUBCATEGORY;
+ config_data->i_object_id = p_item->i_value;
+ AppendItem( current_item, wxU( config_data->psz_name ),
-1, -1, config_data );
break;
}
}
while( p_item->i_type != CONFIG_HINT_END && p_item++ );
- SortChildren( root_item );
}
/*
* Build a tree of all the plugins
*/
- plugins_item = AppendItem( root_item, wxU(_("Plugins")) );
-
for( i_index = 0; i_index < p_list->i_count; i_index++ )
{
+ int i_category = -1;
+ int i_subcategory = -1;
+ int i_options = 0;
+
p_module = (module_t *)p_list->p_values[i_index].p_object;
/* Exclude the main module */
if( !strcmp( p_module->psz_object_name, "main" ) )
continue;
- /* Exclude empty plugins */
- p_item = p_module->p_config;
+ /* Exclude empty plugins (submodules don't have config options, they
+ * are stored in the parent module) */
+ if( p_module->b_submodule )
+ continue;
+// p_item = ((module_t *)p_module->p_parent)->p_config;
+ else
+ p_item = p_module->p_config;
+
if( !p_item ) continue;
do
{
+ if( p_item->i_type == CONFIG_CATEGORY )
+ {
+ i_category = p_item->i_value;
+ }
+ else if( p_item->i_type == CONFIG_SUBCATEGORY )
+ {
+ i_subcategory = p_item->i_value;
+ }
if( p_item->i_type & CONFIG_ITEM )
+ i_options ++;
+ if( i_options > 0 && i_category >= 0 && i_subcategory >= 0 )
+ {
break;
+ }
}
while( p_item->i_type != CONFIG_HINT_END && p_item++ );
- if( p_item->i_type == CONFIG_HINT_END ) continue;
- /* Find the capability child item */
- long cookie; size_t i_child_index;
- wxTreeItemId capability_item = GetFirstChild( plugins_item, cookie);
- for( i_child_index = 0;
- i_child_index < GetChildrenCount( plugins_item, FALSE );
- i_child_index++ )
+ if( !i_options ) continue;
+
+ /* Find the right category item */
+ long cookie;
+ vlc_bool_t b_found = VLC_FALSE;
+ wxTreeItemId category_item = GetFirstChild( root_item , cookie);
+ while( category_item.IsOk() )
{
- if( !GetItemText(capability_item).Cmp(
- wxU(p_module->psz_capability ) ) )
+ ConfigTreeData *config_data =
+ (ConfigTreeData *)GetItemData( category_item );
+ if( config_data->i_object_id == i_category )
{
+ b_found = VLC_TRUE;
break;
}
- capability_item = GetNextChild( plugins_item, cookie );
+ category_item = GetNextChild( root_item, cookie );
}
- if( i_child_index == GetChildrenCount( plugins_item, FALSE ) &&
- p_module->psz_capability && *p_module->psz_capability )
+ if( !b_found ) continue;
+
+ /* Find subcategory item */
+ b_found = VLC_FALSE;
+ cookie = -1;
+ wxTreeItemId subcategory_item = GetFirstChild( category_item, cookie );
+ while( subcategory_item.IsOk() )
+ {
+ ConfigTreeData *config_data =
+ (ConfigTreeData *)GetItemData( subcategory_item );
+ if( config_data->i_object_id == i_subcategory )
+ {
+ b_found = VLC_TRUE;
+ break;
+ }
+ subcategory_item = GetNextChild( category_item, cookie );
+ }
+ if( !b_found )
{
- /* We didn't find it, add it */
- capability_item = AppendItem( plugins_item,
- wxU(p_module->psz_capability) );
+ subcategory_item = category_item;
}
/* Add the plugin to the tree */
ConfigTreeData *config_data = new ConfigTreeData;
- config_data->i_object_id = p_module->i_object_id;
- AppendItem( capability_item, wxU(p_module->psz_object_name), -1, -1,
+ config_data->b_submodule = p_module->b_submodule;
+ config_data->i_type = TYPE_MODULE;
+ config_data->i_object_id = p_module->b_submodule ?
+ ((module_t *)p_module->p_parent)->i_object_id :
+ p_module->i_object_id;
+ config_data->psz_help = NULL;
+
+ AppendItem( subcategory_item, wxU( p_module->psz_name ?
+ p_module->psz_name : p_module->psz_object_name)
+ , -1, -1,
config_data );
}
/* Sort all this mess */
long cookie; size_t i_child_index;
- SortChildren( plugins_item );
- wxTreeItemId capability_item = GetFirstChild( plugins_item, cookie);
+ wxTreeItemId capability_item = GetFirstChild( root_item, cookie);
for( i_child_index = 0;
i_child_index < GetChildrenCount( plugins_item, FALSE );
i_child_index++ )
{
- capability_item = GetNextChild( plugins_item, cookie );
SortChildren( capability_item );
+ capability_item = GetNextChild( plugins_item, cookie );
}
/* Clean-up everything */
#ifndef WIN32 /* Workaround a bug in win32 implementation */
SelectItem( GetFirstChild( root_item, cookie ) );
#endif
+
+ Expand( root_item );
}
PrefsTreeCtrl::~PrefsTreeCtrl()
void PrefsTreeCtrl::ApplyChanges()
{
- long cookie, cookie2;
+ long cookie, cookie2, cookie3;
ConfigTreeData *config_data;
- /* Apply changes to the main module */
- wxTreeItemId item = GetFirstChild( root_item, cookie );
- for( size_t i_child_index = 0;
- i_child_index < GetChildrenCount( root_item, FALSE );
- i_child_index++ )
+ wxTreeItemId category = GetFirstChild( root_item, cookie );
+ while( category.IsOk() )
{
- config_data = (ConfigTreeData *)GetItemData( item );
+ wxTreeItemId subcategory = GetFirstChild( category, cookie2 );
+ while( subcategory.IsOk() )
+ {
+ wxTreeItemId module = GetFirstChild( subcategory, cookie3 );
+ while( module.IsOk() )
+ {
+ config_data = (ConfigTreeData *)GetItemData( module );
+ if( config_data && config_data->panel )
+ {
+ config_data->panel->ApplyChanges();
+ }
+ module = GetNextChild( subcategory, cookie3 );
+ }
+ config_data = (ConfigTreeData *)GetItemData( subcategory );
+ if( config_data && config_data->panel )
+ {
+ config_data->panel->ApplyChanges();
+ }
+ subcategory = GetNextChild( category, cookie2 );
+ }
+ config_data = (ConfigTreeData *)GetItemData( category );
if( config_data && config_data->panel )
{
config_data->panel->ApplyChanges();
}
+ category = GetNextChild( root_item, cookie );
+ }
+}
- item = GetNextChild( root_item, cookie );
+void PrefsTreeCtrl::CleanChanges()
+{
+ long cookie, cookie2, cookie3;
+ ConfigTreeData *config_data;
+
+ config_data = !GetSelection() ? NULL :
+ FindModuleConfig( (ConfigTreeData *)GetItemData( GetSelection() ) );
+ if( config_data )
+ {
+ config_data->panel->Hide();
+ p_sizer->Remove( config_data->panel );
}
- /* Apply changes to the plugins */
- item = GetFirstChild( plugins_item, cookie );
- for( size_t i_child_index = 0;
- i_child_index < GetChildrenCount( plugins_item, FALSE );
- i_child_index++ )
+ wxTreeItemId category = GetFirstChild( root_item, cookie );
+ while( category.IsOk() )
{
- wxTreeItemId item2 = GetFirstChild( item, cookie2 );
- for( size_t i_child_index = 0;
- i_child_index < GetChildrenCount( item, FALSE );
- i_child_index++ )
+ wxTreeItemId subcategory = GetFirstChild( category, cookie2 );
+ while( subcategory.IsOk() )
{
- config_data = (ConfigTreeData *)GetItemData( item2 );
+ wxTreeItemId module = GetFirstChild( subcategory, cookie3 );
+ while( module.IsOk() )
+ {
+ config_data = (ConfigTreeData *)GetItemData( module );
+ if( config_data && config_data->panel )
+ {
+ delete config_data->panel;
+ config_data->panel = NULL;
+ }
+ module = GetNextChild( subcategory, cookie3 );
+ }
+ config_data = (ConfigTreeData *)GetItemData( subcategory );
if( config_data && config_data->panel )
{
- config_data->panel->ApplyChanges();
+ delete config_data->panel;
+ config_data->panel = NULL;
}
-
- item2 = GetNextChild( item, cookie2 );
+ subcategory = GetNextChild( category, cookie2 );
}
-
- item = GetNextChild( plugins_item, cookie );
+ config_data = (ConfigTreeData *)GetItemData( category );
+ if( config_data && config_data->panel )
+ {
+ delete config_data->panel;
+ config_data->panel = NULL;
+ }
+ category = GetNextChild( root_item, cookie );
}
-}
-
-void PrefsTreeCtrl::CleanChanges()
-{
- long cookie, cookie2;
- ConfigTreeData *config_data;
+#if 0
/* Clean changes for the main module */
wxTreeItemId item = GetFirstChild( root_item, cookie );
for( size_t i_child_index = 0;
config_data = (ConfigTreeData *)GetItemData( item );
if( config_data && config_data->panel )
{
- if( item == GetSelection() )
- {
- config_data->panel->Hide();
- p_sizer->Remove( config_data->panel );
- }
-
delete config_data->panel;
config_data->panel = NULL;
-
- if( item == GetSelection() )
- {
- wxTreeEvent event;
- OnSelectTreeItem( event );
- }
}
item = GetNextChild( root_item, cookie );
}
-
/* Clean changes for the plugins */
item = GetFirstChild( plugins_item, cookie );
for( size_t i_child_index = 0;
if( config_data && config_data->panel )
{
- if( item2 == GetSelection() )
- {
- config_data->panel->Hide();
- p_sizer->Remove( config_data->panel );
- }
-
delete config_data->panel;
config_data->panel = NULL;
-
- if( item2 == GetSelection() )
- {
- wxTreeEvent event;
- OnSelectTreeItem( event );
- }
}
item2 = GetNextChild( item, cookie2 );
item = GetNextChild( plugins_item, cookie );
}
+#endif
+ if( GetSelection() )
+ {
+ wxTreeEvent event;
+ OnSelectTreeItem( event );
+ }
+}
+
+ConfigTreeData *PrefsTreeCtrl::FindModuleConfig( ConfigTreeData *config_data )
+{
+ /* We need this complexity because submodules don't have their own config
+ * options. They use the parent module ones. */
+
+ if( !config_data || !config_data->b_submodule )
+ {
+ return config_data;
+ }
+
+ long cookie, cookie2, cookie3;
+ ConfigTreeData *config_new;
+ wxTreeItemId category = GetFirstChild( root_item, cookie );
+ while( category.IsOk() )
+ {
+ wxTreeItemId subcategory = GetFirstChild( category, cookie2 );
+ while( subcategory.IsOk() )
+ {
+ wxTreeItemId module = GetFirstChild( subcategory, cookie3 );
+ while( module.IsOk() )
+ {
+ config_new = (ConfigTreeData *)GetItemData( module );
+ if( config_new && !config_new->b_submodule &&
+ config_new->i_object_id == config_data->i_object_id )
+ {
+ return config_new;
+ }
+ module = GetNextChild( subcategory, cookie3 );
+ }
+ subcategory = GetNextChild( category, cookie2 );
+ }
+ category = GetNextChild( root_item, cookie );
+ }
+
+ /* Found nothing */
+ return NULL;
}
void PrefsTreeCtrl::OnSelectTreeItem( wxTreeEvent& event )
{
- ConfigTreeData *config_data;
+ ConfigTreeData *config_data = NULL;
- config_data = (ConfigTreeData *)GetItemData( event.GetOldItem() );
+ if( event.GetOldItem() )
+ config_data = FindModuleConfig( (ConfigTreeData *)GetItemData(
+ event.GetOldItem() ) );
if( config_data && config_data->panel )
{
config_data->panel->Hide();
}
/* Don't use event.GetItem() because we also send fake events */
- config_data = (ConfigTreeData *)GetItemData( GetSelection() );
+ config_data = FindModuleConfig( (ConfigTreeData *)GetItemData(
+ GetSelection() ) );
if( config_data )
{
if( !config_data->panel )
/* The panel hasn't been created yet. Let's do it. */
config_data->panel =
new PrefsPanel( p_parent, p_intf, p_prefs_dialog,
- config_data->i_object_id,
- config_data->psz_section );
+ config_data );
+ config_data->panel->SwitchAdvanced( b_advanced );
}
else
{
+ config_data->panel->SwitchAdvanced( b_advanced );
config_data->panel->Show();
}
- p_sizer->Add( config_data->panel, 2, wxEXPAND | wxALL, 0 );
+ p_sizer->Add( config_data->panel, 3, wxEXPAND | wxALL, 0 );
p_sizer->Layout();
}
}
+void PrefsTreeCtrl::OnAdvanced( wxCommandEvent& event )
+{
+ b_advanced = event.GetInt();
+
+ ConfigTreeData *config_data = !GetSelection() ? NULL :
+ FindModuleConfig( (ConfigTreeData *)GetItemData( GetSelection() ) );
+ if( config_data )
+ {
+ config_data->panel->Hide();
+ p_sizer->Remove( config_data->panel );
+ }
+
+ if( GetSelection() )
+ {
+ wxTreeEvent event;
+ OnSelectTreeItem( event );
+ }
+}
+
/*****************************************************************************
* PrefsPanel class definition.
*****************************************************************************/
PrefsPanel::PrefsPanel( wxWindow* parent, intf_thread_t *_p_intf,
PrefsDialog *_p_prefs_dialog,
- int i_object_id, char *psz_section )
+ ConfigTreeData *config_data )
: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize )
{
module_config_t *p_item;
- vlc_list_t *p_list;
- module_t *p_parser;
+ vlc_list_t *p_list = NULL;;
wxStaticText *label;
- wxComboBox *combo;
- wxSpinCtrl *spin;
- wxCheckBox *checkbox;
- wxTextCtrl *textctrl;
- wxButton *button;
+ wxStaticText *help;
wxArrayString array;
+ module_t *p_module = NULL;
+
/* Initializations */
p_intf = _p_intf;
p_prefs_dialog =_p_prefs_dialog,
b_advanced = VLC_TRUE;
SetAutoLayout( TRUE );
+ Hide();
wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL );
- /* Get a pointer to the module */
- module_t *p_module = (module_t *)vlc_object_get( p_intf, i_object_id );
- if( p_module->i_object_type != VLC_OBJECT_MODULE )
+
+ if( config_data->i_type == TYPE_CATEGORY )
{
- /* 0OOoo something went really bad */
- return;
+ label = new wxStaticText( this, -1,wxU(_( config_data->psz_name )));
+ wxFont heading_font = label->GetFont();
+ heading_font.SetPointSize( heading_font.GetPointSize() + 5 );
+ label->SetFont( heading_font );
+ sizer->Add( label, 0, wxEXPAND | wxLEFT, 10 );
+ sizer->Add( new wxStaticLine( this, 0 ), 0,
+ wxEXPAND | wxLEFT | wxRIGHT, 2 );
+
+ hidden_text = NULL;
+ help = new wxStaticText( this, -1, wxU(_( config_data->psz_help ) ) );
+ sizer->Add( help ,0 ,wxEXPAND | wxALL, 5 );
+
+ config_sizer = NULL; config_window = NULL;
}
-
- /* Enumerate config options and add corresponding config boxes */
- p_item = p_module->p_config;
-
- /* Find the category if it has been specified */
- if( psz_section && p_item->i_type == CONFIG_HINT_CATEGORY )
+ else
{
- while( !p_item->i_type == CONFIG_HINT_CATEGORY ||
- strcmp( psz_section, p_item->psz_text ) )
+ /* Get a pointer to the module */
+ if( config_data->i_type == TYPE_MODULE )
{
- if( p_item->i_type == CONFIG_HINT_END )
- break;
- p_item++;
+ p_module = (module_t *)vlc_object_get( p_intf,
+ config_data->i_object_id );
}
- }
-
- /* Add a head title to the panel */
- wxStaticBox *static_box = new wxStaticBox( this, -1, wxT("") );
- wxStaticBoxSizer *box_sizer = new wxStaticBoxSizer( static_box,
- wxHORIZONTAL );
- label = new wxStaticText( this, -1,
- wxU(psz_section ? p_item->psz_text :
- p_module->psz_longname) );
-
- box_sizer->Add( label, 1, wxALL, 5 );
- sizer->Add( box_sizer, 0, wxEXPAND | wxALL, 5 );
-
- /* Now put all the config options into a scrolled window */
- config_sizer = new wxBoxSizer( wxVERTICAL );
- config_window = new wxScrolledWindow( this, -1, wxDefaultPosition,
- wxDefaultSize, wxSTATIC_BORDER | wxHSCROLL | wxVSCROLL );
- config_window->SetAutoLayout( TRUE );
- config_window->SetScrollRate( 5, 5 );
-
- if( p_item ) do
- {
- /* If a category has been specified, check we finished the job */
- if( psz_section && p_item->i_type == CONFIG_HINT_CATEGORY &&
- strcmp( psz_section, p_item->psz_text ) )
- break;
-
- /* put each config option in a separate panel so we can hide advanced
- * options easily */
- wxPanel *panel = new wxPanel( config_window, -1, wxDefaultPosition,
- wxDefaultSize );
- wxBoxSizer *panel_sizer = new wxBoxSizer( wxHORIZONTAL );
- ConfigData *config_data =
- new ConfigData( panel, p_item->i_type,
- p_item->b_advanced, p_item->psz_name );
-
- switch( p_item->i_type )
+ else
{
- case CONFIG_ITEM_MODULE:
- label = new wxStaticText(panel, -1, wxU(p_item->psz_text));
- combo = new wxComboBox( panel, -1, wxU(p_item->psz_value),
- wxDefaultPosition, wxDefaultSize,
- 0, NULL, wxCB_READONLY | wxCB_SORT );
-
- /* build a list of available modules */
+ /* List the plugins */
+ int i_index;
+ vlc_bool_t b_found = VLC_FALSE;
p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE );
- combo->Append( wxU(_("Default")), (void *)NULL );
- combo->SetSelection( 0 );
- for( int i_index = 0; i_index < p_list->i_count; i_index++ )
- {
- p_parser = (module_t *)p_list->p_values[i_index].p_object ;
+ if( !p_list ) return;
- if( !strcmp( p_parser->psz_capability,
- p_item->psz_type ) )
- {
- combo->Append( wxU(p_parser->psz_longname),
- p_parser->psz_object_name );
- if( p_item->psz_value &&
- !strcmp(p_item->psz_value, p_parser->psz_object_name) )
- combo->SetValue( wxU(p_parser->psz_longname) );
- }
- }
- vlc_list_release( p_list );
-
- combo->SetToolTip( wxU(p_item->psz_longtext) );
- config_data->control.combobox = combo;
- panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- panel_sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- break;
-
- case CONFIG_ITEM_STRING:
- case CONFIG_ITEM_FILE:
- case CONFIG_ITEM_DIRECTORY:
- label = new wxStaticText(panel, -1, wxU(p_item->psz_text));
- panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
-
- if( !p_item->ppsz_list )
- {
- textctrl = new wxTextCtrl( panel, -1, wxU(p_item->psz_value),
- wxDefaultPosition, wxDefaultSize,
- wxTE_PROCESS_ENTER);
- textctrl->SetToolTip( wxU(p_item->psz_longtext) );
- config_data->control.textctrl = textctrl;
- panel_sizer->Add( textctrl, 1, wxALL, 5 );
- }
- else
+ for( i_index = 0; i_index < p_list->i_count; i_index++ )
{
- combo = new wxComboBox( panel, -1, wxU(p_item->psz_value),
- wxDefaultPosition, wxDefaultSize,
- 0, NULL, wxCB_READONLY | wxCB_SORT );
-
- /* build a list of available options */
- for( int i_index = 0; p_item->ppsz_list[i_index]; i_index++ )
+ p_module = (module_t *)p_list->p_values[i_index].p_object;
+ if( !strcmp( p_module->psz_object_name, "main" ) )
{
- combo->Append( wxU(p_item->ppsz_list[i_index]) );
+ b_found = VLC_TRUE;
+ break;
}
-
- if( p_item->psz_value )
- combo->SetValue( wxU(p_item->psz_value) );
- combo->SetToolTip( wxU(p_item->psz_longtext) );
- config_data->control.combobox = combo;
- config_data->b_config_list = VLC_TRUE;
- panel_sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
}
-
- if( p_item->i_type == CONFIG_ITEM_FILE )
+ if( !p_module && !b_found )
{
- button = new wxButton( panel, -1, wxU(_("Browse...")) );
- panel_sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
- button->SetClientData((void *)config_data);
+ msg_Warn( p_intf, "ohoh, unable to find main module");
+ return;
}
- break;
-
- case CONFIG_ITEM_INTEGER:
- label = new wxStaticText(panel, -1, wxU(p_item->psz_text));
- spin = new wxSpinCtrl( panel, -1,
- wxString::Format(wxT("%d"),p_item->i_value),
- wxDefaultPosition, wxDefaultSize,
- wxSP_ARROW_KEYS,
- -16000, 16000, p_item->i_value);
- spin->SetToolTip( wxU(p_item->psz_longtext) );
- config_data->control.spinctrl = spin;
- panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- panel_sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
-
- spin->SetClientData((void *)config_data);
- break;
-
- case CONFIG_ITEM_FLOAT:
- label = new wxStaticText(panel, -1, wxU(p_item->psz_text));
- spin = new wxSpinCtrl( panel, -1,
- wxString::Format(wxT("%f"),p_item->f_value),
- wxDefaultPosition, wxDefaultSize,
- wxSP_ARROW_KEYS,
- -16000, 16000, (int)p_item->f_value);
- spin->SetToolTip( wxU(p_item->psz_longtext) );
- config_data->control.spinctrl = spin;
- panel_sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- panel_sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- break;
-
- case CONFIG_ITEM_BOOL:
- checkbox = new wxCheckBox( panel, -1, wxU(p_item->psz_text) );
- if( p_item->i_value ) checkbox->SetValue(TRUE);
- checkbox->SetToolTip( wxU(p_item->psz_longtext) );
- config_data->control.checkbox = checkbox;
- panel_sizer->Add( checkbox, 0, wxALL, 5 );
- break;
+ }
- default:
- delete panel; panel = NULL;
- delete panel_sizer;
- delete config_data;
- break;
+ if( p_module->i_object_type != VLC_OBJECT_MODULE )
+ {
+ /* 0OOoo something went really bad */
+ return;
}
- /* Don't add items that were not recognized */
- if( panel == NULL ) continue;
+ /* Enumerate config options and add corresponding config boxes
+ * (submodules don't have config options, they are stored in the
+ * parent module) */
+ if( p_module->b_submodule )
+ p_item = ((module_t *)p_module->p_parent)->p_config;
+ else
+ p_item = p_module->p_config;
- panel_sizer->Layout();
- panel->SetSizerAndFit( panel_sizer );
+ /* Find the category if it has been specified */
+ if( config_data->i_type == TYPE_SUBCATEGORY )
+ {
+ do
+ {
+ if( p_item->i_type == CONFIG_SUBCATEGORY &&
+ p_item->i_value == config_data->i_object_id )
+ {
+ break;
+ }
+ if( p_item->i_type == CONFIG_HINT_END )
+ break;
+ } while( p_item++ );
+ }
- /* Add the config data to our array so we can keep a trace of it */
- config_array.Add( config_data );
+ /* Add a head title to the panel */
+ char *psz_head;
+ if( config_data->i_type == TYPE_SUBCATEGORY )
+ {
+ psz_head = config_data->psz_name;
+ p_item++;
+ }
+ else
+ {
+ psz_head = p_module->psz_longname;
+ }
- config_sizer->Add( panel, 0, wxEXPAND | wxALL, 2 );
- }
- while( p_item->i_type != CONFIG_HINT_END && p_item++ );
+ label = new wxStaticText( this, -1,
+ wxU(_( psz_head ? psz_head : _("Unknown") ) ) );
+ wxFont heading_font = label->GetFont();
+ heading_font.SetPointSize( heading_font.GetPointSize() + 5 );
+ label->SetFont( heading_font );
+ sizer->Add( label, 0, wxEXPAND | wxLEFT, 10 );
+ sizer->Add( new wxStaticLine( this, 0 ), 0,
+ wxEXPAND | wxLEFT | wxRIGHT, 2 );
+
+ /* Now put all the config options into a scrolled window */
+ config_sizer = new wxBoxSizer( wxVERTICAL );
+ config_window = new wxScrolledWindow( this, -1, wxDefaultPosition,
+ wxDefaultSize, wxBORDER_NONE | wxHSCROLL | wxVSCROLL );
+ config_window->SetAutoLayout( TRUE );
+ config_window->SetScrollRate( 5, 5 );
- /* Display a nice message if no configuration options are available */
- if( !config_array.GetCount() )
- {
- config_sizer->Add( new wxStaticText( config_window, -1,
- wxU(_("No configuration options available")) ), 1,
- wxALIGN_CENTER_VERTICAL | wxALIGN_CENTER, 2 );
- }
+ if( p_item ) do
+ {
+ /* If a category has been specified, check we finished the job */
+ if( config_data->i_type == TYPE_SUBCATEGORY &&
+ (p_item->i_type == CONFIG_CATEGORY ||
+ p_item->i_type == CONFIG_SUBCATEGORY ) &&
+ p_item->i_value != config_data->i_object_id )
+ break;
- config_sizer->Layout();
- config_window->SetSizer( config_sizer );
- sizer->Add( config_window, 1, wxEXPAND | wxALL, 5 );
+ ConfigControl *control =
+ CreateConfigControl( VLC_OBJECT(p_intf),
+ p_item, config_window );
- /* Intercept all menu events in our custom event handler */
- config_window->PushEventHandler(
- new ConfigEvtHandler( p_intf, p_prefs_dialog ) );
+ /* Don't add items that were not recognized */
+ if( control == NULL ) continue;
- /* Update panel */
- wxCommandEvent dummy_event;
- b_advanced = !config_GetInt( p_intf, "advanced" );
- OnAdvanced( dummy_event );
+ /* Add the config data to our array so we can keep a trace of it */
+ config_array.Add( control );
- /* Create advanced checkbox */
- if( config_array.GetCount() )
- {
- wxCheckBox *advanced_checkbox =
- new wxCheckBox( this, Advanced_Event, wxU(_("Advanced options")) );
+ config_sizer->Add( control, 0, wxEXPAND | wxALL, 2 );
+ }
+ while( !( p_item->i_type == CONFIG_HINT_END ||
+ ( config_data->i_type == TYPE_SUBCATEGORY &&
+ ( p_item->i_type == CONFIG_CATEGORY ||
+ p_item->i_type == CONFIG_SUBCATEGORY ) ) ) && p_item++ );
+
+
+ config_sizer->Layout();
+ config_window->SetSizer( config_sizer );
+ sizer->Add( config_window, 1, wxEXPAND | wxALL, 5 );
+ hidden_text = new wxStaticText( this, -1,
+ wxU( _( "Some options are available but hidden. " \
+ "Check \"Advanced options\" to see them." ) ) );
+ sizer->Add( hidden_text );
+
+ /* And at last put a useful help string if available */
+ if( config_data->psz_help && *config_data->psz_help )
+ {
+ sizer->Add( new wxStaticLine( this, 0 ), 0,
+ wxEXPAND | wxLEFT | wxRIGHT, 2 );
+ help = new wxStaticText( this, -1, wxU(_(config_data->psz_help)),
+ wxDefaultPosition, wxDefaultSize,
+ wxALIGN_LEFT,
+ wxT("") );
+ sizer->Add( help ,0 ,wxEXPAND | wxALL, 5 );
+ }
- if( b_advanced ) advanced_checkbox->SetValue(TRUE);
- sizer->Add( advanced_checkbox, 0, wxALL|wxALIGN_RIGHT, 0 );
+ if( config_data->i_type == TYPE_MODULE )
+ {
+ vlc_object_release( p_module );
+ }
+ else
+ {
+ vlc_list_release( p_list );
+ }
}
-
sizer->Layout();
SetSizer( sizer );
+ Show();
}
void PrefsPanel::ApplyChanges()
{
+ vlc_value_t val;
+
for( size_t i = 0; i < config_array.GetCount(); i++ )
{
- ConfigData *config_data = config_array.Item(i);
+ ConfigControl *control = config_array.Item(i);
- switch( config_data->i_config_type )
+ switch( control->GetType() )
{
- case CONFIG_ITEM_MODULE:
- config_PutPsz( p_intf, config_data->option_name.mb_str(), (char *)
- config_data->control.combobox->GetClientData(
- config_data->control.combobox->GetSelection() ) );
- break;
case CONFIG_ITEM_STRING:
case CONFIG_ITEM_FILE:
case CONFIG_ITEM_DIRECTORY:
- if( !config_data->b_config_list )
- config_PutPsz( p_intf, config_data->option_name.mb_str(),
- config_data->control.textctrl->GetValue().mb_str() );
- else
- config_PutPsz( p_intf, config_data->option_name.mb_str(),
- config_data->control.combobox->GetValue().mb_str() );
- break;
- case CONFIG_ITEM_BOOL:
- config_PutInt( p_intf, config_data->option_name.mb_str(),
- config_data->control.checkbox->IsChecked() );
+ case CONFIG_ITEM_MODULE:
+ case CONFIG_ITEM_MODULE_LIST:
+ case CONFIG_ITEM_MODULE_LIST_CAT:
+ config_PutPsz( p_intf, control->GetName().mb_str(),
+ control->GetPszValue().mb_str() );
break;
+ case CONFIG_ITEM_KEY:
+ /* So you don't need to restart to have the changes take effect */
+ val.i_int = control->GetIntValue();
+ var_Set( p_intf->p_vlc, control->GetName().mb_str(), val );
case CONFIG_ITEM_INTEGER:
- config_PutInt( p_intf, config_data->option_name.mb_str(),
- config_data->control.spinctrl->GetValue() );
+ case CONFIG_ITEM_BOOL:
+ config_PutInt( p_intf, control->GetName().mb_str(),
+ control->GetIntValue() );
break;
case CONFIG_ITEM_FLOAT:
- config_PutFloat( p_intf, config_data->option_name.mb_str(),
- config_data->control.spinctrl->GetValue() );
+ config_PutFloat( p_intf, control->GetName().mb_str(),
+ control->GetFloatValue() );
break;
}
}
}
-void PrefsPanel::OnAdvanced( wxCommandEvent& WXUNUSED(event) )
+void PrefsPanel::SwitchAdvanced( vlc_bool_t b_new_advanced )
{
- b_advanced = !b_advanced;
+ bool hidden = false;
- for( size_t i = 0; i < config_array.GetCount(); i++ )
+ if( b_advanced == b_new_advanced )
{
- ConfigData *config_data = config_array.Item(i);
- if( config_data->b_advanced )
- {
- config_data->panel->Show( b_advanced );
- config_sizer->Show( config_data->panel, b_advanced );
- }
+ goto hide;
}
- config_sizer->Layout();
- config_window->FitInside();
- config_window->Refresh();
-}
-
-/*****************************************************************************
- * A small helper class which intercepts all events
- *****************************************************************************/
-ConfigEvtHandler::ConfigEvtHandler( intf_thread_t *_p_intf,
- PrefsDialog *_p_prefs_dialog )
-{
- /* Initializations */
- p_intf = _p_intf;
- p_prefs_dialog = _p_prefs_dialog;
-}
-
-ConfigEvtHandler::~ConfigEvtHandler()
-{
-}
-
-void ConfigEvtHandler::OnCommandEvent( wxCommandEvent& event )
-{
- if( !event.GetEventObject() )
+ if( config_sizer && config_window )
{
- event.Skip();
- return;
- }
+ b_advanced = b_new_advanced;
- ConfigData *config_data = (ConfigData *)
- ((wxEvtHandler *)event.GetEventObject())->GetClientData();
+ for( size_t i = 0; i < config_array.GetCount(); i++ )
+ {
+ ConfigControl *control = config_array.Item(i);
+ if( control->IsAdvanced() )
+ {
+ if( !b_advanced ) hidden = true;
+ control->Show( b_advanced );
+ config_sizer->Show( control, b_advanced );
+ }
+ }
- if( !config_data )
- {
- event.Skip();
- return;
+ config_sizer->Layout();
+ config_window->FitInside();
+ config_window->Refresh();
}
-
- if( config_data->i_config_type == CONFIG_ITEM_FILE )
+hide:
+ if( hidden && hidden_text )
{
- wxFileDialog dialog( p_prefs_dialog, wxU(_("Open file")),
- wxT(""), wxT(""), wxT("*.*"), wxOPEN | wxSAVE );
-
- if( dialog.ShowModal() == wxID_OK )
- {
- config_data->control.textctrl->SetValue( dialog.GetPath() );
- }
+ hidden_text->Show( true );
+ config_sizer->Show( hidden_text, true );
}
-
- switch( config_data->i_config_type )
+ else if ( hidden_text )
{
- case CONFIG_ITEM_MODULE:
- break;
- case CONFIG_ITEM_STRING:
- break;
- case CONFIG_ITEM_FILE:
- break;
- case CONFIG_ITEM_INTEGER:
- break;
- case CONFIG_ITEM_FLOAT:
- break;
- case CONFIG_ITEM_BOOL:
- break;
+ hidden_text->Show( false );
+ config_sizer->Show( hidden_text, false );
}
-
- event.Skip();
+ return;
}