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, 1 );
91 main_layout->addWidget( buttonsBox, 4, 1, 1 ,2 );
93 main_layout->setColumnMinimumWidth( 0, 150 );
94 main_layout->setColumnStretch( 0, 1 );
95 main_layout->setColumnStretch( 1, 3 );
97 main_layout->setRowStretch( 2, 4 );
99 setLayout( main_layout );
102 tree_panel_l->setMargin( 1 );
103 main_panel_l->setMargin( 3 );
105 for( int i = 0; i < SPrefsMax ; i++ ) simple_panels[i] = NULL;
107 if( config_GetInt( p_intf, "qt-advanced-pref" ) == 1 )
112 BUTTONACT( save, save() );
113 BUTTONACT( cancel, cancel() );
114 BUTTONACT( reset, reset() );
116 BUTTONACT( small, setSmall() );
117 BUTTONACT( all, setAdvanced() );
119 resize( 750, sizeHint().height() );
122 void PrefsDialog::setAdvanced()
124 /* We already have a simple TREE, and we just want to hide it */
126 if( simple_tree->isVisible() ) simple_tree->hide();
128 /* If don't have already and advanced TREE, then create it */
132 advanced_tree = new PrefsTree( p_intf, tree_panel );
133 /* and connections */
134 CONNECT( advanced_tree,
135 currentItemChanged( QTreeWidgetItem *, QTreeWidgetItem * ),
136 this, changeAdvPanel( QTreeWidgetItem * ) );
137 tree_panel_l->addWidget( advanced_tree );
141 advanced_tree->show();
143 /* Remove the simple current panel from the main panels*/
144 if( current_simple_panel )
145 if( current_simple_panel->isVisible() ) current_simple_panel->hide();
147 /* If no advanced Panel exist, create one, attach it and show it*/
148 if( !advanced_panel )
150 advanced_panel = new AdvPrefsPanel( main_panel );
151 main_panel_l->addWidget( advanced_panel );
153 advanced_panel->show();
155 /* Select the first Item of the preferences. Maybe you want to select a specified
157 advanced_tree->setCurrentIndex(
158 advanced_tree->model()->index( 0, 0, QModelIndex() ) );
160 all->setChecked( true );
163 void PrefsDialog::setSmall()
165 /* If an advanced TREE exists, remove and hide it */
167 if( advanced_tree->isVisible() ) advanced_tree->hide();
169 /* If no simple_tree, create one, connect it */
172 simple_tree = new SPrefsCatList( p_intf, tree_panel );
173 CONNECT( simple_tree,
174 currentItemChanged( int ),
175 this, changeSimplePanel( int ) );
176 tree_panel_l->addWidget( simple_tree );
182 /* If an Advanced PANEL exists, remove it */
184 if( advanced_panel->isVisible() ) advanced_panel->hide();
186 if( !current_simple_panel )
188 current_simple_panel =
189 new SPrefsPanel( p_intf, main_panel, SPrefsDefaultCat );
190 simple_panels[SPrefsDefaultCat] = current_simple_panel;
191 main_panel_l->addWidget( current_simple_panel );
194 current_simple_panel->show();
195 small->setChecked( true );
198 /* Switching from on simple panel to another */
199 void PrefsDialog::changeSimplePanel( int number )
201 if( current_simple_panel )
202 if( current_simple_panel->isVisible() ) current_simple_panel->hide();
204 current_simple_panel = simple_panels[number];
205 if( !current_simple_panel )
207 current_simple_panel = new SPrefsPanel( p_intf, main_panel, number );
208 simple_panels[number] = current_simple_panel;
209 main_panel_l->addWidget( current_simple_panel );
212 current_simple_panel->show();
215 /* Changing from one Advanced Panel to another */
216 void PrefsDialog::changeAdvPanel( QTreeWidgetItem *item )
218 PrefsItemData *data = item->data( 0, Qt::UserRole ).value<PrefsItemData*>();
221 if( advanced_panel->isVisible() ) advanced_panel->hide();
225 data->panel = new AdvPrefsPanel( p_intf, main_panel , data );
226 main_panel_l->addWidget( data->panel );
229 advanced_panel = data->panel;
230 advanced_panel->show();
234 /*Called from extended settings, is not used anymore, but could be useful one day*/
235 void PrefsDialog::showModulePrefs( char *psz_module )
238 all->setChecked( true );
239 for( int i_cat_index = 0 ; i_cat_index < advanced_tree->topLevelItemCount();
242 QTreeWidgetItem *cat_item = advanced_tree->topLevelItem( i_cat_index );
243 PrefsItemData *data = cat_item->data( 0, Qt::UserRole ).
244 value<PrefsItemData *>();
245 for( int i_sc_index = 0; i_sc_index < cat_item->childCount();
248 QTreeWidgetItem *subcat_item = cat_item->child( i_sc_index );
249 PrefsItemData *sc_data = subcat_item->data(0, Qt::UserRole).
250 value<PrefsItemData *>();
251 for( int i_module = 0; i_module < subcat_item->childCount();
254 QTreeWidgetItem *module_item = subcat_item->child( i_module );
255 PrefsItemData *mod_data = module_item->data( 0, Qt::UserRole ).
256 value<PrefsItemData *>();
257 if( !strcmp( mod_data->psz_name, psz_module ) ) {
258 advanced_tree->setCurrentItem( module_item );
267 /* Actual apply and save for the preferences */
268 void PrefsDialog::save()
270 if( small->isChecked() && simple_tree->isVisible() )
272 msg_Dbg( p_intf, "Saving the simple preferences" );
273 for( int i = 0 ; i< SPrefsMax; i++ ){
274 if( simple_panels[i] )simple_panels[i]->apply();
277 else if( all->isChecked() && advanced_tree->isVisible() )
279 msg_Dbg( p_intf, "Saving the advanced preferences" );
280 advanced_tree->applyAll();
284 config_SaveConfigFile( p_intf, NULL );
291 void PrefsDialog::destroyPanels()
293 msg_Dbg( p_intf, "Destroying the Panels" );
294 /* Delete the other panel in order to force its reload after clicking
295 on apply. In fact, if we don't do that, the preferences from the other
296 panels won't be accurate, so we would have to recreate the whole dialog,
297 and we don't want that.*/
298 if( small->isChecked() && advanced_panel )
300 /* Deleting only the active panel from the advanced config doesn't work
301 because the data records of PrefsItemData contains still a
302 reference to it only cleanAll() is sure to remove all Panels! */
303 advanced_tree->cleanAll();
304 advanced_panel = NULL;
306 if( all->isChecked() && current_simple_panel )
308 for( int i = 0 ; i< SPrefsMax; i++ )
310 if( simple_panels[i] )
312 delete simple_panels[i];
313 simple_panels[i] = NULL;
316 current_simple_panel = NULL;
321 /* Clean the preferences, dunno if it does something really */
322 void PrefsDialog::cancel()
324 if( small->isChecked() && simple_tree )
326 for( int i = 0 ; i< SPrefsMax; i++ )
327 if( simple_panels[i] ) simple_panels[i]->clean();
329 else if( all->isChecked() && advanced_tree )
331 advanced_tree->cleanAll();
332 advanced_panel = NULL;
337 /* Reset all the preferences, when you click the button */
338 void PrefsDialog::reset()
340 int ret = QMessageBox::question(
342 qtr( "Reset Preferences" ),
343 qtr( "This will reset your VLC media player preferences.\n"
344 "Are you sure you want to continue?" ),
345 QMessageBox::Ok | QMessageBox::Cancel,
348 if( ret == QMessageBox::Ok )
350 config_ResetAll( p_intf );
351 config_SaveConfigFile( p_intf, NULL );
352 /* FIXME reset the panels */