X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fsettingspage.cpp;h=cee72a202a837d3831feec08a30b7ed29155b5a1;hp=9ee7f00f6c9769f88f0689bf4158bcd88bb368f9;hb=61e73ddfdd22418890102c44166483ddb28e1c93;hpb=26bdd4f29a13a635cfb73000e38a17f01c5982ce diff --git a/src/uisupport/settingspage.cpp b/src/uisupport/settingspage.cpp index 9ee7f00f..cee72a20 100644 --- a/src/uisupport/settingspage.cpp +++ b/src/uisupport/settingspage.cpp @@ -25,6 +25,10 @@ #include #include +#include + +#include "uisettings.h" + SettingsPage::SettingsPage(const QString &category, const QString &title, QWidget *parent) : QWidget(parent), _category(category), @@ -33,10 +37,12 @@ SettingsPage::SettingsPage(const QString &category, const QString &title, QWidge { } -void SettingsPage::setChangedState(bool hasChanged) { - if(hasChanged != _changed) { - _changed = hasChanged; - emit changed(hasChanged); +void SettingsPage::setChangedState(bool hasChanged_) { + if(hasChanged_ != _changed) { + bool old = hasChanged(); + _changed = hasChanged_; + if(hasChanged() != old) + emit changed(hasChanged()); } } @@ -67,3 +73,117 @@ void SettingsPage::load(QSpinBox *box, int value) { bool SettingsPage::hasChanged(QSpinBox *box) { return box->property("StoredValue").toInt() == box->value(); } + +/*** Auto child widget handling ***/ + +void SettingsPage::initAutoWidgets() { + _autoWidgets.clear(); + + if(settingsKey().isNull()) + return; + + // find all descendants that should be considered auto widgets + // we need to climb the QObject tree recursively + findAutoWidgets(this, &_autoWidgets); + + foreach(QObject *widget, _autoWidgets) { + if(widget->inherits("QAbstractButton")) + connect(widget, SIGNAL(toggled(bool)), SLOT(autoWidgetHasChanged())); + else if(widget->inherits("QLineEdit") || widget->inherits("QTextEdit")) + connect(widget, SIGNAL(textChanged(const QString &)), SLOT(autoWidgetHasChanged())); + else if(widget->inherits("QComboBox")) + connect(widget, SIGNAL(currentIndexChanged(int)), SLOT(autoWidgetHasChanged())); + else if(widget->inherits("QSpinBox")) + connect(widget, SIGNAL(valueChanged(int)), SLOT(autoWidgetHasChanged())); + else + qWarning() << "SettingsPage::init(): Unknown autoWidget type" << widget->metaObject()->className(); + } +} + +void SettingsPage::findAutoWidgets(QObject *parent, QObjectList *autoList) const { + foreach(QObject *child, parent->children()) { + if(!child->property("settingsKey").toString().isEmpty()) + autoList->append(child); + findAutoWidgets(child, autoList); + } +} + +QByteArray SettingsPage::autoWidgetPropertyName(QObject *widget) const { + QByteArray prop; + if(widget->inherits("QAbstractButton")) + prop = "checked"; + else if(widget->inherits("QLineEdit") || widget->inherits("QTextEdit")) + prop = "text"; + else if(widget->inherits("QComboBox")) + prop = "currentIndex"; + else if(widget->inherits("QSpinBox")) + prop = "value"; + else + qWarning() << "SettingsPage::autoWidgetPropertyName(): Unhandled widget type for" << widget; + + return prop; +} + +QString SettingsPage::autoWidgetSettingsKey(QObject *widget) const { + QString key = widget->property("settingsKey").toString(); + if(key.startsWith('/')) + key.remove(0, 1); + else + key.prepend(settingsKey() + '/'); + return key; +} + +void SettingsPage::autoWidgetHasChanged() { + bool changed_ = false; + foreach(QObject *widget, _autoWidgets) { + QVariant curValue = widget->property(autoWidgetPropertyName(widget)); + if(!curValue.isValid()) + qWarning() << "SettingsPage::autoWidgetHasChanged(): Unknown property"; + + if(curValue != widget->property("storedValue")) { + changed_ = true; + break; + } + } + + if(changed_ != _autoWidgetsChanged) { + bool old = hasChanged(); + _autoWidgetsChanged = changed_; + if(hasChanged() != old) + emit changed(hasChanged()); + } +} + +void SettingsPage::load() { + UiSettings s(""); + foreach(QObject *widget, _autoWidgets) { + QVariant val = s.value(autoWidgetSettingsKey(widget), widget->property("defaultValue")); + widget->setProperty(autoWidgetPropertyName(widget), val); + widget->setProperty("storedValue", val); + } + bool old = hasChanged(); + _autoWidgetsChanged = _changed = false; + if(hasChanged() != old) + emit changed(hasChanged()); +} + +void SettingsPage::save() { + UiSettings s(""); + foreach(QObject *widget, _autoWidgets) { + QVariant val = widget->property(autoWidgetPropertyName(widget)); + widget->setProperty("storedValue", val); + s.setValue(autoWidgetSettingsKey(widget), val); + } + bool old = hasChanged(); + _autoWidgetsChanged = _changed = false; + if(hasChanged() != old) + emit changed(hasChanged()); +} + +void SettingsPage::defaults() { + foreach(QObject *widget, _autoWidgets) { + QVariant val = widget->property("defaultValue"); + widget->setProperty(autoWidgetPropertyName(widget), val); + } + autoWidgetHasChanged(); +}