summaryrefslogtreecommitdiff
path: root/src/plugincontainer.cpp
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2020-11-11 22:45:33 +0100
committerMikaël Capelle <capelle.mikael@gmail.com>2020-11-11 22:45:33 +0100
commit90beed8c7b356ef58431721ffe8eb4abff3da032 (patch)
treedae08a323a54f9a53d05e6d3d50cbe40fd094da1 /src/plugincontainer.cpp
parent7ec0128eb59c085cd5961995280238cc22683b8e (diff)
Handle proxy dependencies differently.
Diffstat (limited to 'src/plugincontainer.cpp')
-rw-r--r--src/plugincontainer.cpp37
1 files changed, 24 insertions, 13 deletions
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<IPlugin*> PluginRequirements::proxied() const
+{
+ std::vector<IPlugin*> children;
+ if (dynamic_cast<IPluginProxy*>(m_Plugin)) {
+ for (auto* obj : m_PluginContainer->plugins<QObject>()) {
+ auto* plugin = qobject_cast<IPlugin*>(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)