diff options
| -rw-r--r-- | src/organizerproxy.cpp | 11 | ||||
| -rw-r--r-- | src/settings.cpp | 30 | ||||
| -rw-r--r-- | src/settings.h | 11 |
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; |
