From 5be68d7256dbf9de22c10589e061c17d98361199 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 25 Jun 2024 16:43:07 +0200 Subject: [PATCH] ExtensionManager: Enable/disable dependencies, inform users accordingly This instantiates PluginView in order to use setPluginsEnabled. It enables dependencies of a plugin that is being enabled. Likewise, it disables dependent plugins when users disable a plugin. In both cases, the user sees the familiar info dialog. On confirmation, a "Restart now" button is shown. Change-Id: Ie74ed377bfdd1ce3cb06289c2aae78377475bc53 Reviewed-by: Alessandro Portale Reviewed-by: hjk --- src/libs/extensionsystem/pluginview.cpp | 5 +++++ src/libs/extensionsystem/pluginview.h | 2 ++ .../extensionmanagerwidget.cpp | 19 +++++++++++++++++-- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/libs/extensionsystem/pluginview.cpp b/src/libs/extensionsystem/pluginview.cpp index fb02b492840..24ec0a969d5 100644 --- a/src/libs/extensionsystem/pluginview.cpp +++ b/src/libs/extensionsystem/pluginview.cpp @@ -369,6 +369,11 @@ void PluginView::updatePlugins() m_categoryView->expandAll(); } +PluginData &PluginView::data() +{ + return m_data; +} + static QString pluginListString(const QSet &plugins) { QStringList names = Utils::transform(plugins, &PluginSpec::name); diff --git a/src/libs/extensionsystem/pluginview.h b/src/libs/extensionsystem/pluginview.h index aa01332dbf7..db144247277 100644 --- a/src/libs/extensionsystem/pluginview.h +++ b/src/libs/extensionsystem/pluginview.h @@ -60,6 +60,8 @@ public: void setFilter(const QString &filter); void cancelChanges(); + PluginData &data(); + signals: void currentPluginChanged(ExtensionSystem::PluginSpec *spec); void pluginActivated(ExtensionSystem::PluginSpec *spec); diff --git a/src/plugins/extensionmanager/extensionmanagerwidget.cpp b/src/plugins/extensionmanager/extensionmanagerwidget.cpp index 6606b2d0bbc..3b16f0d9c84 100644 --- a/src/plugins/extensionmanager/extensionmanagerwidget.cpp +++ b/src/plugins/extensionmanager/extensionmanagerwidget.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -279,21 +280,33 @@ public: { m_label = new InfoLabel; m_checkBox = new QCheckBox(Tr::tr("Load on Start")); + m_restartButton = new Button("Restart now", Button::MediumPrimary); + m_restartButton->setVisible(false); + m_pluginView.hide(); using namespace Layouting; Column { m_label, m_checkBox, + m_restartButton, }.attachTo(this); connect(m_checkBox, &QCheckBox::clicked, this, [this](bool checked) { ExtensionSystem::PluginSpec *spec = ExtensionsModel::pluginSpecForName(m_pluginName); if (spec == nullptr) return; - spec->setEnabledBySettings(checked); - ExtensionSystem::PluginManager::writeSettings(); + const bool doIt = m_pluginView.data().setPluginsEnabled({spec}, checked); + if (doIt) { + m_restartButton->show(); + ExtensionSystem::PluginManager::writeSettings(); + } else { + m_checkBox->setChecked(!checked); + } }); + connect(m_restartButton, &QAbstractButton::clicked, + ICore::instance(), &ICore::restart, Qt::QueuedConnection); + update(); } @@ -328,7 +341,9 @@ private: InfoLabel *m_label; QCheckBox *m_checkBox; + QAbstractButton *m_restartButton; QString m_pluginName; + ExtensionSystem::PluginView m_pluginView{this}; }; class TagList : public QWidget