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);