From a9987a6c2acfc25b69456071695071577420b629 Mon Sep 17 00:00:00 2001 From: donghualin Date: Fri, 17 Jun 2022 10:54:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=B6=E5=B0=9A?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=97=A0=E6=B3=95=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E7=94=B5=E6=BA=90=E6=8F=92=E4=BB=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:在判断该插件是否可移除之前已经将内存中该插件的数据清除,找不到该插件的信息导致无法移除 修改方案:在判断该插件是否可移除之前不清空该插件的内存,等确定该插件可移除后再清空内存,保证插件获取到的数据始终正确 Log: 修复时尚模式下无法移除电源插件的问题 Influence: 任务栏时尚模式下,打开控制中心-个性化-任务栏-插件区域,去掉电源勾选,查看电源按钮是否消失 Task: https://pms.uniontech.com/task-view-121387.html Change-Id: I0a9f214dab64e6b81b71d8cf50a969979c69c1ac --- frame/controller/dockpluginscontroller.cpp | 5 +++++ frame/controller/dockpluginscontroller.h | 4 +--- frame/controller/proxyplugincontroller.cpp | 17 +++++++++++------ frame/controller/proxyplugincontroller.h | 2 +- frame/util/abstractpluginscontroller.cpp | 2 +- frame/util/abstractpluginscontroller.h | 8 ++++---- frame/window/systempluginwindow.cpp | 18 ++++++++++++++++-- frame/window/systempluginwindow.h | 1 + 8 files changed, 40 insertions(+), 17 deletions(-) diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp index 623e7a34e..115964a7f 100644 --- a/frame/controller/dockpluginscontroller.cpp +++ b/frame/controller/dockpluginscontroller.cpp @@ -144,3 +144,8 @@ void DockPluginsController::requestSetAppletVisible(PluginsItemInterface *const item->hidePopup(); } } + +QMap> &DockPluginsController::pluginsMap() +{ + return ProxyPluginController::instance(PluginType::FixedSystemPlugin)->pluginsMap(); +} diff --git a/frame/controller/dockpluginscontroller.h b/frame/controller/dockpluginscontroller.h index 7c740ab4b..6b7e26705 100644 --- a/frame/controller/dockpluginscontroller.h +++ b/frame/controller/dockpluginscontroller.h @@ -38,9 +38,6 @@ class DockPluginsController : public AbstractPluginsController { Q_OBJECT - friend class DockItemController; - friend class DockItemManager; - public: explicit DockPluginsController(QObject *parent = nullptr); ~DockPluginsController() override; @@ -52,6 +49,7 @@ public: void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; + QMap> &pluginsMap(); signals: void pluginItemInserted(PluginsItem *pluginItem) const; diff --git a/frame/controller/proxyplugincontroller.cpp b/frame/controller/proxyplugincontroller.cpp index d2b1e4cc8..925be4c8c 100644 --- a/frame/controller/proxyplugincontroller.cpp +++ b/frame/controller/proxyplugincontroller.cpp @@ -152,13 +152,9 @@ void ProxyPluginController::itemUpdate(PluginsItemInterface * const itemInter, c void ProxyPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) { - if (m_pluginsItems.contains(itemInter)) - m_pluginsItems.removeOne(itemInter); - - if (m_pluginsItemKeys.contains(itemInter)) - m_pluginsItemKeys.remove(itemInter); - + // 先获取可执行的controller,再移除,因为在判断当前插件是否加载的时候需要用到当前容器中的插件来获取当前代理 QList validController = getValidController(itemInter); + removePluginItem(itemInter); for (AbstractPluginsController *interface : validController) interface->itemRemoved(itemInter, itemKey); } @@ -214,6 +210,15 @@ QList ProxyPluginController::getValidController(Plu return validController; } +void ProxyPluginController::removePluginItem(PluginsItemInterface * const itemInter) +{ + if (m_pluginsItems.contains(itemInter)) + m_pluginsItems.removeOne(itemInter); + + if (m_pluginsItemKeys.contains(itemInter)) + m_pluginsItemKeys.remove(itemInter); +} + void ProxyPluginController::startLoader() { QDir dir; diff --git a/frame/controller/proxyplugincontroller.h b/frame/controller/proxyplugincontroller.h index bb928e861..f84f0ddfa 100644 --- a/frame/controller/proxyplugincontroller.h +++ b/frame/controller/proxyplugincontroller.h @@ -67,7 +67,7 @@ protected: private: QList getValidController(PluginsItemInterface *itemInter) const; - // 该方法可以由DockPluginsController类类调用,强制加载,因此,在此处给这个类加载了一个友元 + void removePluginItem(PluginsItemInterface * const itemInter); void startLoader(); private: diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index c406a2c4d..3d42bce2b 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -125,7 +125,7 @@ void AbstractPluginsController::removeValue(PluginsItemInterface *const itemInte m_dockDaemonInter->RemovePluginSettings(itemInter->pluginName(), keyList); } -QMap > &AbstractPluginsController::pluginsMap() +QMap> &AbstractPluginsController::pluginsMap() { return m_pluginsMap; } diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index f98e183ce..f58e5a69e 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -51,19 +51,19 @@ public: void itemAdded(PluginsItemInterface * const, const QString &) override {} void itemUpdate(PluginsItemInterface * const, const QString &) override {} void itemRemoved(PluginsItemInterface * const, const QString &) override {} - void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override {} - void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override {} - void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override {} + void requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {} + void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {} + void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {} void updateDockInfo(PluginsItemInterface *const, const DockPart &) override {} virtual bool needLoad(PluginsItemInterface *) { return true; } + QMap> &pluginsMap(); signals: void pluginLoaderFinished(); protected: - QMap> &pluginsMap(); QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; PluginsItemInterface *pluginInterAt(const QString &itemKey); PluginsItemInterface *pluginInterAt(QObject *destItem); diff --git a/frame/window/systempluginwindow.cpp b/frame/window/systempluginwindow.cpp index 3128375ba..fed159c50 100644 --- a/frame/window/systempluginwindow.cpp +++ b/frame/window/systempluginwindow.cpp @@ -107,9 +107,23 @@ void SystemPluginWindow::initUi() m_mainLayout->setSpacing(0); } +bool SystemPluginWindow::pluginExist(StretchPluginsItem *pluginItem) +{ + for (int i = 0; i < m_mainLayout->count(); i++) { + QLayoutItem *layoutItem = m_mainLayout->itemAt(i); + if (!layoutItem) + continue; + + if (layoutItem->widget() == pluginItem) + return true; + } + + return false; +} + void SystemPluginWindow::onPluginItemAdded(StretchPluginsItem *pluginItem) { - if (m_mainLayout->children().contains(pluginItem)) + if (pluginExist(pluginItem)) return; pluginItem->setPosition(m_position); @@ -121,7 +135,7 @@ void SystemPluginWindow::onPluginItemAdded(StretchPluginsItem *pluginItem) void SystemPluginWindow::onPluginItemRemoved(StretchPluginsItem *pluginItem) { - if (!m_mainLayout->children().contains(pluginItem)) + if (!pluginExist(pluginItem)) return; pluginItem->setParent(nullptr); diff --git a/frame/window/systempluginwindow.h b/frame/window/systempluginwindow.h index 184b1f46f..1c260e5f7 100644 --- a/frame/window/systempluginwindow.h +++ b/frame/window/systempluginwindow.h @@ -49,6 +49,7 @@ Q_SIGNALS: private: void initUi(); + bool pluginExist(StretchPluginsItem *pluginItem); private Q_SLOTS: void onPluginItemAdded(StretchPluginsItem *pluginItem);