d45730b9301749e7e89ee152b29719c40933dc81
[quassel.git] / src / qtui / settingsdlg.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-08 by the Quassel Project                          *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) version 3.                                           *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20
21 #include "settingsdlg.h"
22
23 SettingsDlg::SettingsDlg(QWidget *parent)
24   : QDialog(parent),
25     _currentPage(0)
26 {
27   setModal(false);
28   ui.setupUi(this);
29
30   updateGeometry();
31
32   ui.settingsTree->setRootIsDecorated(false);
33
34   connect(ui.settingsTree, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelected()));
35   connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton *)), this, SLOT(buttonClicked(QAbstractButton *)));
36 }
37
38 void SettingsDlg::registerSettingsPage(SettingsPage *sp) {
39   sp->setParent(ui.settingsStack);
40   ui.settingsStack->addWidget(sp);
41   
42   connect(sp, SIGNAL(changed(bool)), this, SLOT(setButtonStates()));
43
44   QTreeWidgetItem *cat;
45   QList<QTreeWidgetItem *> cats = ui.settingsTree->findItems(sp->category(), Qt::MatchExactly);
46   if(!cats.count()) {
47     cat = new QTreeWidgetItem(ui.settingsTree, QStringList(sp->category()));
48     cat->setExpanded(true);
49     cat->setFlags(Qt::ItemIsEnabled);
50   } else {
51     cat = cats[0];
52   }
53   QTreeWidgetItem *item = new QTreeWidgetItem(cat, QStringList(sp->title()));
54   item->setData(0, SettingsPageRole, qVariantFromValue<QObject *>(sp));
55   pageIsLoaded[sp] = false;
56 }
57
58 void SettingsDlg::selectPage(SettingsPage *sp) {
59   if(!sp) {
60     _currentPage = 0;
61     ui.settingsStack->setCurrentIndex(0);
62     ui.pageTitle->setText(tr("Settings"));
63     return;
64   }
65
66   if(!pageIsLoaded[sp]) {
67     sp->load();
68     pageIsLoaded[sp] = true;
69   }
70
71   if(sp != currentPage() && currentPage() != 0 && currentPage()->hasChanged()) {
72     int ret = QMessageBox::warning(this, tr("Save changes"),
73                                   tr("There are unsaved changes on the current configuration page. Would you like to apply your changes now?"),
74                                   QMessageBox::Discard|QMessageBox::Save|QMessageBox::Cancel, QMessageBox::Cancel);
75     if(ret == QMessageBox::Save) {
76       if(!applyChanges()) sp = currentPage();
77     } else if(ret == QMessageBox::Discard) {
78       undoChanges();
79     } else sp = currentPage();
80   }
81
82   if(sp != currentPage()) {
83     ui.pageTitle->setText(sp->title());
84     ui.settingsStack->setCurrentWidget(sp);
85     _currentPage = sp;
86   }
87   setButtonStates();
88 }
89
90 void SettingsDlg::itemSelected() {
91   QList<QTreeWidgetItem *> items = ui.settingsTree->selectedItems();
92   SettingsPage *sp = 0;
93   if(!items.isEmpty()) {
94     sp = qobject_cast<SettingsPage *>(items[0]->data(0, SettingsPageRole).value<QObject *>());
95   }
96   selectPage(sp);
97 }
98
99 void SettingsDlg::setButtonStates() {
100   SettingsPage *sp = currentPage();
101   ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(sp && sp->hasChanged());
102   ui.buttonBox->button(QDialogButtonBox::Reset)->setEnabled(sp && sp->hasChanged());
103   ui.buttonBox->button(QDialogButtonBox::RestoreDefaults)->setEnabled(sp && sp->hasDefaults());
104 }
105
106 void SettingsDlg::buttonClicked(QAbstractButton *button) {
107   switch(ui.buttonBox->standardButton(button)) {
108     case QDialogButtonBox::Ok:
109       if(currentPage() && currentPage()->hasChanged()) {
110         if(applyChanges()) accept();
111       } else accept();
112       break;
113     case QDialogButtonBox::Apply:
114       applyChanges();
115       break;
116     case QDialogButtonBox::Cancel:
117       undoChanges();
118       reject();
119       break;
120     case QDialogButtonBox::Reset:
121       reload();
122       break;
123     case QDialogButtonBox::RestoreDefaults:
124       loadDefaults();
125       break;
126     default:
127       break;
128   }
129 }
130
131 bool SettingsDlg::applyChanges() {
132   if(!currentPage()) return false;
133   if(currentPage()->aboutToSave()) {
134     currentPage()->save();
135     return true;
136   }
137   return false;
138 }
139
140 void SettingsDlg::undoChanges() {
141   if(currentPage()) {
142     currentPage()->load();
143   }
144 }
145
146 void SettingsDlg::reload() {
147   if(!currentPage()) return;
148   int ret = QMessageBox::question(this, tr("Reload Settings"), tr("Do you like to reload the settings, undoing your changes on this page?"),
149                                   QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
150   if(ret == QMessageBox::Yes) {
151     currentPage()->load();
152   }
153 }
154
155 void SettingsDlg::loadDefaults() {
156   if(!currentPage()) return;
157   int ret = QMessageBox::question(this, tr("Restore Defaults"), tr("Do you like to restore the default values for this page?"),
158                                   QMessageBox::RestoreDefaults|QMessageBox::Cancel, QMessageBox::Cancel);
159   if(ret == QMessageBox::RestoreDefaults) {
160     currentPage()->defaults();
161   }
162 }