summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugincontainer.cpp40
-rw-r--r--src/plugincontainer.h15
-rw-r--r--src/settingsdialogplugins.cpp44
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();