summaryrefslogtreecommitdiffstats
path: root/libsettings/src
diff options
context:
space:
mode:
Diffstat (limited to 'libsettings/src')
-rw-r--r--libsettings/src/basicsettingsobject.cpp43
-rw-r--r--libsettings/src/setting.cpp (renamed from libsettings/src/appsettings.cpp)26
-rw-r--r--libsettings/src/settingsobject.cpp124
3 files changed, 181 insertions, 12 deletions
diff --git a/libsettings/src/basicsettingsobject.cpp b/libsettings/src/basicsettingsobject.cpp
new file mode 100644
index 00000000..66a2c2c8
--- /dev/null
+++ b/libsettings/src/basicsettingsobject.cpp
@@ -0,0 +1,43 @@
+/* Copyright 2013 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "include/basicsettingsobject.h"
+#include "include/setting.h"
+
+BasicSettingsObject::BasicSettingsObject(QObject *parent) :
+ SettingsObject(parent)
+{
+
+}
+
+void BasicSettingsObject::changeSetting(const Setting &setting, QVariant value)
+{
+ if (contains(setting.id()))
+ {
+ config.setValue(setting.configKey(), value);
+ }
+}
+
+QVariant BasicSettingsObject::retrieveValue(const Setting &setting)
+{
+ if (contains(setting.id()))
+ {
+ return config.value(setting.configKey());
+ }
+ else
+ {
+ return QVariant();
+ }
+}
diff --git a/libsettings/src/appsettings.cpp b/libsettings/src/setting.cpp
index 8fe9b8ad..a224ad39 100644
--- a/libsettings/src/appsettings.cpp
+++ b/libsettings/src/setting.cpp
@@ -13,28 +13,30 @@
* limitations under the License.
*/
-#include "include/appsettings.h"
+#include "include/setting.h"
+#include "include/settingsobject.h"
-AppSettings* settings;
-
-SettingsBase::SettingsBase(QObject *parent) :
- QObject(parent)
+Setting::Setting(QString id, QVariant defVal, QObject *parent) :
+ QObject(parent), m_id(id), m_defVal(defVal)
{
}
-AppSettings::AppSettings(QObject *parent) :
- SettingsBase(parent)
+QVariant Setting::get() const
{
-
+ SettingsObject *sbase = qobject_cast<SettingsObject *>(parent());
+ if (!sbase)
+ return defValue();
+ else
+ return sbase->retrieveValue(*this);
}
-QVariant AppSettings::getValue(const QString& name, QVariant defVal) const
+QVariant Setting::defValue() const
{
- return config.value(name, defVal);
+ return m_defVal;
}
-void AppSettings::setValue(const QString& name, QVariant val)
+void Setting::set(QVariant value)
{
- config.setValue(name, val);
+ emit settingChanged(*this, value);
}
diff --git a/libsettings/src/settingsobject.cpp b/libsettings/src/settingsobject.cpp
new file mode 100644
index 00000000..27fbb40a
--- /dev/null
+++ b/libsettings/src/settingsobject.cpp
@@ -0,0 +1,124 @@
+/* Copyright 2013 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "include/settingsobject.h"
+#include "include/setting.h"
+
+#include <QVariant>
+
+SettingsObject::SettingsObject(QObject *parent) :
+ QObject(parent)
+{
+
+}
+
+bool SettingsObject::registerSetting(Setting *setting)
+{
+ // Check if setting is null or we already have a setting with the same ID.
+ if (!setting)
+ {
+ qDebug(QString("Failed to register setting. Setting is null.").
+ arg(setting->id()).toUtf8());
+ return false; // Fail
+ }
+
+ if (contains(setting->id()))
+ {
+ qDebug(QString("Failed to register setting %1. ID already exists.").
+ arg(setting->id()).toUtf8());
+ return false; // Fail
+ }
+
+ m_settings.insert(setting->id(), setting);
+ setting->setParent(this); // Take ownership.
+
+ // Connect signals.
+ connectSignals(*setting);
+
+ qDebug(QString("Registered setting %1.").arg(setting->id()).toUtf8());
+ return true;
+}
+
+void SettingsObject::unregisterSetting(Setting *setting)
+{
+ if (!setting || !m_settings.contains(setting->id()))
+ return; // We can't unregister something that's not registered.
+
+ m_settings.remove(setting->id());
+
+ // Disconnect signals.
+ disconnectSignals(*setting);
+
+ setting->setParent(NULL); // Drop ownership.
+}
+
+
+Setting *SettingsObject::getSetting(const QString &id) const
+{
+ // Make sure there is a setting with the given ID.
+ if (!m_settings.contains(id))
+ return NULL;
+
+ return m_settings[id];
+}
+
+QVariant SettingsObject::get(const QString &id) const
+{
+ Setting *setting = getSetting(id);
+ return (setting ? setting->get() : QVariant());
+}
+
+bool SettingsObject::set(const QString &id, QVariant value)
+{
+ Setting *setting = getSetting(id);
+ if (!setting)
+ {
+ qDebug(QString("Error changing setting %1. Setting doesn't exist.").
+ arg(id).toUtf8());
+ return false;
+ }
+ else
+ {
+ setting->set(value);
+ return true;
+ }
+}
+
+QList<Setting *> SettingsObject::getSettings()
+{
+ return m_settings.values();
+}
+
+bool SettingsObject::contains(const QString &id)
+{
+ return m_settings.contains(id);
+}
+
+
+void SettingsObject::connectSignals(const Setting &setting)
+{
+ connect(&setting, SIGNAL(settingChanged(const Setting &, QVariant)),
+ SLOT(changeSetting(const Setting &, QVariant)));
+ connect(&setting, SIGNAL(settingChanged(const Setting &, QVariant)),
+ SIGNAL(settingChanged(const Setting &, QVariant)));
+}
+
+void SettingsObject::disconnectSignals(const Setting &setting)
+{
+ setting.disconnect(SIGNAL(settingChanged(const Setting &, QVariant)),
+ this, SLOT(changeSetting(const Setting &, QVariant)));
+ setting.disconnect(SIGNAL(settingChanged(const Setting &, QVariant)),
+ this, SIGNAL(settingChanged(const Setting &, QVariant)));
+}