summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAl <26797547+Al12rs@users.noreply.github.com>2020-06-07 03:45:42 -0700
committerGitHub <noreply@github.com>2020-06-07 03:45:42 -0700
commit8b667fe69a268c7d183f60dd43ec95dbd976c47b (patch)
treed7c9a5675594ad32899332e101c43b5a717fd2c7 /src
parentbf055e804879c0a74750c7b60dbeababeafd3a23 (diff)
parent093fddda376f2b74e209cc0cedd90e7b04342374 (diff)
Merge pull request #1109 from Holt59/set-plugin-setting-signal
Add IOrganizer signal when a plugin setting is changed.
Diffstat (limited to 'src')
-rw-r--r--src/organizerproxy.cpp11
-rw-r--r--src/settings.cpp30
-rw-r--r--src/settings.h11
3 files changed, 50 insertions, 2 deletions
diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp
index e0c122a2..e67952d9 100644
--- a/src/organizerproxy.cpp
+++ b/src/organizerproxy.cpp
@@ -3,7 +3,9 @@
#include "shared/appconfig.h"
#include "organizercore.h"
#include "plugincontainer.h"
+#include "settings.h"
+#include <QObject>
#include <QApplication>
using namespace MOBase;
@@ -11,10 +13,17 @@ using namespace MOShared;
OrganizerProxy::OrganizerProxy(OrganizerCore *organizer, PluginContainer *pluginContainer, const QString &pluginName)
- : m_Proxied(organizer)
+ : IOrganizer(organizer)
+ , m_Proxied(organizer)
, m_PluginContainer(pluginContainer)
, m_PluginName(pluginName)
{
+
+ PluginSettings& pluginSettings = m_Proxied->settings().plugins();
+
+ connect(&pluginSettings, &PluginSettings::pluginSettingChanged, [this](auto const& ...args) {
+ emit pluginSettingChanged(args...);
+ });
}
IModRepositoryBridge *OrganizerProxy::createNexusBridge() const
diff --git a/src/settings.cpp b/src/settings.cpp
index 3bf8f2a2..55283486 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -1310,9 +1310,14 @@ void PluginSettings::setSetting(const QString &pluginName, const QString &key, c
.arg(pluginName));
}
+ QVariant oldValue = m_PluginSettings[pluginName][key];
+
// store the new setting both in memory and in the ini
m_PluginSettings[pluginName][key] = value;
set(m_Settings, "Plugins", pluginName + "/" + key, value);
+
+ // emit signal:
+ emit pluginSettingChanged(pluginName, key, oldValue, value);
}
QVariantMap PluginSettings::settings(const QString &pluginName) const
@@ -1322,7 +1327,32 @@ QVariantMap PluginSettings::settings(const QString &pluginName) const
void PluginSettings::setSettings(const QString &pluginName, const QVariantMap& map)
{
+ auto iterPlugin = m_PluginSettings.find(pluginName);
+
+ if (iterPlugin == m_PluginSettings.end()) {
+ throw MyException(
+ QObject::tr("attempt to store setting for unknown plugin \"%1\"")
+ .arg(pluginName));
+ }
+
+ QVariantMap oldSettings = m_PluginSettings[pluginName];
m_PluginSettings[pluginName] = map;
+
+ // Emit signals for settings that have been changed or added:
+ for (auto& k : map.keys()) {
+ // .value() return a default-constructed QVariant if k is not in oldSettings:
+ QVariant oldValue = oldSettings.value(k);
+ if (oldValue != map[k]) {
+ emit pluginSettingChanged(pluginName, k, oldSettings.value(k), map[k]);
+ }
+ }
+
+ // Emit signals for settings that have been removed:
+ for (auto& k : oldSettings.keys()) {
+ if (!map.contains(k)) {
+ emit pluginSettingChanged(pluginName, k, oldSettings[k], QVariant());
+ }
+ }
}
QVariantMap PluginSettings::descriptions(const QString &pluginName) const
diff --git a/src/settings.h b/src/settings.h
index b2cb6be5..9d788664 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -287,8 +287,10 @@ private:
// settings about plugins
//
-class PluginSettings
+class PluginSettings: public QObject
{
+ Q_OBJECT
+
public:
PluginSettings(QSettings& settings);
@@ -357,6 +359,13 @@ public:
//
void save();
+Q_SIGNALS:
+
+ /**
+ * Emitted when a plugin setting changes.
+ */
+ void pluginSettingChanged(QString const& pluginName, const QString& key, const QVariant& oldValue, const QVariant& newValue);
+
private:
QSettings& m_Settings;
std::vector<MOBase::IPlugin*> m_Plugins;