1 | /*************************************************************************** |
2 | * Copyright (C) 2005-2014 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 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * |
19 | ***************************************************************************/ |
20 | |
21 | #include "settingspage.h" |
22 | |
23 | #include <QCheckBox> |
24 | #include <QComboBox> |
25 | #include <QSpinBox> |
26 | #include <QVariant> |
27 | |
28 | #include "uisettings.h" |
29 | |
30 | SettingsPage::SettingsPage(const QString &category, const QString &title, QWidget *parent) |
31 | : QWidget(parent), |
32 | _category(category), |
33 | _title(title), |
34 | _changed(false), |
35 | _autoWidgetsChanged(false) |
36 | { |
37 | } |
38 | |
39 | |
40 | void SettingsPage::setChangedState(bool hasChanged_) |
41 | { |
42 | if (hasChanged_ != _changed) { |
43 | bool old = hasChanged(); |
44 | _changed = hasChanged_; |
45 | if (hasChanged() != old) |
46 | emit changed(hasChanged()); |
47 | } |
48 | } |
49 | |
50 | |
51 | void SettingsPage::load(QCheckBox *box, bool checked) |
52 | { |
53 | box->setProperty("StoredValue" , checked); |
54 | box->setChecked(checked); |
55 | } |
56 | |
57 | |
58 | bool SettingsPage::hasChanged(QCheckBox *box) |
59 | { |
60 | return box->property("StoredValue" ).toBool() != box->isChecked(); |
61 | } |
62 | |
63 | |
64 | void SettingsPage::load(QComboBox *box, int index) |
65 | { |
66 | box->setProperty("StoredValue" , index); |
67 | box->setCurrentIndex(index); |
68 | } |
69 | |
70 | |
71 | bool SettingsPage::hasChanged(QComboBox *box) |
72 | { |
73 | return box->property("StoredValue" ).toInt() != box->currentIndex(); |
74 | } |
75 | |
76 | |
77 | void SettingsPage::load(QSpinBox *box, int value) |
78 | { |
79 | box->setProperty("StoredValue" , value); |
80 | box->setValue(value); |
81 | } |
82 | |
83 | |
84 | bool SettingsPage::hasChanged(QSpinBox *box) |
85 | { |
86 | return box->property("StoredValue" ).toInt() != box->value(); |
87 | } |
88 | |
89 | |
90 | /*** Auto child widget handling ***/ |
91 | |
92 | void SettingsPage::initAutoWidgets() |
93 | { |
94 | _autoWidgets.clear(); |
95 | |
96 | // find all descendants that should be considered auto widgets |
97 | // we need to climb the QObject tree recursively |
98 | findAutoWidgets(this, &_autoWidgets); |
99 | |
100 | foreach(QObject *widget, _autoWidgets) { |
101 | if (widget->inherits("ColorButton" )) |
102 | connect(widget, SIGNAL(colorChanged(QColor)), SLOT(autoWidgetHasChanged())); |
103 | else if (widget->inherits("QAbstractButton" ) || widget->inherits("QGroupBox" )) |
104 | connect(widget, SIGNAL(toggled(bool)), SLOT(autoWidgetHasChanged())); |
105 | else if (widget->inherits("QLineEdit" ) || widget->inherits("QTextEdit" )) |
106 | connect(widget, SIGNAL(textChanged(const QString &)), SLOT(autoWidgetHasChanged())); |
107 | else if (widget->inherits("QComboBox" )) |
108 | connect(widget, SIGNAL(currentIndexChanged(int)), SLOT(autoWidgetHasChanged())); |
109 | else if (widget->inherits("QSpinBox" )) |
110 | connect(widget, SIGNAL(valueChanged(int)), SLOT(autoWidgetHasChanged())); |
111 | else if (widget->inherits("FontSelector" )) |
112 | connect(widget, SIGNAL(fontChanged(QFont)), SLOT(autoWidgetHasChanged())); |
113 | else |
114 | qWarning() << "SettingsPage::init(): Unknown autoWidget type" << widget->metaObject()->className(); |
115 | } |
116 | } |
117 | |
118 | |
119 | void SettingsPage::findAutoWidgets(QObject *parent, QObjectList *autoList) const |
120 | { |
121 | foreach(QObject *child, parent->children()) { |
122 | if (child->property("settingsKey" ).isValid()) |
123 | autoList->append(child); |
124 | findAutoWidgets(child, autoList); |
125 | } |
126 | } |
127 | |
128 | |
129 | QByteArray SettingsPage::autoWidgetPropertyName(QObject *widget) const |
130 | { |
131 | QByteArray prop; |
132 | if (widget->inherits("ColorButton" )) |
133 | prop = "color" ; |
134 | else if (widget->inherits("QAbstractButton" ) || widget->inherits("QGroupBox" )) |
135 | prop = "checked" ; |
136 | else if (widget->inherits("QLineEdit" ) || widget->inherits("QTextEdit" )) |
137 | prop = "text" ; |
138 | else if (widget->inherits("QComboBox" )) |
139 | prop = "currentIndex" ; |
140 | else if (widget->inherits("QSpinBox" )) |
141 | prop = "value" ; |
142 | else if (widget->inherits("FontSelector" )) |
143 | prop = "selectedFont" ; |
144 | else |
145 | qWarning() << "SettingsPage::autoWidgetPropertyName(): Unhandled widget type for" << widget; |
146 | |
147 | return prop; |
148 | } |
149 | |
150 | |
151 | QString SettingsPage::autoWidgetSettingsKey(QObject *widget) const |
152 | { |
153 | QString key = widget->property("settingsKey" ).toString(); |
154 | if (key.isEmpty()) |
155 | return QString("" ); |
156 | if (key.startsWith('/')) |
157 | key.remove(0, 1); |
158 | else |
159 | key.prepend(settingsKey() + '/'); |
160 | return key; |
161 | } |
162 | |
163 | |
164 | void SettingsPage::autoWidgetHasChanged() |
165 | { |
166 | bool changed_ = false; |
167 | foreach(QObject *widget, _autoWidgets) { |
168 | QVariant curValue = widget->property(autoWidgetPropertyName(widget)); |
169 | if (!curValue.isValid()) |
170 | qWarning() << "SettingsPage::autoWidgetHasChanged(): Unknown property" ; |
171 | |
172 | if (curValue != widget->property("storedValue" )) { |
173 | changed_ = true; |
174 | break; |
175 | } |
176 | } |
177 | |
178 | if (changed_ != _autoWidgetsChanged) { |
179 | bool old = hasChanged(); |
180 | _autoWidgetsChanged = changed_; |
181 | if (hasChanged() != old) |
182 | emit changed(hasChanged()); |
183 | } |
184 | } |
185 | |
186 | |
187 | void SettingsPage::load() |
188 | { |
189 | UiSettings s("" ); |
190 | foreach(QObject *widget, _autoWidgets) { |
191 | QString key = autoWidgetSettingsKey(widget); |
192 | QVariant val; |
193 | if (key.isEmpty()) |
194 | val = loadAutoWidgetValue(widget->objectName()); |
195 | else |
196 | val = s.value(key, QVariant()); |
197 | if (!val.isValid()) |
198 | val = widget->property("defaultValue" ); |
199 | widget->setProperty(autoWidgetPropertyName(widget), val); |
200 | widget->setProperty("storedValue" , val); |
201 | } |
202 | bool old = hasChanged(); |
203 | _autoWidgetsChanged = _changed = false; |
204 | if (hasChanged() != old) |
205 | emit changed(hasChanged()); |
206 | } |
207 | |
208 | |
209 | void SettingsPage::save() |
210 | { |
211 | UiSettings s("" ); |
212 | foreach(QObject *widget, _autoWidgets) { |
213 | QString key = autoWidgetSettingsKey(widget); |
214 | QVariant val = widget->property(autoWidgetPropertyName(widget)); |
215 | widget->setProperty("storedValue" , val); |
216 | if (key.isEmpty()) |
217 | saveAutoWidgetValue(widget->objectName(), val); |
218 | else |
219 | s.setValue(key, val); |
220 | } |
221 | bool old = hasChanged(); |
222 | _autoWidgetsChanged = _changed = false; |
223 | if (hasChanged() != old) |
224 | emit changed(hasChanged()); |
225 | } |
226 | |
227 | |
228 | void SettingsPage::defaults() |
229 | { |
230 | foreach(QObject *widget, _autoWidgets) { |
231 | QVariant val = widget->property("defaultValue" ); |
232 | widget->setProperty(autoWidgetPropertyName(widget), val); |
233 | } |
234 | autoWidgetHasChanged(); |
235 | } |
236 | |
237 | |
238 | QVariant SettingsPage::loadAutoWidgetValue(const QString &widgetName) |
239 | { |
240 | qWarning() << "Could not load value for SettingsPage widget" << widgetName; |
241 | return QVariant(); |
242 | } |
243 | |
244 | |
245 | void SettingsPage::saveAutoWidgetValue(const QString &widgetName, const QVariant &) |
246 | { |
247 | qWarning() << "Could not save value for SettingsPage widget" << widgetName; |
248 | } |
249 | |