summaryrefslogtreecommitdiffstats
path: root/logic/settings
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2015-05-04 01:20:48 +0200
committerPetr Mrázek <peterix@gmail.com>2015-05-04 01:20:48 +0200
commit1b884d0a9dc28d8bca38fe8756482d991d0ea850 (patch)
treefabe4350a3d64123ad0801fe7c285c2150f9562b /logic/settings
parent8e9d5f56b592fd0dd0f54e747a835391a775120d (diff)
downloadMultiMC-1b884d0a9dc28d8bca38fe8756482d991d0ea850.tar
MultiMC-1b884d0a9dc28d8bca38fe8756482d991d0ea850.tar.gz
MultiMC-1b884d0a9dc28d8bca38fe8756482d991d0ea850.tar.lz
MultiMC-1b884d0a9dc28d8bca38fe8756482d991d0ea850.tar.xz
MultiMC-1b884d0a9dc28d8bca38fe8756482d991d0ea850.zip
GH-907 improve Java testing and PermGen deprecation handling
Diffstat (limited to 'logic/settings')
-rw-r--r--logic/settings/PassthroughSetting.cpp66
-rw-r--r--logic/settings/PassthroughSetting.h45
-rw-r--r--logic/settings/SettingsObject.cpp17
-rw-r--r--logic/settings/SettingsObject.h10
4 files changed, 138 insertions, 0 deletions
diff --git a/logic/settings/PassthroughSetting.cpp b/logic/settings/PassthroughSetting.cpp
new file mode 100644
index 00000000..45a560de
--- /dev/null
+++ b/logic/settings/PassthroughSetting.cpp
@@ -0,0 +1,66 @@
+/* Copyright 2013-2015 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 "PassthroughSetting.h"
+
+PassthroughSetting::PassthroughSetting(std::shared_ptr<Setting> other, std::shared_ptr<Setting> gate)
+ : Setting(other->configKeys(), QVariant())
+{
+ Q_ASSERT(other);
+ Q_ASSERT(gate);
+ m_other = other;
+ m_gate = gate;
+}
+
+bool PassthroughSetting::isOverriding() const
+{
+ return m_gate->get().toBool();
+}
+
+QVariant PassthroughSetting::defValue() const
+{
+ if(isOverriding())
+ {
+ return m_other->get();
+ }
+ return m_other->defValue();
+}
+
+QVariant PassthroughSetting::get() const
+{
+ if(isOverriding())
+ {
+ return Setting::get();
+ }
+ return m_other->get();
+}
+
+void PassthroughSetting::reset()
+{
+ if(isOverriding())
+ {
+ Setting::reset();
+ }
+ m_other->reset();
+}
+
+void PassthroughSetting::set(QVariant value)
+{
+ if(isOverriding())
+ {
+ Setting::set(value);
+ }
+ m_other->set(value);
+}
diff --git a/logic/settings/PassthroughSetting.h b/logic/settings/PassthroughSetting.h
new file mode 100644
index 00000000..c4dc646c
--- /dev/null
+++ b/logic/settings/PassthroughSetting.h
@@ -0,0 +1,45 @@
+/* Copyright 2013-2015 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.
+ */
+
+#pragma once
+
+#include <QObject>
+#include <memory>
+
+#include "Setting.h"
+
+/*!
+ * \brief A setting that 'overrides another.' based on the value of a 'gate' setting
+ * If 'gate' evaluates to true, the override stores and returns data
+ * If 'gate' evaluates to false, the original does,
+ */
+class PassthroughSetting : public Setting
+{
+ Q_OBJECT
+public:
+ explicit PassthroughSetting(std::shared_ptr<Setting> overriden, std::shared_ptr<Setting> gate);
+
+ virtual QVariant defValue() const;
+ virtual QVariant get() const;
+ virtual void set (QVariant value);
+ virtual void reset();
+
+private:
+ bool isOverriding() const;
+
+protected:
+ std::shared_ptr<Setting> m_other;
+ std::shared_ptr<Setting> m_gate;
+};
diff --git a/logic/settings/SettingsObject.cpp b/logic/settings/SettingsObject.cpp
index e88eae49..5e682cbf 100644
--- a/logic/settings/SettingsObject.cpp
+++ b/logic/settings/SettingsObject.cpp
@@ -16,6 +16,7 @@
#include "settings/SettingsObject.h"
#include "settings/Setting.h"
#include "settings/OverrideSetting.h"
+#include "PassthroughSetting.h"
#include <QDebug>
#include <QVariant>
@@ -44,6 +45,22 @@ std::shared_ptr<Setting> SettingsObject::registerOverride(std::shared_ptr<Settin
return override;
}
+std::shared_ptr<Setting> SettingsObject::registerPassthrough(std::shared_ptr<Setting> original,
+ std::shared_ptr<Setting> gate)
+{
+ if (contains(original->id()))
+ {
+ qCritical() << QString("Failed to register setting %1. ID already exists.")
+ .arg(original->id());
+ return nullptr; // Fail
+ }
+ auto passthrough = std::make_shared<PassthroughSetting>(original, gate);
+ passthrough->m_storage = this;
+ connectSignals(*passthrough);
+ m_settings.insert(passthrough->id(), passthrough);
+ return passthrough;
+}
+
std::shared_ptr<Setting> SettingsObject::registerSetting(QStringList synonyms, QVariant defVal)
{
if (synonyms.empty())
diff --git a/logic/settings/SettingsObject.h b/logic/settings/SettingsObject.h
index ac8419e8..99782a01 100644
--- a/logic/settings/SettingsObject.h
+++ b/logic/settings/SettingsObject.h
@@ -51,6 +51,16 @@ public:
std::shared_ptr<Setting> registerOverride(std::shared_ptr<Setting> original);
/*!
+ * Registers a passthorugh setting for the given original setting in this settings object
+ * gate decides if the passthrough (true) or the original (false) is used for value
+ *
+ * This will fail if there is already a setting with the same ID as
+ * the one that is being registered.
+ * \return A valid Setting shared pointer if successful.
+ */
+ std::shared_ptr<Setting> registerPassthrough(std::shared_ptr<Setting> original, std::shared_ptr<Setting> gate);
+
+ /*!
* Registers the given setting with this SettingsObject and connects the necessary signals.
*
* This will fail if there is already a setting with the same ID as