/*****************************************************************************
* preferences_widgets.cpp : wxWindows plugin for vlc
*****************************************************************************
- * Copyright (C) 2000-2001 VideoLAN
- * $Id: preferences_widgets.cpp,v 1.20 2004/01/02 13:30:17 gbazin Exp $
+ * Copyright (C) 2000-2004 VideoLAN
+ * $Id$
*
- * Authors: Gildas Bazin <gbazin@netcourrier.com>
+ * Authors: Gildas Bazin <gbazin@videolan.org>
* Sigmund Augdal <sigmunau@idi.ntnu.no>
*
* This program is free software; you can redistribute it and/or modify
#include <vlc/vlc.h>
#include <vlc/intf.h>
-#include <vlc_help.h>
+#include <vlc_config_cat.h>
#include "wxwindows.h"
#include "preferences_widgets.h"
+#include <wx/statline.h>
+
/*****************************************************************************
* CreateConfigControl wrapper
*****************************************************************************/
case CONFIG_ITEM_MODULE:
p_control = new ModuleConfigControl( p_this, p_item, parent );
break;
+ case CONFIG_ITEM_MODULE_LIST_CAT:
+ p_control = new ModuleListCatConfigControl( p_this, p_item, parent );
+ break;
case CONFIG_ITEM_STRING:
if( !p_item->i_list )
p_control = new BoolConfigControl( p_this, p_item, parent );
break;
+ case CONFIG_SECTION:
+ p_control = new SectionConfigControl( p_this, p_item, parent );
+ break;
+
default:
break;
}
/*****************************************************************************
* KeyConfigControl implementation
*****************************************************************************/
-static wxString KeysList[] =
-{
- wxT("Unset"),
- wxT("Left"),
- wxT("Right"),
- wxT("Up"),
- wxT("Down"),
- wxT("Space"),
- wxT("Enter"),
- wxT("F1"),
- wxT("F2"),
- wxT("F3"),
- wxT("F4"),
- wxT("F5"),
- wxT("F6"),
- wxT("F7"),
- wxT("F8"),
- wxT("F9"),
- wxT("F10"),
- wxT("F11"),
- wxT("F12"),
- wxT("Home"),
- wxT("End"),
- wxT("Menu"),
- wxT("Esc"),
- wxT("Page Up"),
- wxT("Page Down"),
- wxT("Tab"),
- wxT("Backspace"),
- wxT("a"),
- wxT("b"),
- wxT("c"),
- wxT("d"),
- wxT("e"),
- wxT("f"),
- wxT("g"),
- wxT("h"),
- wxT("i"),
- wxT("j"),
- wxT("k"),
- wxT("l"),
- wxT("m"),
- wxT("n"),
- wxT("o"),
- wxT("p"),
- wxT("q"),
- wxT("r"),
- wxT("s"),
- wxT("t"),
- wxT("u"),
- wxT("v"),
- wxT("w"),
- wxT("x"),
- wxT("y"),
- wxT("z"),
- wxT("+"),
- wxT("="),
- wxT("-"),
- wxT(","),
- wxT("."),
- wxT("<"),
- wxT(">"),
- wxT("`"),
- wxT("/"),
- wxT(";"),
- wxT("'"),
- wxT("\\"),
- wxT("["),
- wxT("]"),
- wxT("*")
-};
+wxString *KeyConfigControl::m_keysList = NULL;
KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
module_config_t *p_item, wxWindow *parent )
: ConfigControl( p_this, p_item, parent )
{
+ // Number of keys descriptions
+ unsigned int i_keys = sizeof(vlc_keys)/sizeof(key_descriptor_t);
+
+ // Init the keys decriptions array
+ if( m_keysList == NULL )
+ {
+ m_keysList = new wxString[i_keys];
+ for( unsigned int i = 0; i < i_keys; i++ )
+ {
+ m_keysList[i] = wxU(vlc_keys[i].psz_key_string);
+ }
+ }
+
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
alt = new wxCheckBox( this, -1, wxU(_("Alt")) );
alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
shift = new wxCheckBox( this, -1, wxU(_("Shift")) );
shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
combo = new wxComboBox( this, -1, wxT(""), wxDefaultPosition,
- wxDefaultSize, WXSIZEOF(KeysList), KeysList,
+ wxDefaultSize, i_keys, m_keysList,
wxCB_READONLY );
- for( unsigned int i = 0; i < WXSIZEOF(KeysList); i++ )
+ for( unsigned int i = 0; i < i_keys; i++ )
{
combo->SetClientData( i, (void*)vlc_keys[i].i_key_code );
if( (unsigned int)vlc_keys[i].i_key_code ==
KeyConfigControl::~KeyConfigControl()
{
- ;
+ if( m_keysList )
+ {
+ delete[] m_keysList;
+ m_keysList = NULL;
+ }
}
int KeyConfigControl::GetIntValue()
p_list = vlc_list_find( p_this, 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++ )
+ for( unsigned int i_index = 0; i_index < p_list->i_count; i_index++ )
{
p_parser = (module_t *)p_list->p_values[i_index].p_object ;
return wxU( (char *)combo->GetClientData( combo->GetSelection() ));
}
+/*****************************************************************************
+ * ModuleListCatonfigControl implementation
+ *****************************************************************************/
+BEGIN_EVENT_TABLE(ModuleListCatConfigControl, wxPanel)
+ EVT_CHECKBOX( wxID_HIGHEST , ModuleListCatConfigControl::OnUpdate )
+END_EVENT_TABLE()
+
+
+ModuleListCatConfigControl::ModuleListCatConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
+ wxWindow *parent )
+ : ConfigControl( p_this, p_item, parent )
+{
+ vlc_list_t *p_list;
+ module_t *p_parser;
+
+ delete sizer;
+ sizer = new wxBoxSizer( wxVERTICAL );
+ label = new wxStaticText(this, -1, wxU(p_item->psz_text));
+ sizer->Add( label );
+
+ text = new wxTextCtrl( this, -1, wxU(p_item->psz_value),
+ wxDefaultPosition,wxSize( 300, 20 ) );
+
+
+ /* build a list of available modules */
+ p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+ for( unsigned 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_object_name, "main" ) )
+ continue;
+
+ module_config_t *p_config = p_parser->p_config;
+ if( p_config ) do
+ {
+ /* Hack: required subcategory is stored in i_min */
+ if( p_config->i_type == CONFIG_SUBCATEGORY &&
+ p_config->i_value == p_item->i_min )
+ {
+ moduleCheckBox *mc = new moduleCheckBox;
+ mc->checkbox = new wxCheckBox( this, wxID_HIGHEST,
+ wxU(p_parser->psz_longname));
+ mc->psz_module = strdup( p_parser->psz_object_name );
+ pp_checkboxes.push_back( mc );
+
+ if( p_item->psz_value &&
+ strstr( p_item->psz_value, p_parser->psz_object_name ) )
+ {
+ mc->checkbox->SetValue( true );
+ }
+ sizer->Add( mc->checkbox );
+ }
+ } while( p_config->i_type != CONFIG_HINT_END && p_config++ );
+ }
+ vlc_list_release( p_list );
+
+ text->SetToolTip( wxU(p_item->psz_longtext) );
+ sizer->Add(text, wxEXPAND );
+
+ sizer->Add (new wxStaticText( this, -1, wxU( vlc_wraptext( _("Select modules that you want. To get more advanced control, you can also modify the resulting chain by yourself") , 72, ISUTF8 ) ) ) );
+
+ sizer->Layout();
+ this->SetSizerAndFit( sizer );
+}
+
+ModuleListCatConfigControl::~ModuleListCatConfigControl()
+{
+ ;
+}
+
+wxString ModuleListCatConfigControl::GetPszValue()
+{
+ return wxU( text->GetValue().c_str() ) ;
+}
+
+void ModuleListCatConfigControl::OnUpdate( wxCommandEvent &event )
+{
+ wxString newtext = wxU("");
+ for( int i = 0 ; i< pp_checkboxes.size() ; i++ )
+ {
+ if( pp_checkboxes[i]->checkbox->IsChecked() )
+ {
+ if( newtext.Len() == 0 )
+ {
+ newtext = newtext + wxU( pp_checkboxes[i]->psz_module );
+ }
+ else
+ {
+ newtext += wxU( "," );
+ newtext += wxU(pp_checkboxes[i]->psz_module);
+ }
+ }
+ }
+ text->SetValue( newtext );
+}
+
/*****************************************************************************
* StringConfigControl implementation
*****************************************************************************/
StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_this, p_item, parent ), psz_name( NULL )
+ : ConfigControl( p_this, p_item, parent )
{
+ psz_default_value = p_item->psz_value;
+ if( psz_default_value ) psz_default_value = strdup( psz_default_value );
+
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
combo = new wxComboBox( this, -1, wxT(""),
combo->SetToolTip( wxU(p_item->psz_longtext) );
sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- if( p_item->pf_list_update )
+ for( int i = 0; i < p_item->i_action; i++ )
{
- wxButton *refresh =
- new wxButton( this, wxID_HIGHEST, wxU(_("Refresh")) );
- sizer->Add( refresh, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
-
- psz_name = strdup( p_item->psz_name );
- pf_list_update = p_item->pf_list_update;
+ wxButton *button =
+ new wxButton( this, wxID_HIGHEST+i,
+ wxU(p_item->ppsz_action_text[i]) );
+ sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
}
sizer->Layout();
StringListConfigControl::~StringListConfigControl()
{
- if( psz_name ) free( psz_name );
+ if( psz_default_value ) free( psz_default_value );
}
void StringListConfigControl::UpdateCombo( module_config_t *p_item )
{
+ vlc_bool_t b_found = VLC_FALSE;
+ int i_index;
+
/* build a list of available options */
- for( int i_index = 0; i_index < p_item->i_list; i_index++ )
+ for( i_index = 0; i_index < p_item->i_list; i_index++ )
{
combo->Append( ( p_item->ppsz_list_text &&
p_item->ppsz_list_text[i_index] ) ?
p_item->ppsz_list_text[i_index] ) ?
wxU(p_item->ppsz_list_text[i_index]) :
wxL2U(p_item->ppsz_list[i_index]) );
+ b_found = VLC_TRUE;
}
}
+
+ if( p_item->psz_value && !b_found )
+ {
+ /* Add custom entry to list */
+ combo->Append( wxL2U(p_item->psz_value) );
+ combo->SetClientData( i_index, (void *)psz_default_value );
+ combo->SetSelection( i_index );
+ combo->SetValue( wxL2U(p_item->psz_value) );
+ }
}
BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
/* Button events */
- EVT_BUTTON(wxID_HIGHEST, StringListConfigControl::OnRefresh)
+ EVT_BUTTON(-1, StringListConfigControl::OnAction)
/* Text events */
EVT_TEXT(-1, StringListConfigControl::OnUpdate)
END_EVENT_TABLE()
-void StringListConfigControl::OnRefresh( wxCommandEvent& event )
+void StringListConfigControl::OnAction( wxCommandEvent& event )
{
- if( pf_list_update )
- {
- vlc_value_t val;
- module_config_t *p_item;
+ int i_action = event.GetId() - wxID_HIGHEST;
- pf_list_update( p_this, psz_name, val, val, 0 );
- p_item = config_FindConfig( p_this, psz_name );
+ module_config_t *p_item = config_FindConfig( p_this, GetName().mb_str() );
+ if( !p_item ) return;
+ if( i_action < 0 || i_action >= p_item->i_action ) return;
+
+ vlc_value_t val;
+ wxString value = GetPszValue();
+ *((const char **)&val.psz_string) = value.mb_str();
+ p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
+
+ if( p_item->b_dirty )
+ {
combo->Clear();
UpdateCombo( p_item );
+ p_item->b_dirty = VLC_FALSE;
}
}
/*****************************************************************************
* IntegerConfigControl implementation
*****************************************************************************/
+BEGIN_EVENT_TABLE(IntegerConfigControl, wxPanel)
+ EVT_TEXT(-1, IntegerConfigControl::OnUpdate)
+ EVT_COMMAND_SCROLL(-1, IntegerConfigControl::OnUpdate)
+END_EVENT_TABLE()
+
IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
p_item->i_value),
wxDefaultPosition, wxDefaultSize,
wxSP_ARROW_KEYS,
- -16000, 16000, p_item->i_value);
+ -100000000, 100000000, p_item->i_value);
spin->SetToolTip( wxU(p_item->psz_longtext) );
sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
sizer->Layout();
this->SetSizerAndFit( sizer );
+ i_value = p_item->i_value;
}
IntegerConfigControl::~IntegerConfigControl()
int IntegerConfigControl::GetIntValue()
{
- return spin->GetValue();
+ /* We avoid using GetValue because of a recursion bug with wxSpinCtrl with
+ * wxGTK. */
+ return i_value; //spin->GetValue();
+}
+
+void IntegerConfigControl::OnUpdate( wxCommandEvent &event )
+{
+ i_value = event.GetInt();
+ ConfigControl::OnUpdate( event );
}
/*****************************************************************************
IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
- : ConfigControl( p_this, p_item, parent ), psz_name( NULL )
+ : ConfigControl( p_this, p_item, parent )
{
label = new wxStaticText(this, -1, wxU(p_item->psz_text));
sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
combo->SetToolTip( wxU(p_item->psz_longtext) );
sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
- if( p_item->pf_list_update )
- {
- wxButton *refresh =
- new wxButton( this, wxID_HIGHEST, wxU(_("Refresh")) );
- sizer->Add( refresh, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
-
- psz_name = strdup( p_item->psz_name );
- pf_list_update = p_item->pf_list_update;
- }
-
sizer->Layout();
this->SetSizerAndFit( sizer );
}
IntegerListConfigControl::~IntegerListConfigControl()
{
- if( psz_name ) free( psz_name );
}
void IntegerListConfigControl::UpdateCombo( module_config_t *p_item )
BEGIN_EVENT_TABLE(IntegerListConfigControl, wxPanel)
/* Button events */
- EVT_BUTTON(wxID_HIGHEST, IntegerListConfigControl::OnRefresh)
+ EVT_BUTTON(-1, IntegerListConfigControl::OnAction)
END_EVENT_TABLE()
-void IntegerListConfigControl::OnRefresh( wxCommandEvent& event )
+void IntegerListConfigControl::OnAction( wxCommandEvent& event )
{
- if( pf_list_update )
- {
- vlc_value_t val;
- module_config_t *p_item;
+ int i_action = event.GetId() - wxID_HIGHEST;
- pf_list_update( p_this, psz_name, val, val, 0 );
- p_item = config_FindConfig( p_this, psz_name );
+ module_config_t *p_item;
+ p_item = config_FindConfig( p_this, GetName().mb_str() );
+ if( !p_item ) return;
+ if( i_action < 0 || i_action >= p_item->i_action ) return;
+
+ vlc_value_t val;
+ val.i_int = GetIntValue();
+ p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
+
+ if( p_item->b_dirty )
+ {
combo->Clear();
UpdateCombo( p_item );
+ p_item->b_dirty = VLC_FALSE;
}
}
/*****************************************************************************
* RangedIntConfigControl implementation
*****************************************************************************/
+BEGIN_EVENT_TABLE(RangedIntConfigControl, wxPanel)
+ EVT_COMMAND_SCROLL(-1, RangedIntConfigControl::OnUpdate)
+END_EVENT_TABLE()
+
RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
/*****************************************************************************
* FloatConfigControl implementation
*****************************************************************************/
+BEGIN_EVENT_TABLE(FloatConfigControl, wxPanel)
+ EVT_TEXT(-1, FloatConfigControl::OnUpdate)
+END_EVENT_TABLE()
+
FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
/*****************************************************************************
* BoolConfigControl implementation
*****************************************************************************/
+BEGIN_EVENT_TABLE(BoolConfigControl, wxPanel)
+ EVT_CHECKBOX(-1, BoolConfigControl::OnUpdate)
+END_EVENT_TABLE()
+
BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
module_config_t *p_item,
wxWindow *parent )
int BoolConfigControl::GetIntValue()
{
- if( checkbox->IsChecked() )
- {
- return 1;
- }
- else
- {
- return 0;
- }
+ if( checkbox->IsChecked() ) return 1;
+ else return 0;
+}
+
+/*****************************************************************************
+ * SectionConfigControl implementation
+ *****************************************************************************/
+SectionConfigControl::SectionConfigControl( vlc_object_t *p_this,
+ module_config_t *p_item,
+ wxWindow *parent )
+ : ConfigControl( p_this, p_item, parent )
+{
+ delete sizer;
+ sizer = new wxBoxSizer( wxVERTICAL );
+ sizer->Add( new wxStaticText( this, -1, wxU( p_item->psz_text ) ) );
+ sizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND, 5 );
+ sizer->Layout();
+ this->SetSizerAndFit( sizer );
+}
+
+SectionConfigControl::~SectionConfigControl()
+{
+ ;
}