From 1e67c3e68dbe4141c9cd3bfd7b29c747fca03753 Mon Sep 17 00:00:00 2001 From: Mikaƫl Capelle Date: Tue, 17 Nov 2020 12:30:59 +0100 Subject: Add core plugins and better messages. --- src/plugincontainer.cpp | 20 +++++++++++++++++++- src/plugincontainer.h | 9 +++++++++ src/settingsdialogplugins.cpp | 13 +++++++------ 3 files changed, 35 insertions(+), 7 deletions(-) (limited to 'src') 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 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(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 @@ -39,6 +39,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). */ @@ -83,6 +89,9 @@ public: private: + // The list of "Core" plugins. + static const std::set s_CorePlugins; + // Accumulator version for requiredFor() to avoid infinite recursion. void requiredFor(std::vector& required, std::set& 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( - "

Disabling this plugin will prevent the following plugins from working:

    %1
" + "

Disabling the '%1' plugin will prevent the following plugins from working:

    %1
" "

Do you want to continue? You will need to restart ModOrganizer2 for the change to take effect.

") - .arg("
  • " + pluginNames.join("
  • ") + "
  • "); + .arg(plugin->localizedName()).arg("
  • " + pluginNames.join("
  • ") + "
  • "); 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( - "

    Disabling this plugin will also disable the following plugins:

      %1

    Do you want to continue?

    ") - .arg("
  • " + pluginNames.join("
  • ") + "
  • "); + "

    Disabling the '%1' plugin will also disable the following plugins:

      %1

    Do you want to continue?

    ") + .arg(plugin->localizedName()).arg("
  • " + pluginNames.join("
  • ") + "
  • "); 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(plugin) + !m_pluginContainer->requirements(plugin).isCorePlugin() && plugin->master().isEmpty()); ui->enabledCheckbox->setChecked(m_pluginContainer->isEnabled(plugin)); -- cgit v1.3.1