/*****************************************************************************
* preferences.cpp : wxWindows plugin for vlc
*****************************************************************************
- * Copyright (C) 2000-2001 VideoLAN
- * $Id: preferences.cpp,v 1.35 2003/10/17 16:40:09 gbazin Exp $
+ * Copyright (C) 2000-2004 VideoLAN
+ * $Id$
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
#include <vlc_help.h>
#include "wxwindows.h"
-#include <wx/notebook.h>
-#include <wx/textctrl.h>
+#include "preferences_widgets.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>
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
{
wxBoxSizer *config_sizer;
wxScrolledWindow *config_window;
- ArrayOfConfigData config_array;
+ ArrayOfConfigControls config_array;
};
class ConfigTreeData : public wxTreeItemData
{
public:
- ConfigTreeData() { b_submodule = 0; panel = NULL; psz_section = NULL; }
- virtual ~ConfigTreeData() { if( panel ) delete panel; }
+ ConfigTreeData() { b_submodule = 0; panel = NULL; psz_section = NULL;
+ psz_help = NULL; }
+ virtual ~ConfigTreeData() { if( panel ) delete panel;
+ if( psz_section) free(psz_section);
+ if( psz_help) free(psz_help); }
vlc_bool_t b_submodule;
- char *psz_help;
-
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;
+ char *psz_help;
};
/*****************************************************************************
EVT_COMMAND(Advanced_Event, wxEVT_USER_FIRST, PrefsTreeCtrl::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)
-END_EVENT_TABLE()
-
/*****************************************************************************
* Constructor.
*****************************************************************************/
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 )
{
prefs_tree->AddPendingEvent( newevent );
}
-/*****************************************************************************
- * GetCapabilityHelp: Display the help for one capability.
- *****************************************************************************/
-static char * GetCapabilityHelp( char *psz_capability, int i_type)
-{
- if( psz_capability == NULL) return "";
-
- if( !strcasecmp(psz_capability,"access") )
- return i_type == 1 ? ACCESS_TITLE : ACCESS_HELP;
- if( !strcasecmp(psz_capability,"audio filter") )
- return i_type == 1 ? AUDIO_FILTER_TITLE : AUDIO_FILTER_HELP;
- if( !strcasecmp(psz_capability,"audio output") )
- return i_type == 1 ? AOUT_TITLE : AOUT_HELP;
- if( !strcasecmp(psz_capability,"chroma") )
- return i_type == 1 ? CHROMA_TITLE : CHROMA_HELP;
- if( !strcasecmp(psz_capability,"decoder") )
- return i_type == 1 ? DECODER_TITLE : DECODER_HELP;
- if( !strcasecmp(psz_capability,"demux") )
- return i_type == 1 ? DEMUX_TITLE : DEMUX_HELP;
- if( !strcasecmp(psz_capability,"interface") )
- return i_type == 1 ? INTERFACE_TITLE : INTERFACE_HELP;
- if( !strcasecmp(psz_capability,"sout access") )
- return i_type == 1 ? SOUT_TITLE : SOUT_HELP;
- if( !strcasecmp(psz_capability,"subtitle demux") )
- return i_type == 1 ? SUBTITLE_DEMUX_TITLE : SUBTITLE_DEMUX_HELP;
- if( !strcasecmp(psz_capability,"text renderer") )
- return i_type == 1 ? TEXT_TITLE : TEXT_HELP;
- if( !strcasecmp(psz_capability,"video output") )
- return i_type == 1 ? VOUT__TITLE : VOUT_HELP;
- if( !strcasecmp(psz_capability,"video filter") )
- return i_type == 1 ? VIDEO_FILTER_TITLE : VIDEO_FILTER_HELP;
-
- return "";
-}
-
/*****************************************************************************
* PrefsTreeCtrl class definition.
*****************************************************************************/
* Build a tree of the main options
*/
ConfigTreeData *config_data = new ConfigTreeData;
- config_data->psz_section = NULL;
config_data->i_object_id = GENERAL_ID;
- config_data->psz_help = wraptext( GENERAL_HELP, WRAPCOUNT, ISUTF8 );
+ config_data->psz_help = wraptext( GENERAL_HELP, 72 , ISUTF8 );
config_data->psz_section = strdup( GENERAL_TITLE );
- general_item = AppendItem( root_item, wxU(_("General Settings")),
+ general_item = AppendItem( root_item, wxU(_("General settings")),
-1, -1, config_data );
for( i_index = 0; i_index < p_list->i_count; i_index++ )
if( p_item->psz_longtext )
{
config_data->psz_help =
- wraptext( p_item->psz_longtext, WRAPCOUNT, ISUTF8 );
+ wraptext( p_item->psz_longtext, 72 , ISUTF8 );
}
else
{
* Build a tree of all the plugins
*/
config_data = new ConfigTreeData;
- config_data->psz_section = NULL;
config_data->i_object_id = PLUGIN_ID;
- config_data->psz_help = wraptext( PLUGIN_HELP, WRAPCOUNT, ISUTF8 );
+ config_data->psz_help = wraptext( PLUGIN_HELP, 72, ISUTF8 );
config_data->psz_section = strdup( PLUGIN_TITLE );
- plugins_item = AppendItem( root_item, wxU(_("Plugins")),
- -1,-1,config_data );
+ plugins_item = AppendItem( root_item, wxU(_("Modules")),
+ -1, -1,config_data );
for( i_index = 0; i_index < p_list->i_count; i_index++ )
{
ConfigTreeData *config_data = new ConfigTreeData;
config_data->psz_section =
wraptext( GetCapabilityHelp( p_module->psz_capability , 1 ),
- WRAPCOUNT, ISUTF8 );
+ 72, ISUTF8 );
config_data->psz_help =
wraptext( GetCapabilityHelp( p_module->psz_capability , 2 ),
- WRAPCOUNT, ISUTF8 );
+ 72, ISUTF8 );
config_data->i_object_id = CAPABILITY_ID;
capability_item = AppendItem( plugins_item,
wxU(p_module->psz_capability),
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 */
void PrefsTreeCtrl::OnSelectTreeItem( wxTreeEvent& event )
{
- ConfigTreeData *config_data;
+ ConfigTreeData *config_data = NULL;
- config_data = FindModuleConfig( (ConfigTreeData *)GetItemData(
- event.GetOldItem() ) );
+ if( event.GetOldItem() )
+ config_data = FindModuleConfig( (ConfigTreeData *)GetItemData(
+ event.GetOldItem() ) );
if( config_data && config_data->panel )
{
config_data->panel->Hide();
: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize )
{
module_config_t *p_item;
- vlc_list_t *p_list;
- module_t *p_parser;
wxStaticText *label;
wxStaticText *help;
- wxComboBox *combo;
- wxSpinCtrl *spin;
- wxCheckBox *checkbox;
- wxTextCtrl *textctrl;
- wxButton *button;
wxArrayString array;
- vlc_bool_t b_has_advanced = VLC_FALSE;
module_t *p_module = NULL;
-
+
/* Initializations */
p_intf = _p_intf;
p_prefs_dialog =_p_prefs_dialog,
/* 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 );
+ wxDefaultSize, wxBORDER_NONE | wxHSCROLL | wxVSCROLL );
config_window->SetAutoLayout( TRUE );
config_window->SetScrollRate( 5, 5 );
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 )
- {
- 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 */
- 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( !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, 1, 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, 1, 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
- {
- 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++ )
- {
- combo->Append( wxU(p_item->ppsz_list[i_index]) );
- if( p_item->psz_value && !strcmp( p_item->psz_value,
- p_item->ppsz_list[i_index] ) )
- combo->SetSelection( i_index );
- }
-
- 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 )
- {
- button = new wxButton( panel, -1, wxU(_("Browse...")) );
- panel_sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL
- |wxALL, 5);
- button->SetClientData((void *)config_data);
- }
- if( p_item->b_advanced ) b_has_advanced = VLC_TRUE;
- 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, 1, wxALIGN_CENTER_VERTICAL
- | wxALL, 5 );
- panel_sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL
- | wxALL, 5 );
-
- spin->SetClientData((void *)config_data);
- if( p_item->b_advanced ) b_has_advanced = VLC_TRUE;
- break;
-
- case CONFIG_ITEM_KEY:
- {
- label = new wxStaticText(panel, -1, wxU(p_item->psz_text));
- wxCheckBox *alt = new wxCheckBox( panel, -1, wxU(_("Alt")) );
- alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
- wxCheckBox *ctrl = new wxCheckBox( panel, -1, wxU(_("Ctrl")) );
- ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL );
- wxCheckBox *shift = new wxCheckBox( panel, -1,
- wxU(_("Shift")) );
- shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
- combo = new wxComboBox( panel, -1, wxU("f"),
- wxDefaultPosition, wxDefaultSize, 0
- , NULL, wxCB_READONLY | wxCB_SORT );
- for( int i=0; i < sizeof(keys)/sizeof(key_descriptor_s); i++ )
- {
- combo->Append( wxU(_(keys[i].psz_key_string)),
- (void*)&keys[i].i_key_code );
- }
- combo->SetValue( wxU( KeyToString(
- p_item->i_value&~KEY_MODIFIER )));
- config_data->control.combobox = combo;
- panel_sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL
- | wxALL | wxEXPAND, 5 );
- panel_sizer->Add( alt, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
- panel_sizer->Add( ctrl, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5);
- panel_sizer->Add( shift, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5);
- panel_sizer->Add( combo, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5);
- break;
- }
-
- case CONFIG_ITEM_FLOAT:
- label = new wxStaticText(panel, -1, wxU(p_item->psz_text));
- textctrl = new wxTextCtrl( panel, -1,
- wxString::Format(wxT("%f"),
- p_item->f_value),
- wxDefaultPosition, wxDefaultSize,
- wxTE_PROCESS_ENTER );
- textctrl->SetToolTip( wxU(p_item->psz_longtext) );
- config_data->control.textctrl = textctrl;
- panel_sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL
- | wxALL, 5 );
- panel_sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL
- | wxALL, 5);
- if( p_item->b_advanced ) b_has_advanced = VLC_TRUE;
- 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 );
- if( p_item->b_advanced ) b_has_advanced = VLC_TRUE;
- break;
-
- default:
- delete panel; panel = NULL;
- delete panel_sizer;
- delete config_data;
- break;
- }
+ ConfigControl *control =
+ CreateConfigControl( VLC_OBJECT(p_intf),
+ p_item, config_window );
/* Don't add items that were not recognized */
- if( panel == NULL ) continue;
-
- panel_sizer->Layout();
- panel->SetSizerAndFit( panel_sizer );
+ if( control == NULL ) continue;
/* Add the config data to our array so we can keep a trace of it */
- config_array.Add( config_data );
+ config_array.Add( control );
- config_sizer->Add( panel, 0, wxEXPAND | wxALL, 2 );
+ config_sizer->Add( control, 0, wxEXPAND | wxALL, 2 );
}
while( p_item->i_type != CONFIG_HINT_END && p_item++ );
sizer->Add( help ,0 ,wxEXPAND | wxALL, 5 );
}
-
- /* Intercept all menu events in our custom event handler */
- config_window->PushEventHandler(
- new ConfigEvtHandler( p_intf, p_prefs_dialog ) );
- }
+ vlc_object_release( p_module );
+ }
sizer->Layout();
SetSizer( sizer );
}
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:
+ 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:
- {
- float f_value;
- if( (wxSscanf(config_data->control.textctrl->GetValue(),
- wxT("%f"), &f_value) == 1) )
- config_PutFloat( p_intf, config_data->option_name.mb_str(),
- f_value );
- }
+ config_PutFloat( p_intf, control->GetName().mb_str(),
+ control->GetFloatValue() );
break;
}
}
for( size_t i = 0; i < config_array.GetCount(); i++ )
{
- ConfigData *config_data = config_array.Item(i);
- if( config_data->b_advanced )
+ ConfigControl *control = config_array.Item(i);
+ if( control->IsAdvanced() )
{
- config_data->panel->Show( b_advanced );
- config_sizer->Show( config_data->panel, b_advanced );
+ control->Show( b_advanced );
+ config_sizer->Show( control, b_advanced );
}
}
config_window->FitInside();
config_window->Refresh();
}
- return;
-}
-
-/*****************************************************************************
- * 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() )
- {
- event.Skip();
- return;
- }
-
- ConfigData *config_data = (ConfigData *)
- ((wxEvtHandler *)event.GetEventObject())->GetClientData();
-
- if( !config_data )
- {
- event.Skip();
- return;
- }
-
- if( config_data->i_config_type == CONFIG_ITEM_FILE )
- {
- wxFileDialog dialog( p_prefs_dialog, wxU(_("Open file")),
- wxT(""), wxT(""), wxT("*.*"),
-#if defined( __WXMSW__ )
- wxOPEN );
-#else
- wxOPEN | wxSAVE );
-#endif
-
- if( dialog.ShowModal() == wxID_OK )
- {
- config_data->control.textctrl->SetValue( dialog.GetPath() );
- }
- }
-
- switch( config_data->i_config_type )
- {
- 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;
- }
-
- event.Skip();
+ return;
}