From c0ace25a871c4d938fb4be10b0357e263db677cb Mon Sep 17 00:00:00 2001 From: Mikaƫl Capelle Date: Wed, 11 Nov 2020 21:01:17 +0100 Subject: Use IPlugin::master() when present. --- src/plugincontainer.cpp | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'src/plugincontainer.cpp') diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index 85068d2d..ab68cc1d 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -69,11 +69,31 @@ PluginRequirements::PluginRequirements(PluginContainer* pluginContainer, MOBase: } } -MOBase::IPluginProxy* PluginRequirements::proxy() const +IPluginProxy* PluginRequirements::proxy() const { return m_PluginProxy; } +IPlugin* PluginRequirements::master() const +{ + if (m_Plugin->master().isEmpty()) { + return nullptr; + } + return m_PluginContainer->plugin(m_Plugin->master()); +} + +std::vector PluginRequirements::children() const +{ + std::vector children; + for (auto* obj : m_PluginContainer->plugins()) { + auto* plugin = qobject_cast(obj); + if (plugin && plugin->master().compare(m_Plugin->name(), Qt::CaseInsensitive) == 0) { + children.push_back(plugin); + } + } + return children; +} + std::vector PluginRequirements::problems() const { std::vector result; @@ -90,6 +110,11 @@ bool PluginRequirements::canEnable() const return problems().empty(); } +bool PluginRequirements::hasRequirements() const +{ + return !m_Requirements.empty(); +} + QStringList PluginRequirements::requiredGames() const { // We look for a "GameDependencyRequirement" - There can be only one since otherwise @@ -304,6 +329,11 @@ bool PluginContainer::initPlugin(IPlugin *plugin, IPluginProxy *pluginProxy) m_Requirements.emplace(plugin, PluginRequirements(this, plugin, proxy, pluginProxy)); + if (!plugin->master().isEmpty() && m_Requirements.at(plugin).hasRequirements()) { + log::warn("a plugin cannot have requirements if it has a master"); + return false; + } + return true; } @@ -503,11 +533,19 @@ bool PluginContainer::isEnabled(IPlugin* plugin) const void PluginContainer::setEnabled(MOBase::IPlugin* plugin, bool enable, bool dependencies) { + // If required, disable dependencies: if (!enable && dependencies) { for (auto* p : requirements(plugin).requiredFor()) { setEnabled(p, false, false); // No need to "recurse" here since requiredFor already does it. } } + + // Always disable/enable child plugins: + for (auto* p : requirements(plugin).children()) { + // "Child" plugin should have no dependencies. + setEnabled(p, enable, false); + } + m_Organizer->setPersistent(plugin->name(), "enabled", enable, true); } -- cgit v1.3.1