summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2020-11-17 12:30:59 +0100
committerMikaël Capelle <capelle.mikael@gmail.com>2020-11-17 12:30:59 +0100
commit1e67c3e68dbe4141c9cd3bfd7b29c747fca03753 (patch)
tree7733cb4bb0086e6e9d018cae9171c2360d85498b
parent9fd2a757fa0c25c72c6d8927924d0a8668e948c4 (diff)
Add core plugins and better messages.
-rw-r--r--src/plugincontainer.cpp20
-rw-r--r--src/plugincontainer.h9
-rw-r--r--src/settingsdialogplugins.cpp13
3 files changed, 35 insertions, 7 deletions
diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp
index 8c2ece76..7884498c 100644
--- a/src/plugincontainer.cpp
+++ b/src/plugincontainer.cpp
@@ -101,6 +101,10 @@ QStringList PluginContainer::pluginInterfaces()
// PluginRequirementProxy
+const std::set<QString> PluginRequirements::s_CorePlugins{
+ "INI Bakery"
+};
+
PluginRequirements::PluginRequirements(
PluginContainer* pluginContainer, MOBase::IPlugin* plugin, IOrganizer* proxy,
MOBase::IPluginProxy* pluginProxy)
@@ -193,6 +197,16 @@ bool PluginRequirements::canEnable() const
return problems().empty();
}
+bool PluginRequirements::isCorePlugin() const
+{
+ // Let's consider game plugins as "core":
+ if (m_PluginContainer->implementInterface<IPluginGame>(m_Plugin)) {
+ return true;
+ }
+
+ return s_CorePlugins.contains(m_Plugin->name());
+}
+
bool PluginRequirements::hasRequirements() const
{
return !m_Requirements.empty();
@@ -405,7 +419,11 @@ bool PluginContainer::initPlugin(IPlugin *plugin, IPluginProxy *pluginProxy, boo
auto [it, bl] = m_Requirements.emplace(plugin, PluginRequirements(this, plugin, proxy, pluginProxy));
- if (!skipInit && !plugin->init(proxy)) {
+ if (skipInit) {
+ return true;
+ }
+
+ if (!plugin->init(proxy)) {
log::warn("plugin failed to initialize");
return false;
}
diff --git a/src/plugincontainer.h b/src/plugincontainer.h
index e9f0f453..36edfad9 100644
--- a/src/plugincontainer.h
+++ b/src/plugincontainer.h
@@ -40,6 +40,12 @@ public:
bool canEnable() const;
/**
+ * @return true if this is a core plugin, i.e. a plugin that should not be
+ * manually enabled or disabled by the user.
+ */
+ bool isCorePlugin() const;
+
+ /**
* @return true if this plugin has requirements (satisfied or not).
*/
bool hasRequirements() const;
@@ -83,6 +89,9 @@ public:
private:
+ // The list of "Core" plugins.
+ static const std::set<QString> s_CorePlugins;
+
// Accumulator version for requiredFor() to avoid infinite recursion.
void requiredFor(std::vector<MOBase::IPlugin*>& required, std::set<MOBase::IPlugin*>& visited) const;
diff --git a/src/settingsdialogplugins.cpp b/src/settingsdialogplugins.cpp
index a86ba5c9..0c860fa0 100644
--- a/src/settingsdialogplugins.cpp
+++ b/src/settingsdialogplugins.cpp
@@ -241,7 +241,8 @@ void PluginsSettingsTab::on_checkboxEnabled_clicked(bool checked)
if (m_pluginContainer->requirements(game).proxy() == plugin) {
QMessageBox::warning(
parentWidget(), QObject::tr("Cannot disable plugin"),
- QObject::tr("This plugin is used by the current game plugin and cannot disabled."), QMessageBox::Ok);
+ QObject::tr("The '%1' plugin is used by the current game plugin and cannot disabled.")
+ .arg(plugin->localizedName()), QMessageBox::Ok);
ui->enabledCheckbox->setChecked(true);
return;
}
@@ -254,9 +255,9 @@ void PluginsSettingsTab::on_checkboxEnabled_clicked(bool checked)
}
pluginNames.sort();
QString message = QObject::tr(
- "<p>Disabling this plugin will prevent the following plugins from working:</p><ul>%1</ul>"
+ "<p>Disabling the '%1' plugin will prevent the following plugins from working:</p><ul>%1</ul>"
"<p>Do you want to continue? You will need to restart ModOrganizer2 for the change to take effect.</p>")
- .arg("<li>" + pluginNames.join("</li><li>") + "</li>");
+ .arg(plugin->localizedName()).arg("<li>" + pluginNames.join("</li><li>") + "</li>");
if (QMessageBox::critical(
parentWidget(), QObject::tr("Really disable plugin?"), message,
QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) {
@@ -275,8 +276,8 @@ void PluginsSettingsTab::on_checkboxEnabled_clicked(bool checked)
}
pluginNames.sort();
QString message = QObject::tr(
- "<p>Disabling this plugin will also disable the following plugins:</p><ul>%1</ul><p>Do you want to continue?</p>")
- .arg("<li>" + pluginNames.join("</li><li>") + "</li>");
+ "<p>Disabling the '%1' plugin will also disable the following plugins:</p><ul>%1</ul><p>Do you want to continue?</p>")
+ .arg(plugin->localizedName()).arg("<li>" + pluginNames.join("</li><li>") + "</li>");
if (QMessageBox::warning(
parentWidget(), QObject::tr("Really disable plugin?"), message,
QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) {
@@ -310,7 +311,7 @@ void PluginsSettingsTab::on_pluginsList_currentItemChanged(QTreeWidgetItem *curr
ui->descriptionLabel->setText(plugin->description());
ui->enabledCheckbox->setVisible(
- !m_pluginContainer->implementInterface<MOBase::IPluginGame>(plugin)
+ !m_pluginContainer->requirements(plugin).isCorePlugin()
&& plugin->master().isEmpty());
ui->enabledCheckbox->setChecked(m_pluginContainer->isEnabled(plugin));