1 /*****************************************************************************
2 * preferences.cpp : Preferences
3 *****************************************************************************
4 * Copyright (C) 2006-2007 the VideoLAN team
7 * Authors: Clément Stenac <zorglub@videolan.org>
8 * Jean-Baptiste Kempf <jb@videolan.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
28 #include "dialogs/preferences.hpp"
29 #include "dialogs_provider.hpp"
30 #include "util/qvlcframe.hpp"
32 #include "components/complete_preferences.hpp"
33 #include "components/simple_preferences.hpp"
35 #include <QHBoxLayout>
37 #include <QRadioButton>
38 #include <QVBoxLayout>
39 #include <QPushButton>
41 #include <QMessageBox>
42 #include <QDialogButtonBox>
44 PrefsDialog *PrefsDialog::instance = NULL;
46 PrefsDialog::PrefsDialog( QWidget *parent, intf_thread_t *_p_intf )
47 : QVLCDialog( parent, _p_intf )
49 QGridLayout *main_layout = new QGridLayout( this );
50 setWindowTitle( qtr( "Preferences" ) );
53 tree_panel = new QWidget;
54 tree_panel_l = new QHBoxLayout;
55 tree_panel->setLayout( tree_panel_l );
56 main_panel = new QWidget;
57 main_panel_l = new QHBoxLayout;
58 main_panel->setLayout( main_panel_l );
60 /* Choice for types */
61 types = new QGroupBox( "Show settings" );
62 types->setAlignment( Qt::AlignHCenter );
63 QHBoxLayout *types_l = new QHBoxLayout;
64 types_l->setSpacing( 3 ); types_l->setMargin( 3 );
65 small = new QRadioButton( qtr("Basic"), types );
66 types_l->addWidget( small );
67 all = new QRadioButton( qtr("All"), types ); types_l->addWidget( all );
68 types->setLayout( types_l );
69 small->setChecked( true );
71 /* Tree and panel initialisations */
74 current_simple_panel = NULL;
75 advanced_panel = NULL;
78 QDialogButtonBox *buttonsBox = new QDialogButtonBox();
79 QPushButton *save = new QPushButton( qtr( "&Save" ) );
80 QPushButton *cancel = new QPushButton( qtr( "&Cancel" ) );
81 QPushButton *reset = new QPushButton( qtr( "&Reset Preferences" ) );
83 buttonsBox->addButton( save, QDialogButtonBox::AcceptRole );
84 buttonsBox->addButton( cancel, QDialogButtonBox::RejectRole );
85 buttonsBox->addButton( reset, QDialogButtonBox::ResetRole );
88 main_layout->addWidget( tree_panel, 0, 0, 3, 1 );
89 main_layout->addWidget( types, 3, 0, 2, 1 );
90 main_layout->addWidget( main_panel, 0, 1, 4, 2 );
91 main_layout->addWidget( buttonsBox, 4, 2, 1 ,1 );
93 main_layout->setColumnMinimumWidth( 0, 150 );
94 main_layout->setColumnMinimumWidth( 1, 10 );
95 main_layout->setColumnStretch( 0, 1 );
96 main_layout->setColumnStretch( 1, 0 );
97 main_layout->setColumnStretch( 2, 3 );
99 main_layout->setRowStretch( 2, 4 );
101 setLayout( main_layout );
104 tree_panel_l->setMargin( 1 );
105 main_panel_l->setMargin( 3 );
107 for( int i = 0; i < SPrefsMax ; i++ ) simple_panels[i] = NULL;
109 if( config_GetInt( p_intf, "qt-advanced-pref" ) == 1 )
114 BUTTONACT( save, save() );
115 BUTTONACT( cancel, cancel() );
116 BUTTONACT( reset, reset() );
118 BUTTONACT( small, setSmall() );
119 BUTTONACT( all, setAdvanced() );
121 resize( 750, sizeHint().height() );
124 void PrefsDialog::setAdvanced()
126 /* We already have a simple TREE, and we just want to hide it */
128 if( simple_tree->isVisible() ) simple_tree->hide();
130 /* If don't have already and advanced TREE, then create it */
134 advanced_tree = new PrefsTree( p_intf, tree_panel );
135 /* and connections */
136 CONNECT( advanced_tree,
137 currentItemChanged( QTreeWidgetItem *, QTreeWidgetItem * ),
138 this, changeAdvPanel( QTreeWidgetItem * ) );
139 tree_panel_l->addWidget( advanced_tree );
143 advanced_tree->show();
145 /* Remove the simple current panel from the main panels*/
146 if( current_simple_panel )
147 if( current_simple_panel->isVisible() ) current_simple_panel->hide();
149 /* If no advanced Panel exist, create one, attach it and show it*/
150 if( !advanced_panel )
152 advanced_panel = new AdvPrefsPanel( main_panel );
153 main_panel_l->addWidget( advanced_panel );
155 advanced_panel->show();
157 /* Select the first Item of the preferences. Maybe you want to select a specified
159 advanced_tree->setCurrentIndex(
160 advanced_tree->model()->index( 0, 0, QModelIndex() ) );
162 all->setChecked( true );
165 void PrefsDialog::setSmall()
167 /* If an advanced TREE exists, remove and hide it */
169 if( advanced_tree->isVisible() ) advanced_tree->hide();
171 /* If no simple_tree, create one, connect it */
174 simple_tree = new SPrefsCatList( p_intf, tree_panel );
175 CONNECT( simple_tree,
176 currentItemChanged( int ),
177 this, changeSimplePanel( int ) );
178 tree_panel_l->addWidget( simple_tree );
184 /* If an Advanced PANEL exists, remove it */
186 if( advanced_panel->isVisible() ) advanced_panel->hide();
188 if( !current_simple_panel )
190 current_simple_panel =
191 new SPrefsPanel( p_intf, main_panel, SPrefsDefaultCat );
192 simple_panels[SPrefsDefaultCat] = current_simple_panel;
193 main_panel_l->addWidget( current_simple_panel );
196 current_simple_panel->show();
197 small->setChecked( true );
200 /* Switching from on simple panel to another */
201 void PrefsDialog::changeSimplePanel( int number )
203 if( current_simple_panel )
204 if( current_simple_panel->isVisible() ) current_simple_panel->hide();
206 current_simple_panel = simple_panels[number];
207 if( !current_simple_panel )
209 current_simple_panel = new SPrefsPanel( p_intf, main_panel, number );
210 simple_panels[number] = current_simple_panel;
211 main_panel_l->addWidget( current_simple_panel );
214 current_simple_panel->show();
217 /* Changing from one Advanced Panel to another */
218 void PrefsDialog::changeAdvPanel( QTreeWidgetItem *item )
220 PrefsItemData *data = item->data( 0, Qt::UserRole ).value<PrefsItemData*>();
223 if( advanced_panel->isVisible() ) advanced_panel->hide();
227 data->panel = new AdvPrefsPanel( p_intf, main_panel , data );
228 main_panel_l->addWidget( data->panel );
231 advanced_panel = data->panel;
232 advanced_panel->show();
236 /*Called from extended settings, is not used anymore, but could be useful one day*/
237 void PrefsDialog::showModulePrefs( char *psz_module )
240 all->setChecked( true );
241 for( int i_cat_index = 0 ; i_cat_index < advanced_tree->topLevelItemCount();
244 QTreeWidgetItem *cat_item = advanced_tree->topLevelItem( i_cat_index );
245 PrefsItemData *data = cat_item->data( 0, Qt::UserRole ).
246 value<PrefsItemData *>();
247 for( int i_sc_index = 0; i_sc_index < cat_item->childCount();
250 QTreeWidgetItem *subcat_item = cat_item->child( i_sc_index );
251 PrefsItemData *sc_data = subcat_item->data(0, Qt::UserRole).
252 value<PrefsItemData *>();
253 for( int i_module = 0; i_module < subcat_item->childCount();
256 QTreeWidgetItem *module_item = subcat_item->child( i_module );
257 PrefsItemData *mod_data = module_item->data( 0, Qt::UserRole ).
258 value<PrefsItemData *>();
259 if( !strcmp( mod_data->psz_name, psz_module ) ) {
260 advanced_tree->setCurrentItem( module_item );
269 /* Actual apply and save for the preferences */
270 void PrefsDialog::save()
272 if( small->isChecked() && simple_tree->isVisible() )
274 msg_Dbg( p_intf, "Saving the simple preferences" );
275 for( int i = 0 ; i< SPrefsMax; i++ ){
276 if( simple_panels[i] )simple_panels[i]->apply();
279 else if( all->isChecked() && advanced_tree->isVisible() )
281 msg_Dbg( p_intf, "Saving the advanced preferences" );
282 advanced_tree->applyAll();
286 config_SaveConfigFile( p_intf, NULL );
293 void PrefsDialog::destroyPanels()
295 msg_Dbg( p_intf, "Destroying the Panels" );
296 /* Delete the other panel in order to force its reload after clicking
297 on apply. In fact, if we don't do that, the preferences from the other
298 panels won't be accurate, so we would have to recreate the whole dialog,
299 and we don't want that.*/
300 if( small->isChecked() && advanced_panel )
302 /* Deleting only the active panel from the advanced config doesn't work
303 because the data records of PrefsItemData contains still a
304 reference to it only cleanAll() is sure to remove all Panels! */
305 advanced_tree->cleanAll();
306 advanced_panel = NULL;
308 if( all->isChecked() && current_simple_panel )
310 for( int i = 0 ; i< SPrefsMax; i++ )
312 if( simple_panels[i] )
314 delete simple_panels[i];
315 simple_panels[i] = NULL;
318 current_simple_panel = NULL;
323 /* Clean the preferences, dunno if it does something really */
324 void PrefsDialog::cancel()
326 if( small->isChecked() && simple_tree )
328 for( int i = 0 ; i< SPrefsMax; i++ )
329 if( simple_panels[i] ) simple_panels[i]->clean();
331 else if( all->isChecked() && advanced_tree )
333 advanced_tree->cleanAll();
334 advanced_panel = NULL;
339 /* Reset all the preferences, when you click the button */
340 void PrefsDialog::reset()
342 int ret = QMessageBox::question(
344 qtr( "Reset Preferences" ),
345 qtr( "This will reset your VLC media player preferences.\n"
346 "Are you sure you want to continue?" ),
347 QMessageBox::Ok | QMessageBox::Cancel,
350 if( ret == QMessageBox::Ok )
352 config_ResetAll( p_intf );
353 config_SaveConfigFile( p_intf, NULL );
354 /* FIXME reset the panels */