]> git.sesse.net Git - vlc/blob - modules/gui/qt4/dialogs/preferences.cpp
6997fdcc21d30edb5bc81d34089e257d52120403
[vlc] / modules / gui / qt4 / dialogs / preferences.cpp
1 /*****************************************************************************
2  * preferences.cpp : Preferences
3  *****************************************************************************
4  * Copyright (C) 2006-2007 the VideoLAN team
5  * $Id$
6  *
7  * Authors: ClĂ©ment Stenac <zorglub@videolan.org>
8  *          Jean-Baptiste Kempf <jb@videolan.org>
9  *
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.
14  *
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.
19  *
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  *****************************************************************************/
24 #ifdef HAVE_CONFIG_H
25 # include "config.h"
26 #endif
27
28 #include "dialogs/preferences.hpp"
29 #include "dialogs_provider.hpp"
30 #include "util/qvlcframe.hpp"
31
32 #include "components/complete_preferences.hpp"
33 #include "components/simple_preferences.hpp"
34
35 #include <QHBoxLayout>
36 #include <QGroupBox>
37 #include <QRadioButton>
38 #include <QVBoxLayout>
39 #include <QPushButton>
40 #include <QCheckBox>
41 #include <QMessageBox>
42 #include <QDialogButtonBox>
43
44 PrefsDialog *PrefsDialog::instance = NULL;
45
46 PrefsDialog::PrefsDialog( QWidget *parent, intf_thread_t *_p_intf )
47             : QVLCDialog( parent, _p_intf )
48 {
49     QGridLayout *main_layout = new QGridLayout( this );
50     setWindowTitle( qtr( "Preferences" ) );
51
52     /* Create Panels */
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 );
59
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 );
70
71     /* Tree and panel initialisations */
72     advanced_tree = NULL;
73     simple_tree = NULL;
74     current_simple_panel  = NULL;
75     advanced_panel = NULL;
76
77     /* Buttons */
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" ) );
82
83     buttonsBox->addButton( save, QDialogButtonBox::AcceptRole );
84     buttonsBox->addButton( cancel, QDialogButtonBox::RejectRole );
85     buttonsBox->addButton( reset, QDialogButtonBox::ResetRole );
86
87     /* Layout  */
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 );
92
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 );
98
99     main_layout->setRowStretch( 2, 4 );
100
101     setLayout( main_layout );
102
103     /* Margins */
104     tree_panel_l->setMargin( 1 );
105     main_panel_l->setMargin( 3 );
106
107     for( int i = 0; i < SPrefsMax ; i++ ) simple_panels[i] = NULL;
108
109     if( config_GetInt( p_intf, "qt-advanced-pref" ) == 1 )
110         setAdvanced();
111     else
112         setSmall();
113
114     BUTTONACT( save, save() );
115     BUTTONACT( cancel, cancel() );
116     BUTTONACT( reset, reset() );
117
118     BUTTONACT( small, setSmall() );
119     BUTTONACT( all, setAdvanced() );
120
121     resize( 750, sizeHint().height() );
122 }
123
124 void PrefsDialog::setAdvanced()
125 {
126     /* We already have a simple TREE, and we just want to hide it */
127     if( simple_tree )
128         if( simple_tree->isVisible() ) simple_tree->hide();
129
130     /* If don't have already and advanced TREE, then create it */
131     if( !advanced_tree )
132     {
133         /* Creation */
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 );
140     }
141
142     /* Show it */
143     advanced_tree->show();
144
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();
148
149     /* If no advanced Panel exist, create one, attach it and show it*/
150     if( !advanced_panel )
151     {
152         advanced_panel = new AdvPrefsPanel( main_panel );
153         main_panel_l->addWidget( advanced_panel );
154     }
155     advanced_panel->show();
156
157     /* Select the first Item of the preferences. Maybe you want to select a specified
158        category... */
159     advanced_tree->setCurrentIndex(
160             advanced_tree->model()->index( 0, 0, QModelIndex() ) );
161
162     all->setChecked( true );
163 }
164
165 void PrefsDialog::setSmall()
166 {
167     /* If an advanced TREE exists, remove and hide it */
168     if( advanced_tree )
169         if( advanced_tree->isVisible() ) advanced_tree->hide();
170
171     /* If no simple_tree, create one, connect it */
172     if( !simple_tree )
173     {
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 );
179     }
180
181     /*show it */
182     simple_tree->show();
183
184     /* If an Advanced PANEL exists, remove it */
185     if( advanced_panel )
186         if( advanced_panel->isVisible() ) advanced_panel->hide();
187
188     if( !current_simple_panel )
189     {
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 );
194     }
195
196     current_simple_panel->show();
197     small->setChecked( true );
198 }
199
200 /* Switching from on simple panel to another */
201 void PrefsDialog::changeSimplePanel( int number )
202 {
203     if( current_simple_panel )
204         if( current_simple_panel->isVisible() ) current_simple_panel->hide();
205
206     current_simple_panel = simple_panels[number];
207     if( !current_simple_panel )
208     {
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 );
212     }
213
214     current_simple_panel->show();
215 }
216
217 /* Changing from one Advanced Panel to another */
218 void PrefsDialog::changeAdvPanel( QTreeWidgetItem *item )
219 {
220     PrefsItemData *data = item->data( 0, Qt::UserRole ).value<PrefsItemData*>();
221
222     if( advanced_panel )
223         if( advanced_panel->isVisible() ) advanced_panel->hide();
224
225     if( !data->panel )
226     {
227         data->panel = new AdvPrefsPanel( p_intf, main_panel , data );
228         main_panel_l->addWidget( data->panel );
229     }
230
231     advanced_panel = data->panel;
232     advanced_panel->show();
233 }
234
235 #if 0
236 /*Called from extended settings, is not used anymore, but could be useful one day*/
237 void PrefsDialog::showModulePrefs( char *psz_module )
238 {
239     setAdvanced();
240     all->setChecked( true );
241     for( int i_cat_index = 0 ; i_cat_index < advanced_tree->topLevelItemCount();
242          i_cat_index++ )
243     {
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();
248                                   i_sc_index++ )
249         {
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();
254                                    i_module++ )
255             {
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 );
261                 }
262             }
263         }
264     }
265     show();
266 }
267 #endif
268
269 /* Actual apply and save for the preferences */
270 void PrefsDialog::save()
271 {
272     if( small->isChecked() && simple_tree->isVisible() )
273     {
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();
277         }
278     }
279     else if( all->isChecked() && advanced_tree->isVisible() )
280     {
281         msg_Dbg( p_intf, "Saving the advanced preferences" );
282         advanced_tree->applyAll();
283     }
284
285     /* Save to file */
286     config_SaveConfigFile( p_intf, NULL );
287
288     destroyPanels();
289
290     hide();
291 }
292
293 void PrefsDialog::destroyPanels()
294 {
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 )
301     {
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;
307     }
308     if( all->isChecked() && current_simple_panel )
309     {
310         for( int i = 0 ; i< SPrefsMax; i++ )
311         {
312             if( simple_panels[i] )
313             {
314                delete simple_panels[i];
315                simple_panels[i] = NULL;
316             }
317         }
318         current_simple_panel  = NULL;
319     }
320 }
321
322
323 /* Clean the preferences, dunno if it does something really */
324 void PrefsDialog::cancel()
325 {
326     if( small->isChecked() && simple_tree )
327     {
328         for( int i = 0 ; i< SPrefsMax; i++ )
329             if( simple_panels[i] ) simple_panels[i]->clean();
330     }
331     else if( all->isChecked() && advanced_tree )
332     {
333         advanced_tree->cleanAll();
334         advanced_panel = NULL;
335     }
336     hide();
337 }
338
339 /* Reset all the preferences, when you click the button */
340 void PrefsDialog::reset()
341 {
342     int ret = QMessageBox::question(
343                  this,
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,
348                  QMessageBox::Ok);
349
350     if( ret == QMessageBox::Ok )
351     {
352         config_ResetAll( p_intf );
353         config_SaveConfigFile( p_intf, NULL );
354         /* FIXME reset the panels */
355         destroyPanels();
356     }
357 }