You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

898 lines
29 KiB

/*****************************************************************************
* preferences.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
* $Id: preferences.cpp,v 1.13 2003/05/12 17:33:19 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <stdlib.h> /* malloc(), free() */
#include <errno.h> /* ENOMEM */
#include <string.h> /* strerror() */
#include <stdio.h>
#include <vlc/vlc.h>
#ifdef WIN32 /* mingw32 hack */
#undef Yield
#undef CreateDialog
#endif
/* Let vlc take care of the i18n stuff */
#define WXINTL_NO_GETTEXT_MACRO
#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
/*****************************************************************************
* Classes declarations.
*****************************************************************************/
class PrefsTreeCtrl : public wxTreeCtrl
{
public:
PrefsTreeCtrl() { }
PrefsTreeCtrl( wxWindow *parent, intf_thread_t *_p_intf,
PrefsDialog *p_prefs_dialog, wxBoxSizer *_p_sizer );
virtual ~PrefsTreeCtrl();
void ApplyChanges();
private:
/* Event handlers (these functions should _not_ be virtual) */
void OnSelectTreeItem( wxTreeEvent& event );
DECLARE_EVENT_TABLE()
intf_thread_t *p_intf;
PrefsDialog *p_prefs_dialog;
wxBoxSizer *p_sizer;
wxWindow *p_parent;
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);
class PrefsPanel : public wxPanel
{
public:
PrefsPanel() { }
PrefsPanel( wxWindow *parent, intf_thread_t *_p_intf,
PrefsDialog *_p_prefs_dialog,
module_t *p_module, char * );
virtual ~PrefsPanel() {}
void ApplyChanges();
private:
void OnAdvanced( wxCommandEvent& WXUNUSED(event) );
DECLARE_EVENT_TABLE()
intf_thread_t *p_intf;
PrefsDialog *p_prefs_dialog;
vlc_bool_t b_advanced;
wxBoxSizer *config_sizer;
wxScrolledWindow *config_window;
ArrayOfConfigData config_array;
};
class ConfigTreeData : public wxTreeItemData
{
public:
ConfigTreeData() { panel == NULL; }
virtual ~ConfigTreeData() { if( panel ) delete panel; }
PrefsPanel *panel;
wxBoxSizer *sizer;
};
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;
};
/*****************************************************************************
* Event Table.
*****************************************************************************/
/* IDs for the controls and the menu commands */
enum
{
Notebook_Event = wxID_HIGHEST,
MRL_Event,
ResetAll_Event,
Advanced_Event,
};
BEGIN_EVENT_TABLE(PrefsDialog, wxFrame)
/* Button events */
EVT_BUTTON(wxID_OK, PrefsDialog::OnOk)
EVT_BUTTON(wxID_CANCEL, PrefsDialog::OnCancel)
EVT_BUTTON(wxID_SAVE, PrefsDialog::OnSave)
EVT_BUTTON(ResetAll_Event, PrefsDialog::OnResetAll)
/* Don't destroy the window when the user closes it */
EVT_CLOSE(PrefsDialog::OnCancel)
END_EVENT_TABLE()
// menu and control ids
enum
{
PrefsTree_Ctrl = wxID_HIGHEST
};
BEGIN_EVENT_TABLE(PrefsTreeCtrl, wxTreeCtrl)
EVT_TREE_SEL_CHANGED(PrefsTree_Ctrl, PrefsTreeCtrl::OnSelectTreeItem)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(PrefsPanel, wxPanel)
/* Button events */
EVT_BUTTON(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)
END_EVENT_TABLE()
/*****************************************************************************
* Constructor.
*****************************************************************************/
PrefsDialog::PrefsDialog( intf_thread_t *_p_intf, Interface *_p_main_interface)
: wxFrame( _p_main_interface, -1, wxU(_("Preferences")), wxDefaultPosition,
wxSize(650,450), wxDEFAULT_FRAME_STYLE )
{
/* Initializations */
p_intf = _p_intf;
p_main_interface = _p_main_interface;
SetIcon( *p_intf->p_sys->p_icon );
/* Create a panel to put everything in */
wxPanel *panel = new wxPanel( this, -1 );
panel->SetAutoLayout( TRUE );
/* Create the preferences tree control */
wxBoxSizer *controls_sizer = new wxBoxSizer( wxHORIZONTAL );
prefs_tree =
new PrefsTreeCtrl( panel, p_intf, this, controls_sizer );
/* Separation */
wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
/* Create the buttons */
wxButton *ok_button = new wxButton( panel, wxID_OK, wxU(_("OK")) );
ok_button->SetDefault();
wxButton *cancel_button = new wxButton( panel, wxID_CANCEL,
wxU(_("Cancel")) );
wxButton *save_button = new wxButton( panel, wxID_SAVE, wxU(_("Save")) );
wxButton *reset_button = new wxButton( panel, ResetAll_Event,
wxU(_("Reset All")) );
/* 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->Layout();
wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer *panel_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 );
panel_sizer->Layout();
panel->SetSizer( panel_sizer );
main_sizer->Add( panel, 1, wxEXPAND, 0 );
main_sizer->Layout();
SetSizer( main_sizer );
}
PrefsDialog::~PrefsDialog()
{
}
/*****************************************************************************
* Private methods.
*****************************************************************************/
/*****************************************************************************
* Events methods.
*****************************************************************************/
void PrefsDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
{
prefs_tree->ApplyChanges();
this->Hide();
}
void PrefsDialog::OnCancel( wxCommandEvent& WXUNUSED(event) )
{
this->Hide();
}
void PrefsDialog::OnSave( wxCommandEvent& WXUNUSED(event) )
{
prefs_tree->ApplyChanges();
config_SaveConfigFile( p_intf, NULL );
}
void PrefsDialog::OnResetAll( wxCommandEvent& WXUNUSED(event) )
{
wxMessageDialog dlg( this,
wxU(_("Beware this will reset your VLC Media Player config file.\n"
"Are you sure you want to continue?")),
wxU(_("Reset config file")), wxYES_NO|wxNO_DEFAULT|wxCENTRE );
if ( dlg.ShowModal() == wxID_YES )
{
/* TODO: need to reset all the controls */
config_ResetAll( p_intf );
config_SaveConfigFile( p_intf, NULL );
}
}
/*****************************************************************************
* PrefsTreeCtrl class definition.
*****************************************************************************/
PrefsTreeCtrl::PrefsTreeCtrl( wxWindow *_p_parent, intf_thread_t *_p_intf,
PrefsDialog *_p_prefs_dialog,
wxBoxSizer *_p_sizer )
: wxTreeCtrl( _p_parent, PrefsTree_Ctrl, wxDefaultPosition, wxDefaultSize,
wxTR_NO_LINES | wxTR_FULL_ROW_HIGHLIGHT |
wxTR_LINES_AT_ROOT | wxTR_HIDE_ROOT |
wxTR_HAS_BUTTONS | wxTR_TWIST_BUTTONS | wxSUNKEN_BORDER )
{
vlc_list_t *p_list;
module_t *p_module;
module_config_t *p_item;
int i_index;
/* Initializations */
p_intf = _p_intf;
p_prefs_dialog = _p_prefs_dialog;
p_sizer = _p_sizer;
p_parent = _p_parent;
root_item = AddRoot( wxT("") );
/* List the plugins */
p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE );
if( !p_list ) return;
/*
* Build a tree of the main options
*/
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( !strcmp( p_module->psz_object_name, "main" ) )
break;
}
if( i_index < p_list->i_count )
{
/* We found the main module */
/* Enumerate config options and add corresponding config boxes */
p_item = p_module->p_config;
if( p_item ) do
{
switch( p_item->i_type )
{
case CONFIG_HINT_CATEGORY:
ConfigTreeData *config_data = new ConfigTreeData;
config_data->panel =
new PrefsPanel( p_parent, p_intf, p_prefs_dialog,
p_module, p_item->psz_text );
config_data->panel->Hide();
/* Add the category to the tree */
AppendItem( root_item, wxU(p_item->psz_text),
-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++ )
{
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;
if( !p_item ) continue;
do
{
if( p_item->i_type & CONFIG_ITEM )
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( !GetItemText(capability_item).Cmp(
wxU(p_module->psz_capability ) ) )
{
break;
}
capability_item = GetNextChild( plugins_item, cookie );
}
if( i_child_index == GetChildrenCount( plugins_item, FALSE ) &&
p_module->psz_capability && *p_module->psz_capability )
{
/* We didn't find it, add it */
capability_item = AppendItem( plugins_item,
wxU(p_module->psz_capability) );
}
/* Add the plugin to the tree */
ConfigTreeData *config_data = new ConfigTreeData;
config_data->panel =
new PrefsPanel( p_parent, p_intf, p_prefs_dialog, p_module, NULL );
config_data->panel->Hide();
AppendItem( capability_item, wxU(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);
for( i_child_index = 0;
i_child_index < GetChildrenCount( plugins_item, FALSE );
i_child_index++ )
{
capability_item = GetNextChild( plugins_item, cookie );
SortChildren( capability_item );
}
/* Clean-up everything */
vlc_list_release( p_list );
p_sizer->Add( this, 1, wxEXPAND | wxALL, 0 );
p_sizer->Layout();
/* Update Tree Ctrl */
#ifndef WIN32 /* Workaround a bug in win32 implementation */
SelectItem( GetFirstChild( root_item, cookie ) );
#endif
}
PrefsTreeCtrl::~PrefsTreeCtrl()
{
}
void PrefsTreeCtrl::ApplyChanges()
{
long cookie, cookie2;
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++ )
{
config_data = (ConfigTreeData *)GetItemData( item );
if( config_data )
{
config_data->panel->ApplyChanges();
}
item = GetNextChild( root_item, cookie );
}
/* 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 item2 = GetFirstChild( item, cookie2 );
for( size_t i_child_index = 0;
i_child_index < GetChildrenCount( item, FALSE );
i_child_index++ )
{
config_data = (ConfigTreeData *)GetItemData( item2 );
if( config_data )
{
config_data->panel->ApplyChanges();
}
item2 = GetNextChild( item, cookie2 );
}
item = GetNextChild( plugins_item, cookie );
}
}
void PrefsTreeCtrl::OnSelectTreeItem( wxTreeEvent& event )
{
ConfigTreeData *config_data;
config_data = (ConfigTreeData *)GetItemData( event.GetOldItem() );
if( config_data && config_data->panel )
{
config_data->panel->Hide();
p_sizer->Remove( config_data->panel );
}
config_data = (ConfigTreeData *)GetItemData( event.GetItem() );
if( config_data && config_data->panel )
{
config_data->panel->Show();
p_sizer->Add( config_data->panel, 2, wxEXPAND | wxALL, 0 );
p_sizer->Layout();
}
}
/*****************************************************************************
* PrefsPanel class definition.
*****************************************************************************/
PrefsPanel::PrefsPanel( wxWindow* parent, intf_thread_t *_p_intf,
PrefsDialog *_p_prefs_dialog,
module_t *p_module, char *psz_section )
: wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize )
{
module_config_t *p_item;
vlc_list_t *p_list;
module_t *p_parser;
wxStaticText *label;
wxComboBox *combo;
wxSpinCtrl *spin;
wxCheckBox *checkbox;
wxTextCtrl *textctrl;
wxButton *button;
wxArrayString array;
/* Initializations */
p_intf = _p_intf;
p_prefs_dialog =_p_prefs_dialog,
b_advanced = VLC_TRUE;
SetAutoLayout( TRUE );
wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL );
/* 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 )
{
while( !p_item->i_type == CONFIG_HINT_CATEGORY ||
strcmp( psz_section, p_item->psz_text ) )
{
if( p_item->i_type == CONFIG_HINT_END )
break;
p_item++;
}
}
/* 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 );
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 )
{
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) );
}
}
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
{
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 )
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);
}
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,
0, 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,
0, 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;
}
/* Don't add items that were not recognized */
if( panel == NULL ) continue;
panel_sizer->Layout();
panel->SetSizerAndFit( panel_sizer );
/* Add the config data to our array so we can keep a trace of it */
config_array.Add( config_data );
config_sizer->Add( panel, 0, wxEXPAND | wxALL, 2 );
}
while( p_item->i_type != CONFIG_HINT_END && p_item++ );
/* 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 );
}
config_sizer->Layout();
config_window->SetSizer( config_sizer );
sizer->Add( config_window, 1, wxEXPAND | wxALL, 5 );
/* Intercept all menu events in our custom event handler */
config_window->PushEventHandler(
new ConfigEvtHandler( p_intf, p_prefs_dialog ) );
/* Update panel */
wxCommandEvent dummy_event;
b_advanced = !config_GetInt( p_intf, "advanced" );
OnAdvanced( dummy_event );
/* Create advanced button */
if( config_array.GetCount() )
{
wxButton *advanced_button = new wxButton( this, Advanced_Event,
wxU(_("Advanced...")) );
sizer->Add( advanced_button, 0, wxALL, 5 );
}
sizer->Layout();
SetSizer( sizer );
}
void PrefsPanel::ApplyChanges()
{
for( size_t i = 0; i < config_array.GetCount(); i++ )
{
ConfigData *config_data = config_array.Item(i);
switch( config_data->i_config_type )
{
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() );
break;
case CONFIG_ITEM_INTEGER:
config_PutInt( p_intf, config_data->option_name.mb_str(),
config_data->control.spinctrl->GetValue() );
break;
case CONFIG_ITEM_FLOAT:
config_PutFloat( p_intf, config_data->option_name.mb_str(),
config_data->control.spinctrl->GetValue() );
break;
}
}
}
void PrefsPanel::OnAdvanced( wxCommandEvent& WXUNUSED(event) )
{
b_advanced = !b_advanced;
for( size_t i = 0; i < config_array.GetCount(); i++ )
{
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 );
}
}
config_sizer->Layout();
config_window->FitInside();
}
/*****************************************************************************
* 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("*.*"), wxOPEN | wxSAVE );
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();
}