From fe81fe5aaa99d81512a4d241855fd425680b6ec9 Mon Sep 17 00:00:00 2001 From: Juraj Oravec Date: Fri, 23 Aug 2024 23:31:54 +0200 Subject: [PATCH] Preferences: Fix crash when un/loading of plugins BUG: 492023 FIXED-IN: 24.12.0 Signed-off-by: Juraj Oravec --- src/lib/preferences/pluginsmanager.cpp | 20 ++++++++++++-------- src/lib/preferences/pluginsmanager.h | 4 +++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/lib/preferences/pluginsmanager.cpp b/src/lib/preferences/pluginsmanager.cpp index cd5d81727..68aca6898 100644 --- a/src/lib/preferences/pluginsmanager.cpp +++ b/src/lib/preferences/pluginsmanager.cpp @@ -77,7 +77,7 @@ void PluginsManager::save() QListWidgetItem* item = ui->list->item(i); if (item->checkState() == Qt::Checked) { - const Plugins::Plugin plugin = item->data(PluginRoles::Plugin).value(); + const Plugins::Plugin plugin = m_pluginList[item->data(PluginRoles::PluginId).value()]; allowedPlugins.append(plugin.pluginId); } } @@ -96,6 +96,7 @@ void PluginsManager::refresh() const int oldCurrentRow = ui->list->currentRow(); + m_pluginList.clear(); ui->list->clear(); ui->butSettings->setEnabled(false); disconnect(ui->list, &QListWidget::itemChanged, this, &PluginsManager::itemChanged); @@ -119,10 +120,12 @@ void PluginsManager::refresh() item->setData(PluginRoles::Version, spec.version); item->setData(PluginRoles::Author, spec.author); item->setData(PluginRoles::Description, spec.description); + item->setData(PluginRoles::PluginId, plugin.pluginId); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(plugin.isLoaded() ? Qt::Checked : Qt::Unchecked); - item->setData(PluginRoles::Plugin, QVariant::fromValue(plugin)); + + m_pluginList[plugin.pluginId] = plugin; ui->list->addItem(item); } @@ -167,7 +170,7 @@ void PluginsManager::currentChanged(QListWidgetItem* item) return; } - const Plugins::Plugin plugin = item->data(PluginRoles::Plugin).value(); + const Plugins::Plugin plugin = m_pluginList[item->data(PluginRoles::PluginId).value()]; ui->butSettings->setEnabled(plugin.isLoaded() && plugin.pluginSpec.hasSettings); ui->butRemove->setEnabled(plugin.isRemovable()); } @@ -178,7 +181,7 @@ void PluginsManager::itemChanged(QListWidgetItem* item) return; } - Plugins::Plugin plugin = item->data(PluginRoles::Plugin).value(); + Plugins::Plugin plugin = m_pluginList[item->data(PluginRoles::PluginId).value()]; m_blockRefresh = true; @@ -198,7 +201,7 @@ void PluginsManager::itemChanged(QListWidgetItem* item) QMessageBox::critical(this, tr("Error!"), tr("Cannot load extension!")); } - item->setData(PluginRoles::Plugin, QVariant::fromValue(plugin)); + m_pluginList[plugin.pluginId] = plugin; connect(ui->list, &QListWidget::itemChanged, this, &PluginsManager::itemChanged); @@ -212,12 +215,12 @@ void PluginsManager::settingsClicked() return; } - Plugins::Plugin plugin = item->data(PluginRoles::Plugin).value(); + Plugins::Plugin plugin = m_pluginList[item->data(PluginRoles::PluginId).value()]; if (!plugin.isLoaded()) { mApp->plugins()->loadPlugin(&plugin); - item->setData(PluginRoles::Plugin, QVariant::fromValue(plugin)); + m_pluginList[plugin.pluginId] = plugin; } if (plugin.isLoaded() && plugin.pluginSpec.hasSettings) { @@ -232,7 +235,7 @@ void PluginsManager::removeClicked() return; } - Plugins::Plugin plugin = item->data(PluginRoles::Plugin).value(); + Plugins::Plugin plugin = m_pluginList[item->data(PluginRoles::PluginId).value()]; const auto button = QMessageBox::warning(this, tr("Confirmation"), tr("Are you sure you want to remove '%1'?").arg(plugin.pluginSpec.name), @@ -241,6 +244,7 @@ void PluginsManager::removeClicked() return; } + m_pluginList.remove(plugin.pluginId); mApp->plugins()->removePlugin(&plugin); } diff --git a/src/lib/preferences/pluginsmanager.h b/src/lib/preferences/pluginsmanager.h index 676b7fdc2..f334895e6 100644 --- a/src/lib/preferences/pluginsmanager.h +++ b/src/lib/preferences/pluginsmanager.h @@ -20,6 +20,7 @@ #include +#include "plugins.h" #include "qzcommon.h" namespace Ui @@ -38,7 +39,7 @@ public: Version = Qt::UserRole, Author = Qt::UserRole + 1, Description = Qt::UserRole + 2, - Plugin = Qt::UserRole + 10 + PluginId = Qt::UserRole + 3 }; explicit PluginsManager(QWidget* parent = nullptr); @@ -62,6 +63,7 @@ private: Ui::PluginsList* ui; bool m_loaded; bool m_blockRefresh = false; + QHash m_pluginList; }; #endif // PLUGINSMANAGER_H