diff options
| author | Mikaël Capelle <capelle.mikael@gmail.com> | 2020-11-11 21:01:17 +0100 |
|---|---|---|
| committer | Mikaël Capelle <capelle.mikael@gmail.com> | 2020-11-11 21:01:17 +0100 |
| commit | c0ace25a871c4d938fb4be10b0357e263db677cb (patch) | |
| tree | 1a40ec1fda4edc9df8f98bfc67a3c049777011c4 /src/plugincontainer.cpp | |
| parent | d3bd237c226f44004a9917a29e1b98b2038ff271 (diff) | |
Use IPlugin::master() when present.
Diffstat (limited to 'src/plugincontainer.cpp')
| -rw-r--r-- | src/plugincontainer.cpp | 40 |
1 files changed, 39 insertions, 1 deletions
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<IPlugin*> PluginRequirements::children() const
+{
+ std::vector<IPlugin*> children;
+ for (auto* obj : m_PluginContainer->plugins<QObject>()) {
+ auto* plugin = qobject_cast<IPlugin*>(obj);
+ if (plugin && plugin->master().compare(m_Plugin->name(), Qt::CaseInsensitive) == 0) {
+ children.push_back(plugin);
+ }
+ }
+ return children;
+}
+
std::vector<IPluginRequirement::Problem> PluginRequirements::problems() const
{
std::vector<IPluginRequirement::Problem> 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);
}
|
