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 *****************************************************************************/
29 #include "dialogs/preferences.hpp"
30 #include "dialogs_provider.hpp"
31 #include "util/qvlcframe.hpp"
33 #include "components/complete_preferences.hpp"
34 #include "components/simple_preferences.hpp"
36 #include <QHBoxLayout>
38 #include <QRadioButton>
39 #include <QVBoxLayout>
40 #include <QPushButton>
42 #include <QMessageBox>
43 #include <QDialogButtonBox>
45 PrefsDialog *PrefsDialog::instance = NULL;
47 PrefsDialog::PrefsDialog( QWidget *parent, intf_thread_t *_p_intf )
48 : QVLCDialog( parent, _p_intf )
50 QGridLayout *main_layout = new QGridLayout( this );
51 setWindowTitle( qtr( "Preferences" ) );
53 /* Whether we want it or not, we need to destroy on close to get
54 consistency when reset */
55 setAttribute( Qt::WA_DeleteOnClose );
58 tree_panel = new QWidget;
59 tree_panel_l = new QHBoxLayout;
60 tree_panel->setLayout( tree_panel_l );
61 main_panel = new QWidget;
62 main_panel_l = new QHBoxLayout;
63 main_panel->setLayout( main_panel_l );
65 /* Choice for types */
66 types = new QGroupBox( qtr("Show settings") );
67 types->setAlignment( Qt::AlignHCenter );
68 QHBoxLayout *types_l = new QHBoxLayout;
69 types_l->setSpacing( 3 ); types_l->setMargin( 3 );
70 small = new QRadioButton( qtr( "Simple" ), types );
71 small->setToolTip( qtr( "Switch to simple preferences" ) );
72 types_l->addWidget( small );
73 all = new QRadioButton( qtr("All"), types ); types_l->addWidget( all );
74 all->setToolTip( qtr( "Switch to complete preferences" ) );
75 types->setLayout( types_l );
76 small->setChecked( true );
78 /* Tree and panel initialisations */
81 current_simple_panel = NULL;
82 advanced_panel = NULL;
85 QDialogButtonBox *buttonsBox = new QDialogButtonBox();
86 QPushButton *save = new QPushButton( qtr( "&Save" ) );
87 QPushButton *cancel = new QPushButton( qtr( "&Cancel" ) );
88 QPushButton *reset = new QPushButton( qtr( "&Reset Preferences" ) );
90 buttonsBox->addButton( save, QDialogButtonBox::AcceptRole );
91 buttonsBox->addButton( cancel, QDialogButtonBox::RejectRole );
92 buttonsBox->addButton( reset, QDialogButtonBox::ResetRole );
95 main_layout->addWidget( tree_panel, 0, 0, 3, 1 );
96 main_layout->addWidget( types, 3, 0, 2, 1 );
97 main_layout->addWidget( main_panel, 0, 1, 4, 2 );
98 main_layout->addWidget( buttonsBox, 4, 2, 1 ,1 );
100 main_layout->setColumnMinimumWidth( 0, 150 );
101 main_layout->setColumnMinimumWidth( 1, 10 );
102 main_layout->setColumnStretch( 0, 1 );
103 main_layout->setColumnStretch( 1, 0 );
104 main_layout->setColumnStretch( 2, 3 );
106 main_layout->setRowStretch( 2, 4 );
108 main_layout->setMargin( 9 );
109 setLayout( main_layout );
112 tree_panel_l->setMargin( 1 );
113 main_panel_l->setLayoutMargins( 6, 0, 0, 3, 3 );
115 for( int i = 0; i < SPrefsMax ; i++ ) simple_panels[i] = NULL;
117 if( config_GetInt( p_intf, "qt-advanced-pref" ) == 1 )
122 BUTTONACT( save, save() );
123 BUTTONACT( cancel, cancel() );
124 BUTTONACT( reset, reset() );
126 BUTTONACT( small, setSmall() );
127 BUTTONACT( all, setAdvanced() );
129 resize( 750, sizeHint().height() );
132 void PrefsDialog::setAdvanced()
134 /* We already have a simple TREE, and we just want to hide it */
136 if( simple_tree->isVisible() ) simple_tree->hide();
138 /* If don't have already and advanced TREE, then create it */
142 advanced_tree = new PrefsTree( p_intf, tree_panel );
143 /* and connections */
144 CONNECT( advanced_tree,
145 currentItemChanged( QTreeWidgetItem *, QTreeWidgetItem * ),
146 this, changeAdvPanel( QTreeWidgetItem * ) );
147 tree_panel_l->addWidget( advanced_tree );
151 advanced_tree->show();
153 /* Remove the simple current panel from the main panels*/
154 if( current_simple_panel )
155 if( current_simple_panel->isVisible() ) current_simple_panel->hide();
157 /* If no advanced Panel exist, create one, attach it and show it*/
158 if( !advanced_panel )
160 advanced_panel = new AdvPrefsPanel( main_panel );
161 main_panel_l->addWidget( advanced_panel );
163 advanced_panel->show();
165 /* Select the first Item of the preferences. Maybe you want to select a specified
167 advanced_tree->setCurrentIndex(
168 advanced_tree->model()->index( 0, 0, QModelIndex() ) );
170 all->setChecked( true );
173 void PrefsDialog::setSmall()
175 /* If an advanced TREE exists, remove and hide it */
177 if( advanced_tree->isVisible() ) advanced_tree->hide();
179 /* If no simple_tree, create one, connect it */
182 simple_tree = new SPrefsCatList( p_intf, tree_panel );
183 CONNECT( simple_tree,
184 currentItemChanged( int ),
185 this, changeSimplePanel( int ) );
186 tree_panel_l->addWidget( simple_tree );
192 /* If an Advanced PANEL exists, remove it */
194 if( advanced_panel->isVisible() ) advanced_panel->hide();
196 if( !current_simple_panel )
198 current_simple_panel =
199 new SPrefsPanel( p_intf, main_panel, SPrefsDefaultCat );
200 simple_panels[SPrefsDefaultCat] = current_simple_panel;
201 main_panel_l->addWidget( current_simple_panel );
204 current_simple_panel->show();
205 small->setChecked( true );
208 /* Switching from on simple panel to another */
209 void PrefsDialog::changeSimplePanel( int number )
211 if( current_simple_panel )
212 if( current_simple_panel->isVisible() ) current_simple_panel->hide();
214 current_simple_panel = simple_panels[number];
215 if( !current_simple_panel )
217 current_simple_panel = new SPrefsPanel( p_intf, main_panel, number );
218 simple_panels[number] = current_simple_panel;
219 main_panel_l->addWidget( current_simple_panel );
222 current_simple_panel->show();
225 /* Changing from one Advanced Panel to another */
226 void PrefsDialog::changeAdvPanel( QTreeWidgetItem *item )
228 PrefsItemData *data = item->data( 0, Qt::UserRole ).value<PrefsItemData*>();
231 if( advanced_panel->isVisible() ) advanced_panel->hide();
235 data->panel = new AdvPrefsPanel( p_intf, main_panel , data );
236 main_panel_l->addWidget( data->panel );
239 advanced_panel = data->panel;
240 advanced_panel->show();
244 /*Called from extended settings, is not used anymore, but could be useful one day*/
245 void PrefsDialog::showModulePrefs( char *psz_module )
248 all->setChecked( true );
249 for( int i_cat_index = 0 ; i_cat_index < advanced_tree->topLevelItemCount();
252 QTreeWidgetItem *cat_item = advanced_tree->topLevelItem( i_cat_index );
253 PrefsItemData *data = cat_item->data( 0, Qt::UserRole ).
254 value<PrefsItemData *>();
255 for( int i_sc_index = 0; i_sc_index < cat_item->childCount();
258 QTreeWidgetItem *subcat_item = cat_item->child( i_sc_index );
259 PrefsItemData *sc_data = subcat_item->data(0, Qt::UserRole).
260 value<PrefsItemData *>();
261 for( int i_module = 0; i_module < subcat_item->childCount();
264 QTreeWidgetItem *module_item = subcat_item->child( i_module );
265 PrefsItemData *mod_data = module_item->data( 0, Qt::UserRole ).
266 value<PrefsItemData *>();
267 if( !strcmp( mod_data->psz_name, psz_module ) ) {
268 advanced_tree->setCurrentItem( module_item );
277 /* Actual apply and save for the preferences */
278 void PrefsDialog::save()
280 if( small->isChecked() && simple_tree->isVisible() )
282 msg_Dbg( p_intf, "Saving the simple preferences" );
283 for( int i = 0 ; i< SPrefsMax; i++ ){
284 if( simple_panels[i] )simple_panels[i]->apply();
287 else if( all->isChecked() && advanced_tree->isVisible() )
289 msg_Dbg( p_intf, "Saving the advanced preferences" );
290 advanced_tree->applyAll();
294 config_SaveConfigFile( p_intf, NULL );
301 void PrefsDialog::destroyPanels()
303 msg_Dbg( p_intf, "Destroying the Panels" );
304 /* Delete the other panel in order to force its reload after clicking
305 on apply. In fact, if we don't do that, the preferences from the other
306 panels won't be accurate, so we would have to recreate the whole dialog,
307 and we don't want that.*/
308 if( small->isChecked() && advanced_panel )
310 /* Deleting only the active panel from the advanced config doesn't work
311 because the data records of PrefsItemData contains still a
312 reference to it only cleanAll() is sure to remove all Panels! */
313 advanced_tree->cleanAll();
314 advanced_panel = NULL;
316 if( all->isChecked() && current_simple_panel )
318 for( int i = 0 ; i< SPrefsMax; i++ )
320 if( simple_panels[i] )
322 delete simple_panels[i];
323 simple_panels[i] = NULL;
326 current_simple_panel = NULL;
331 /* Clean the preferences, dunno if it does something really */
332 void PrefsDialog::cancel()
334 if( small->isChecked() && simple_tree )
336 for( int i = 0 ; i< SPrefsMax; i++ )
337 if( simple_panels[i] ) simple_panels[i]->clean();
339 else if( all->isChecked() && advanced_tree )
341 advanced_tree->cleanAll();
342 advanced_panel = NULL;
347 /* Reset all the preferences, when you click the button */
348 void PrefsDialog::reset()
350 int ret = QMessageBox::question(
352 qtr( "Reset Preferences" ),
353 qtr( "This will reset your VLC media player preferences.\n"
354 "Are you sure you want to continue?" ),
355 QMessageBox::Ok | QMessageBox::Cancel,
358 if( ret == QMessageBox::Ok )
360 config_ResetAll( p_intf );
361 config_SaveConfigFile( p_intf, NULL );
365 PrefsDialog::getInstance( p_intf )->show();