diff options
| -rw-r--r-- | src/plugincontainer.cpp | 40 | ||||
| -rw-r--r-- | src/plugincontainer.h | 15 | ||||
| -rw-r--r-- | src/settingsdialogplugins.cpp | 44 |
3 files changed, 88 insertions, 11 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);
}
diff --git a/src/plugincontainer.h b/src/plugincontainer.h index 520ee83e..e9761cb1 100644 --- a/src/plugincontainer.h +++ b/src/plugincontainer.h @@ -40,11 +40,26 @@ public: bool canEnable() const;
/**
+ * @return true if this plugin has requirements (satisfied or not).
+ */
+ bool hasRequirements() const;
+
+ /**
* @return the proxy that created this plugin, if any.
*/
MOBase::IPluginProxy* proxy() const;
/**
+ * @return the master of this plugin, if any.
+ */
+ MOBase::IPlugin* master() const;
+
+ /**
+ * @return the plugins this plugin is master of.
+ */
+ std::vector<MOBase::IPlugin*> children() const;
+
+ /**
* @return the list of problems to be resolved before enabling the plugin.
*/
std::vector<MOBase::IPluginRequirement::Problem> problems() const;
diff --git a/src/settingsdialogplugins.cpp b/src/settingsdialogplugins.cpp index 1e2117cf..15c0b424 100644 --- a/src/settingsdialogplugins.cpp +++ b/src/settingsdialogplugins.cpp @@ -31,14 +31,10 @@ PluginsSettingsTab::PluginsSettingsTab(Settings& s, PluginContainer* pluginConta // display plugin settings QSet<QString> handledNames; for (IPlugin* plugin : settings().plugins().plugins()) { - if (handledNames.contains(plugin->name())) { - continue; - } - if (!m_filter.matches([plugin](const QRegularExpression& regex) { - return regex.match(plugin->localizedName()).hasMatch(); - })) { + if (handledNames.contains(plugin->name()) || !plugin->master().isEmpty()) { continue; } + QTreeWidgetItem* listItem = new QTreeWidgetItem( topItems.at(m_pluginContainer->topImplementedInterface(plugin))); listItem->setData(0, Qt::DisplayRole, plugin->localizedName()); @@ -46,6 +42,18 @@ PluginsSettingsTab::PluginsSettingsTab(Settings& s, PluginContainer* pluginConta listItem->setData(0, ROLE_SETTINGS, settings().plugins().settings(plugin->name())); listItem->setData(0, ROLE_DESCRIPTIONS, settings().plugins().descriptions(plugin->name())); + // Handle child item: + auto children = m_pluginContainer->requirements(plugin).children(); + for (auto* child : children) { + QTreeWidgetItem* childItem = new QTreeWidgetItem(listItem); + childItem->setData(0, Qt::DisplayRole, child->localizedName()); + childItem->setData(0, ROLE_PLUGIN, QVariant::fromValue((void*)child)); + childItem->setData(0, ROLE_SETTINGS, settings().plugins().settings(child->name())); + childItem->setData(0, ROLE_DESCRIPTIONS, settings().plugins().descriptions(child->name())); + + handledNames.insert(child->name()); + } + handledNames.insert(plugin->name()); } @@ -90,7 +98,13 @@ void PluginsSettingsTab::updateListItems() bool inactive = !m_pluginContainer->implementInterface<IPluginGame>(plugin) && !m_pluginContainer->isEnabled(plugin); - // TODO: Better display. + + auto font = item->font(0); + font.setItalic(inactive); + item->setFont(0, font); + for (auto k = 0; k < item->childCount(); ++k) { + item->child(k)->setFont(0, font); + } } } @@ -108,9 +122,18 @@ void PluginsSettingsTab::filterPluginList() auto* item = topLevelItem->child(j); auto* plugin = this->plugin(item); - if (m_filter.matches([plugin](const QRegularExpression& regex) { + // Check the item or the child - If any match (item or child), the whole + // group is displayed. + bool match = m_filter.matches([plugin](const QRegularExpression& regex) { return regex.match(plugin->localizedName()).hasMatch(); - })) { + }); + for (auto* child : m_pluginContainer->requirements(plugin).children()) { + m_filter.matches([child](const QRegularExpression& regex) { + return regex.match(child->localizedName()).hasMatch(); + }); + } + + if (match) { found = true; item->setHidden(false); @@ -251,7 +274,8 @@ void PluginsSettingsTab::on_pluginsList_currentItemChanged(QTreeWidgetItem *curr ui->descriptionLabel->setText(plugin->description()); ui->enabledCheckbox->setVisible( - !m_pluginContainer->implementInterface<MOBase::IPluginGame>(plugin)); + !m_pluginContainer->implementInterface<MOBase::IPluginGame>(plugin) + && plugin->master().isEmpty()); ui->enabledCheckbox->setChecked(m_pluginContainer->isEnabled(plugin)); QVariantMap settings = current->data(0, ROLE_SETTINGS).toMap(); |
