Initialize _autoWidgetsChanged *cough*
[quassel.git] / src / uisupport / settingspage.cpp
index 9ee7f00..b91fc64 100644 (file)
 #include <QSpinBox>
 #include <QVariant>
 
+#include <QDebug>
+
+#include "uisettings.h"
+
 SettingsPage::SettingsPage(const QString &category, const QString &title, QWidget *parent)
   : QWidget(parent),
     _category(category),
     _title(title),
-    _changed(false)
+    _changed(false),
+    _autoWidgetsChanged(false)
 {
 }
 
-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 +74,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();
+}