From 74ec078976fbd64433142e6974f30cc113047c00 Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Tue, 10 Nov 2020 21:38:58 +0100 Subject: Replace usage of IPlugin::isActive(). --- src/organizerproxy.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/organizerproxy.cpp') diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp index a988ba9f..77b7c2d6 100644 --- a/src/organizerproxy.cpp +++ b/src/organizerproxy.cpp @@ -83,6 +83,16 @@ void OrganizerProxy::modDataChanged(IModInterface *mod) m_Proxied->modDataChanged(mod); } +bool OrganizerProxy::isPluginEnabled(QString const& pluginName) const +{ + return m_PluginContainer->isEnabled(pluginName); +} + +bool OrganizerProxy::isPluginEnabled(IPlugin* plugin) const +{ + return m_PluginContainer->isEnabled(plugin); +} + QVariant OrganizerProxy::pluginSetting(const QString &pluginName, const QString &key) const { return m_Proxied->pluginSetting(pluginName, key); -- cgit v1.3.1 From a4acfc1f992eb5135c9ae6542ae5ffa8b09a2c2d Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Thu, 12 Nov 2020 21:49:57 +0100 Subject: Add callbacks for plugin enabled/disabled. --- src/organizercore.cpp | 15 +++++++++++++++ src/organizercore.h | 5 +++++ src/organizerproxy.cpp | 30 +++++++++++++++++++++++++++++- src/organizerproxy.h | 4 ++++ src/plugincontainer.cpp | 7 +++++++ src/plugincontainer.h | 6 ++++++ 6 files changed, 66 insertions(+), 1 deletion(-) (limited to 'src/organizerproxy.cpp') diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 86afe59a..e004ba78 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -295,6 +295,11 @@ void OrganizerCore::connectPlugins(PluginContainer *container) m_GamePlugin = m_PluginContainer->managedGame(m_GameName); emit managedGameChanged(m_GamePlugin); } + + connect(m_PluginContainer, &PluginContainer::pluginEnabled, + [&](IPlugin* plugin) { m_PluginEnabled(plugin); }); + connect(m_PluginContainer, &PluginContainer::pluginDisabled, + [&](IPlugin* plugin) { m_PluginDisabled(plugin); }); } void OrganizerCore::disconnectPlugins() @@ -1225,6 +1230,16 @@ bool OrganizerCore::onPluginSettingChanged(std::function const& func) +{ + return m_PluginEnabled.connect(func).connected(); +} + +bool OrganizerCore::onPluginDisabled(std::function const& func) +{ + return m_PluginDisabled.connect(func).connected(); +} + void OrganizerCore::refresh(bool saveChanges) { // don't lose changes! diff --git a/src/organizercore.h b/src/organizercore.h index b566e626..23b624e8 100644 --- a/src/organizercore.h +++ b/src/organizercore.h @@ -87,6 +87,7 @@ private: using SignalProfileRemoved = boost::signals2::signal; using SignalProfileChanged = boost::signals2::signal; using SignalPluginSettingChanged = boost::signals2::signal; + using SignalPluginEnabled = boost::signals2::signal; public: @@ -335,6 +336,8 @@ public: bool onProfileRemoved(std::function const& func); bool onProfileChanged(std::function const& func); bool onPluginSettingChanged(std::function const& func); + bool onPluginEnabled(std::function const& func); + bool onPluginDisabled(std::function const& func); bool getArchiveParsing() const { @@ -457,6 +460,8 @@ private: SignalProfileRemoved m_ProfileRemoved; SignalProfileChanged m_ProfileChanged; SignalPluginSettingChanged m_PluginSettingChanged; + SignalPluginEnabled m_PluginEnabled; + SignalPluginEnabled m_PluginDisabled; ModList m_ModList; PluginList m_PluginList; diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp index 77b7c2d6..c2283acc 100644 --- a/src/organizerproxy.cpp +++ b/src/organizerproxy.cpp @@ -293,8 +293,36 @@ bool OrganizerProxy::onProfileChanged(std::functiononProfileChanged(MOShared::callIfPluginActive(this, func)); } +// Always call these one, otherwise plugin cannot detect they are being enabled / disabled: bool OrganizerProxy::onPluginSettingChanged(std::function const& func) { - // Always call this one, otherwise plugin cannot detect they are being enabled / disabled: return m_Proxied->onPluginSettingChanged(func); } + +bool OrganizerProxy::onPluginEnabled(std::function const& func) +{ + return m_Proxied->onPluginEnabled(func); +} + +bool OrganizerProxy::onPluginEnabled(const QString& pluginName, std::function const& func) +{ + return m_Proxied->onPluginEnabled([=](const IPlugin* plugin) { + if (plugin->name().compare(pluginName, Qt::CaseInsensitive) == 0) { + func(); + } + }); +} + +bool OrganizerProxy::onPluginDisabled(std::function const& func) +{ + return m_Proxied->onPluginDisabled(func); +} + +bool OrganizerProxy::onPluginDisabled(const QString& pluginName, std::function const& func) +{ + return m_Proxied->onPluginDisabled([=](const IPlugin* plugin) { + if (plugin->name().compare(pluginName, Qt::CaseInsensitive) == 0) { + func(); + } + }); +} diff --git a/src/organizerproxy.h b/src/organizerproxy.h index 4329bdda..8664c64f 100644 --- a/src/organizerproxy.h +++ b/src/organizerproxy.h @@ -69,6 +69,10 @@ public: virtual QVariant pluginSetting(const QString& pluginName, const QString& key) const override; virtual void setPluginSetting(const QString& pluginName, const QString& key, const QVariant& value) override; virtual bool onPluginSettingChanged(std::function const& func) override; + virtual bool onPluginEnabled(std::function const& func) override; + virtual bool onPluginEnabled(const QString& pluginName, std::function const& func) override; + virtual bool onPluginDisabled(std::function const& func) override; + virtual bool onPluginDisabled(const QString& pluginName, std::function const& func) override; virtual MOBase::IPluginGame const *managedGame() const; diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index d2f42fb4..1c2a1a1a 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -624,6 +624,13 @@ void PluginContainer::setEnabled(MOBase::IPlugin* plugin, bool enable, bool depe } m_Organizer->setPersistent(plugin->name(), "enabled", enable, true); + + if (enable) { + emit pluginEnabled(plugin); + } + else { + emit pluginDisabled(plugin); + } } MOBase::IPlugin* PluginContainer::plugin(QString const& pluginName) const diff --git a/src/plugincontainer.h b/src/plugincontainer.h index ac40e413..54da37d0 100644 --- a/src/plugincontainer.h +++ b/src/plugincontainer.h @@ -325,6 +325,12 @@ public: // IPluginDiagnose interface signals: + /** + * @brief Emitted plugins are enabled or disabled. + */ + void pluginEnabled(MOBase::IPlugin*); + void pluginDisabled(MOBase::IPlugin*); + void diagnosisUpdate(); private: -- cgit v1.3.1 From a0229380ce08715198a1181b61c2f357ad641ca8 Mon Sep 17 00:00:00 2001 From: Al <26797547+Al12rs@users.noreply.github.com> Date: Thu, 26 Nov 2020 15:33:49 +0100 Subject: Refresh after waiting for application (vfs) --- src/organizerproxy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/organizerproxy.cpp') diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp index c2283acc..06e932cb 100644 --- a/src/organizerproxy.cpp +++ b/src/organizerproxy.cpp @@ -155,7 +155,7 @@ bool OrganizerProxy::waitForApplication(HANDLE handle, LPDWORD exitCode) const auto runner = m_Proxied->processRunner(); const auto r = runner - .setWaitForCompletion(ProcessRunner::ForceWait, UILocker::OutputRequired) + .setWaitForCompletion(ProcessRunner::ForceWait | ProcessRunner::Refresh, UILocker::OutputRequired) .attachToProcess(handle); if (exitCode) { -- cgit v1.3.1 From 3db08caaf2a5a52310f3e7decb4d603929c36e9c Mon Sep 17 00:00:00 2001 From: AL <26797547+Al12rs@users.noreply.github.com> Date: Sat, 28 Nov 2020 17:28:49 +0100 Subject: Allow optional refresh for waitForApplication() --- src/organizerproxy.cpp | 10 ++++++++-- src/organizerproxy.h | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) (limited to 'src/organizerproxy.cpp') diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp index 06e932cb..92f250ea 100644 --- a/src/organizerproxy.cpp +++ b/src/organizerproxy.cpp @@ -144,7 +144,7 @@ HANDLE OrganizerProxy::startApplication( return runner.stealProcessHandle().release(); } -bool OrganizerProxy::waitForApplication(HANDLE handle, LPDWORD exitCode) const +bool OrganizerProxy::waitForApplication(HANDLE handle, bool refresh, LPDWORD exitCode) const { const auto pid = ::GetProcessId(handle); @@ -154,8 +154,14 @@ bool OrganizerProxy::waitForApplication(HANDLE handle, LPDWORD exitCode) const auto runner = m_Proxied->processRunner(); + ProcessRunner::WaitFlags waitFlags = ProcessRunner::ForceWait; + + if (refresh) { + waitFlags |= ProcessRunner::Refresh; + } + const auto r = runner - .setWaitForCompletion(ProcessRunner::ForceWait | ProcessRunner::Refresh, UILocker::OutputRequired) + .setWaitForCompletion(waitFlags, UILocker::OutputRequired) .attachToProcess(handle); if (exitCode) { diff --git a/src/organizerproxy.h b/src/organizerproxy.h index 8664c64f..3097adf0 100644 --- a/src/organizerproxy.h +++ b/src/organizerproxy.h @@ -52,7 +52,7 @@ public: virtual MOBase::IProfile *profile() const override; virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", const QString &profile = "", const QString &forcedCustomOverwrite = "", bool ignoreCustomOverwrite = false); - virtual bool waitForApplication(HANDLE handle, LPDWORD exitCode = nullptr) const; + virtual bool waitForApplication(HANDLE handle, bool refresh = true, LPDWORD exitCode = nullptr) const; virtual void refresh(bool saveChanges); virtual bool onAboutToRun(const std::function &func) override; -- cgit v1.3.1