fix: 修复时尚模式下无法移除电源插件的问题

原因:在判断该插件是否可移除之前已经将内存中该插件的数据清除,找不到该插件的信息导致无法移除
修改方案:在判断该插件是否可移除之前不清空该插件的内存,等确定该插件可移除后再清空内存,保证插件获取到的数据始终正确

Log: 修复时尚模式下无法移除电源插件的问题
Influence: 任务栏时尚模式下,打开控制中心-个性化-任务栏-插件区域,去掉电源勾选,查看电源按钮是否消失
Task: https://pms.uniontech.com/task-view-121387.html
Change-Id: I0a9f214dab64e6b81b71d8cf50a969979c69c1ac
This commit is contained in:
donghualin 2022-06-17 10:54:29 +08:00
parent 2ee2fe9eca
commit a9987a6c2a
8 changed files with 40 additions and 17 deletions

View File

@ -144,3 +144,8 @@ void DockPluginsController::requestSetAppletVisible(PluginsItemInterface *const
item->hidePopup(); item->hidePopup();
} }
} }
QMap<PluginsItemInterface *, QMap<QString, QObject *>> &DockPluginsController::pluginsMap()
{
return ProxyPluginController::instance(PluginType::FixedSystemPlugin)->pluginsMap();
}

View File

@ -38,9 +38,6 @@ class DockPluginsController : public AbstractPluginsController
{ {
Q_OBJECT Q_OBJECT
friend class DockItemController;
friend class DockItemManager;
public: public:
explicit DockPluginsController(QObject *parent = nullptr); explicit DockPluginsController(QObject *parent = nullptr);
~DockPluginsController() override; ~DockPluginsController() override;
@ -52,6 +49,7 @@ public:
void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override; void requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide) override;
void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override; void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override;
void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override; void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override;
QMap<PluginsItemInterface *, QMap<QString, QObject *>> &pluginsMap();
signals: signals:
void pluginItemInserted(PluginsItem *pluginItem) const; void pluginItemInserted(PluginsItem *pluginItem) const;

View File

@ -152,13 +152,9 @@ void ProxyPluginController::itemUpdate(PluginsItemInterface * const itemInter, c
void ProxyPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey) void ProxyPluginController::itemRemoved(PluginsItemInterface * const itemInter, const QString &itemKey)
{ {
if (m_pluginsItems.contains(itemInter)) // 先获取可执行的controller再移除因为在判断当前插件是否加载的时候需要用到当前容器中的插件来获取当前代理
m_pluginsItems.removeOne(itemInter);
if (m_pluginsItemKeys.contains(itemInter))
m_pluginsItemKeys.remove(itemInter);
QList<AbstractPluginsController *> validController = getValidController(itemInter); QList<AbstractPluginsController *> validController = getValidController(itemInter);
removePluginItem(itemInter);
for (AbstractPluginsController *interface : validController) for (AbstractPluginsController *interface : validController)
interface->itemRemoved(itemInter, itemKey); interface->itemRemoved(itemInter, itemKey);
} }
@ -214,6 +210,15 @@ QList<AbstractPluginsController *> ProxyPluginController::getValidController(Plu
return validController; 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() void ProxyPluginController::startLoader()
{ {
QDir dir; QDir dir;

View File

@ -67,7 +67,7 @@ protected:
private: private:
QList<AbstractPluginsController *> getValidController(PluginsItemInterface *itemInter) const; QList<AbstractPluginsController *> getValidController(PluginsItemInterface *itemInter) const;
// 该方法可以由DockPluginsController类类调用强制加载因此在此处给这个类加载了一个友元 void removePluginItem(PluginsItemInterface * const itemInter);
void startLoader(); void startLoader();
private: private:

View File

@ -125,7 +125,7 @@ void AbstractPluginsController::removeValue(PluginsItemInterface *const itemInte
m_dockDaemonInter->RemovePluginSettings(itemInter->pluginName(), keyList); m_dockDaemonInter->RemovePluginSettings(itemInter->pluginName(), keyList);
} }
QMap<PluginsItemInterface *, QMap<QString, QObject *> > &AbstractPluginsController::pluginsMap() QMap<PluginsItemInterface *, QMap<QString, QObject *>> &AbstractPluginsController::pluginsMap()
{ {
return m_pluginsMap; return m_pluginsMap;
} }

View File

@ -51,19 +51,19 @@ public:
void itemAdded(PluginsItemInterface * const, const QString &) override {} void itemAdded(PluginsItemInterface * const, const QString &) override {}
void itemUpdate(PluginsItemInterface * const, const QString &) override {} void itemUpdate(PluginsItemInterface * const, const QString &) override {}
void itemRemoved(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 requestWindowAutoHide(PluginsItemInterface * const, const QString &, const bool) override {}
void requestRefreshWindowVisible(PluginsItemInterface * const itemInter, const QString &itemKey) override {} void requestRefreshWindowVisible(PluginsItemInterface * const, const QString &) override {}
void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override {} void requestSetAppletVisible(PluginsItemInterface * const, const QString &, const bool) override {}
void updateDockInfo(PluginsItemInterface *const, const DockPart &) override {} void updateDockInfo(PluginsItemInterface *const, const DockPart &) override {}
virtual bool needLoad(PluginsItemInterface *) { return true; } virtual bool needLoad(PluginsItemInterface *) { return true; }
QMap<PluginsItemInterface *, QMap<QString, QObject *>> &pluginsMap();
signals: signals:
void pluginLoaderFinished(); void pluginLoaderFinished();
protected: protected:
QMap<PluginsItemInterface *, QMap<QString, QObject *>> &pluginsMap();
QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const;
PluginsItemInterface *pluginInterAt(const QString &itemKey); PluginsItemInterface *pluginInterAt(const QString &itemKey);
PluginsItemInterface *pluginInterAt(QObject *destItem); PluginsItemInterface *pluginInterAt(QObject *destItem);

View File

@ -107,9 +107,23 @@ void SystemPluginWindow::initUi()
m_mainLayout->setSpacing(0); 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) void SystemPluginWindow::onPluginItemAdded(StretchPluginsItem *pluginItem)
{ {
if (m_mainLayout->children().contains(pluginItem)) if (pluginExist(pluginItem))
return; return;
pluginItem->setPosition(m_position); pluginItem->setPosition(m_position);
@ -121,7 +135,7 @@ void SystemPluginWindow::onPluginItemAdded(StretchPluginsItem *pluginItem)
void SystemPluginWindow::onPluginItemRemoved(StretchPluginsItem *pluginItem) void SystemPluginWindow::onPluginItemRemoved(StretchPluginsItem *pluginItem)
{ {
if (!m_mainLayout->children().contains(pluginItem)) if (!pluginExist(pluginItem))
return; return;
pluginItem->setParent(nullptr); pluginItem->setParent(nullptr);

View File

@ -49,6 +49,7 @@ Q_SIGNALS:
private: private:
void initUi(); void initUi();
bool pluginExist(StretchPluginsItem *pluginItem);
private Q_SLOTS: private Q_SLOTS:
void onPluginItemAdded(StretchPluginsItem *pluginItem); void onPluginItemAdded(StretchPluginsItem *pluginItem);