From 90beed8c7b356ef58431721ffe8eb4abff3da032 Mon Sep 17 00:00:00 2001 From: Mikaƫl Capelle Date: Wed, 11 Nov 2020 22:45:33 +0100 Subject: Handle proxy dependencies differently. --- src/plugincontainer.cpp | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) (limited to 'src/plugincontainer.cpp') diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index bcd0db44..05c6790d 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -58,14 +58,11 @@ PluginRequirements::PluginRequirements(PluginContainer* pluginContainer, MOBase: , m_Plugin(plugin) , m_PluginProxy(pluginProxy) , m_Organizer(proxy) -{ - for (auto* requirement : plugin->requirements()) { - m_Requirements.emplace_back(requirement); - } +{ } - // TODO: - if (pluginProxy) { - m_Requirements.emplace_back(PluginRequirementFactory::pluginDependency(pluginProxy->name())); +void PluginRequirements::fetchRequirements() { + for (auto* requirement : m_Plugin->requirements()) { + m_Requirements.emplace_back(requirement); } } @@ -74,6 +71,20 @@ IPluginProxy* PluginRequirements::proxy() const return m_PluginProxy; } +std::vector PluginRequirements::proxied() const +{ + std::vector children; + if (dynamic_cast(m_Plugin)) { + for (auto* obj : m_PluginContainer->plugins()) { + auto* plugin = qobject_cast(obj); + if (plugin && m_PluginContainer->requirements(plugin).proxy() == m_Plugin) { + children.push_back(plugin); + } + } + } + return children; +} + IPlugin* PluginRequirements::master() const { if (m_Plugin->master().isEmpty()) { @@ -322,12 +333,15 @@ bool PluginContainer::initPlugin(IPlugin *plugin, IPluginProxy *pluginProxy) return true; } + auto [it, bl] = m_Requirements.emplace(plugin, PluginRequirements(this, plugin, proxy, pluginProxy)); + if (!plugin->init(proxy)) { log::warn("plugin failed to initialize"); return false; } - m_Requirements.emplace(plugin, PluginRequirements(this, plugin, proxy, pluginProxy)); + // Update requirements: + it->second.fetchRequirements(); return true; } @@ -519,11 +533,8 @@ bool PluginContainer::isEnabled(IPlugin* plugin) const return false; } - // Check the requirements (if a plugin checks in init(), the requirements have - // not been computed yet): - auto it = m_Requirements.find(plugin); - - return it == std::end(m_Requirements) ? true : it->second.canEnable(); + // Check the requirements: + return m_Requirements.at(plugin).canEnable(); } void PluginContainer::setEnabled(MOBase::IPlugin* plugin, bool enable, bool dependencies) -- cgit v1.3.1