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 *****************************************************************************/
25 #include "dialogs/preferences.hpp"
26 #include "dialogs_provider.hpp"
27 #include "util/qvlcframe.hpp"
29 #include "components/complete_preferences.hpp"
30 #include "components/simple_preferences.hpp"
32 #include <QHBoxLayout>
34 #include <QRadioButton>
35 #include <QVBoxLayout>
36 #include <QPushButton>
38 #include <QMessageBox>
39 #include <QDialogButtonBox>
41 PrefsDialog *PrefsDialog::instance = NULL;
43 PrefsDialog::PrefsDialog( QWidget *parent, intf_thread_t *_p_intf )
44 : QVLCDialog( parent, _p_intf )
46 QGridLayout *main_layout = new QGridLayout( this );
47 setWindowTitle( qtr( "Preferences" ) );
50 tree_panel = new QWidget;
51 tree_panel_l = new QHBoxLayout;
52 tree_panel->setLayout( tree_panel_l );
53 main_panel = new QWidget;
54 main_panel_l = new QHBoxLayout;
55 main_panel->setLayout( main_panel_l );
57 /* Choice for types */
58 types = new QGroupBox( "Show settings" );
59 types->setAlignment( Qt::AlignHCenter );
60 QHBoxLayout *types_l = new QHBoxLayout;
61 types_l->setSpacing( 3 ); types_l->setMargin( 3 );
62 small = new QRadioButton( qtr("Basic"), types );
63 types_l->addWidget( small );
64 all = new QRadioButton( qtr("All"), types ); types_l->addWidget( all );
65 types->setLayout( types_l );
66 small->setChecked( true );
68 /* Tree and panel initialisations */
71 current_simple_panel = NULL;
72 advanced_panel = NULL;
75 QDialogButtonBox *buttonsBox = new QDialogButtonBox();
76 QPushButton *save = new QPushButton( qtr( "&Save" ) );
77 QPushButton *cancel = new QPushButton( qtr( "&Cancel" ) );
78 QPushButton *reset = new QPushButton( qtr( "&Reset Preferences" ) );
80 buttonsBox->addButton( save, QDialogButtonBox::AcceptRole );
81 buttonsBox->addButton( cancel, QDialogButtonBox::RejectRole );
82 buttonsBox->addButton( reset, QDialogButtonBox::ActionRole );
85 main_layout->addWidget( tree_panel, 0, 0, 3, 1 );
86 main_layout->addWidget( types, 3, 0, 2, 1 );
87 main_layout->addWidget( main_panel, 0, 1, 4, 1 );
88 main_layout->addWidget( buttonsBox, 4, 1, 1 ,2 );
90 main_layout->setColumnMinimumWidth( 0, 150 );
91 main_layout->setColumnStretch( 0, 1 );
92 main_layout->setColumnStretch( 1, 3 );
94 main_layout->setRowStretch( 2, 4 );
96 setLayout( main_layout );
99 tree_panel_l->setMargin( 1 );
100 main_panel_l->setMargin( 3 );
102 for( int i = 0; i < SPrefsMax ; i++ ) simple_panels[i] = NULL;
104 if( config_GetInt( p_intf, "qt-advanced-pref" ) == 1 )
109 BUTTONACT( save, save() );
110 BUTTONACT( cancel, cancel() );
111 BUTTONACT( reset, reset() );
113 BUTTONACT( small, setSmall() );
114 BUTTONACT( all, setAdvanced() );
116 resize( 750, sizeHint().height() );
119 void PrefsDialog::setAdvanced()
121 /* We already have a simple TREE, and we just want to hide it */
123 if( simple_tree->isVisible() ) simple_tree->hide();
125 /* If don't have already and advanced TREE, then create it */
129 advanced_tree = new PrefsTree( p_intf, tree_panel );
130 /* and connections */
131 CONNECT( advanced_tree,
132 currentItemChanged( QTreeWidgetItem *, QTreeWidgetItem * ),
133 this, changeAdvPanel( QTreeWidgetItem * ) );
134 tree_panel_l->addWidget( advanced_tree );
138 advanced_tree->show();
140 /* Remove the simple current panel from the main panels*/
141 if( current_simple_panel )
142 if( current_simple_panel->isVisible() ) current_simple_panel->hide();
144 /* If no advanced Panel exist, create one, attach it and show it*/
145 if( !advanced_panel )
147 advanced_panel = new AdvPrefsPanel( main_panel );
148 main_panel_l->addWidget( advanced_panel );
150 advanced_panel->show();
152 /* Select the first Item of the preferences. Maybe you want to select a specified
154 advanced_tree->setCurrentIndex(
155 advanced_tree->model()->index( 0, 0, QModelIndex() ) );
157 all->setChecked( true );
160 void PrefsDialog::setSmall()
162 /* If an advanced TREE exists, remove and hide it */
164 if( advanced_tree->isVisible() ) advanced_tree->hide();
166 /* If no simple_tree, create one, connect it */
169 simple_tree = new SPrefsCatList( p_intf, tree_panel );
170 CONNECT( simple_tree,
171 currentItemChanged( int ),
172 this, changeSimplePanel( int ) );
173 tree_panel_l->addWidget( simple_tree );
179 /* If an Advanced PANEL exists, remove it */
181 if( advanced_panel->isVisible() ) advanced_panel->hide();
183 if( !current_simple_panel )
185 current_simple_panel =
186 new SPrefsPanel( p_intf, main_panel, SPrefsDefaultCat );
187 simple_panels[SPrefsDefaultCat] = current_simple_panel;
188 main_panel_l->addWidget( current_simple_panel );
191 current_simple_panel->show();
192 small->setChecked( true );
195 /* Switching from on simple panel to another */
196 void PrefsDialog::changeSimplePanel( int number )
198 if( current_simple_panel )
199 if( current_simple_panel->isVisible() ) current_simple_panel->hide();
201 current_simple_panel = simple_panels[number];
202 if( !current_simple_panel )
204 current_simple_panel = new SPrefsPanel( p_intf, main_panel, number );
205 simple_panels[number] = current_simple_panel;
206 main_panel_l->addWidget( current_simple_panel );
209 current_simple_panel->show();
212 /* Changing from one Advanced Panel to another */
213 void PrefsDialog::changeAdvPanel( QTreeWidgetItem *item )
215 PrefsItemData *data = item->data( 0, Qt::UserRole ).value<PrefsItemData*>();
218 if( advanced_panel->isVisible() ) advanced_panel->hide();
222 data->panel = new AdvPrefsPanel( p_intf, main_panel , data );
223 main_panel_l->addWidget( data->panel );
226 advanced_panel = data->panel;
227 advanced_panel->show();
231 /*Called from extended settings, is not used anymore, but could be useful one day*/
232 void PrefsDialog::showModulePrefs( char *psz_module )
235 all->setChecked( true );
236 for( int i_cat_index = 0 ; i_cat_index < advanced_tree->topLevelItemCount();
239 QTreeWidgetItem *cat_item = advanced_tree->topLevelItem( i_cat_index );
240 PrefsItemData *data = cat_item->data( 0, Qt::UserRole ).
241 value<PrefsItemData *>();
242 for( int i_sc_index = 0; i_sc_index < cat_item->childCount();
245 QTreeWidgetItem *subcat_item = cat_item->child( i_sc_index );
246 PrefsItemData *sc_data = subcat_item->data(0, Qt::UserRole).
247 value<PrefsItemData *>();
248 for( int i_module = 0; i_module < subcat_item->childCount();
251 QTreeWidgetItem *module_item = subcat_item->child( i_module );
252 PrefsItemData *mod_data = module_item->data( 0, Qt::UserRole ).
253 value<PrefsItemData *>();
254 if( !strcmp( mod_data->psz_name, psz_module ) ) {
255 advanced_tree->setCurrentItem( module_item );
264 /* Actual apply and save for the preferences */
265 void PrefsDialog::save()
267 if( small->isChecked() && simple_tree->isVisible() )
269 msg_Dbg( p_intf, "Saving the simple preferences" );
270 for( int i = 0 ; i< SPrefsMax; i++ ){
271 if( simple_panels[i] )simple_panels[i]->apply();
274 else if( all->isChecked() && advanced_tree->isVisible() )
276 msg_Dbg( p_intf, "Saving the advanced preferences" );
277 advanced_tree->applyAll();
281 config_SaveConfigFile( p_intf, NULL );
283 /* Delete the other panel in order to force its reload after clicking
284 on apply. In fact, if we don't do that, the preferences from the other
285 panels won't be accurate, so we would have to recreate the whole dialog,
286 and we don't want that.*/
287 if( small->isChecked() && advanced_panel )
289 /* Deleting only the active panel from the advanced config doesn't work
290 because the data records of PrefsItemData contains still a
291 reference to it only cleanAll() is sure to remove all Panels! */
292 advanced_tree->cleanAll();
293 advanced_panel = NULL;
295 if( all->isChecked() && current_simple_panel )
297 for( int i = 0 ; i< SPrefsMax; i++ )
299 if( simple_panels[i] )
301 delete simple_panels[i];
302 simple_panels[i] = NULL;
305 current_simple_panel = NULL;
311 /* Clean the preferences, dunno if it does something really */
312 void PrefsDialog::cancel()
314 if( small->isChecked() && simple_tree )
316 for( int i = 0 ; i< SPrefsMax; i++ )
317 if( simple_panels[i] ) simple_panels[i]->clean();
319 else if( all->isChecked() && advanced_tree )
321 advanced_tree->cleanAll();
322 advanced_panel = NULL;
327 /* Reset all the preferences, when you click the button */
328 void PrefsDialog::reset()
330 int ret = QMessageBox::question(
332 qtr( "Reset Preferences" ),
333 qtr( "This will reset your VLC media player preferences.\n"
334 "Are you sure you want to continue?" ),
335 QMessageBox::Ok | QMessageBox::Cancel,
338 if( ret == QMessageBox::Ok )
340 config_ResetAll( p_intf );
341 config_SaveConfigFile( p_intf, NULL );