fix: 修复控制中心无法取消任务栏插件显示隐藏的问题

原因:获取以加载插件接口错误,导致无法获取到正确的插件,引起无法移除
修复:获取正确的插件对象指针,保证插件正确移除

Log:
Influence: 从控制中心移除任务栏插件,观察任务栏插件是否正常移除
Bug: https://pms.uniontech.com/task-view-121387.html
Change-Id: I0bf44d91de74acba277f76c412955f40b0a7efba
This commit is contained in:
donghualin 2022-06-27 10:17:43 +00:00
parent 1b179edc55
commit 82da556471
6 changed files with 40 additions and 13 deletions

View File

@ -81,7 +81,7 @@ void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, con
void DockPluginsController::itemUpdate(PluginsItemInterface *const itemInter, const QString &itemKey)
{
PluginsItem *item = static_cast<PluginsItem *>(pluginItemAt(itemInter, itemKey));
PluginsItem *item = getPluginItem(itemInter, itemKey);
if (!item)
return;
@ -92,7 +92,7 @@ void DockPluginsController::itemUpdate(PluginsItemInterface *const itemInter, co
void DockPluginsController::itemRemoved(PluginsItemInterface *const itemInter, const QString &itemKey)
{
PluginsItem *item = static_cast<PluginsItem *>(pluginItemAt(itemInter, itemKey));
PluginsItem *item = getPluginItem(itemInter, itemKey);
if (!item)
return;
@ -116,7 +116,7 @@ void DockPluginsController::itemRemoved(PluginsItemInterface *const itemInter, c
void DockPluginsController::requestWindowAutoHide(PluginsItemInterface *const itemInter, const QString &itemKey, const bool autoHide)
{
PluginsItem *item = static_cast<PluginsItem *>(pluginItemAt(itemInter, itemKey));
PluginsItem *item = getPluginItem(itemInter, itemKey);
if (!item)
return;
@ -125,7 +125,7 @@ void DockPluginsController::requestWindowAutoHide(PluginsItemInterface *const it
void DockPluginsController::requestRefreshWindowVisible(PluginsItemInterface *const itemInter, const QString &itemKey)
{
PluginsItem *item = static_cast<PluginsItem *>(pluginItemAt(itemInter, itemKey));
PluginsItem *item = getPluginItem(itemInter, itemKey);
if (!item)
return;
@ -134,7 +134,7 @@ void DockPluginsController::requestRefreshWindowVisible(PluginsItemInterface *co
void DockPluginsController::requestSetAppletVisible(PluginsItemInterface *const itemInter, const QString &itemKey, const bool visible)
{
PluginsItem *item = static_cast<PluginsItem *>(pluginItemAt(itemInter, itemKey));
PluginsItem *item = getPluginItem(itemInter, itemKey);
if (!item)
return;
@ -149,3 +149,16 @@ QMap<PluginsItemInterface *, QMap<QString, QObject *>> &DockPluginsController::p
{
return ProxyPluginController::instance(PluginType::FixedSystemPlugin)->pluginsMap();
}
PluginsItem *DockPluginsController::getPluginItem(PluginsItemInterface * const itemInter, const QString &itemKey) const
{
ProxyPluginController *proxyController = ProxyPluginController::instance(itemInter);
if (!proxyController)
return nullptr;
const QMap<PluginsItemInterface *, QMap<QString, QObject *>> &plugins = proxyController->pluginsMap();
if (plugins.contains(itemInter) && plugins[itemInter].contains(itemKey))
return static_cast<PluginsItem *>(plugins[itemInter][itemKey]);
return nullptr;
}

View File

@ -49,6 +49,9 @@ public:
void requestSetAppletVisible(PluginsItemInterface * const itemInter, const QString &itemKey, const bool visible) override;
QMap<PluginsItemInterface *, QMap<QString, QObject *>> &pluginsMap();
private:
PluginsItem *getPluginItem(PluginsItemInterface * const itemInter, const QString &itemKey) const;
signals:
void pluginItemInserted(PluginsItem *pluginItem) const;
void pluginItemRemoved(PluginsItem *pluginItem) const;

View File

@ -133,14 +133,11 @@ QString ProxyPluginController::itemKey(PluginsItemInterface *itemInter) const
void ProxyPluginController::itemAdded(PluginsItemInterface * const itemInter, const QString &itemKey)
{
m_pluginsItems << itemInter;
m_pluginsItemKeys[itemInter] = itemKey;
addPluginItems(itemInter, itemKey);
// 获取需要加载当前插件的监听者,然后将当前插件添加到监听者
QList<AbstractPluginsController *> validController = getValidController(itemInter);
for (AbstractPluginsController *interface : validController)
interface->itemAdded(itemInter, itemKey);
}
void ProxyPluginController::itemUpdate(PluginsItemInterface * const itemInter, const QString &itemKey)
@ -154,9 +151,10 @@ void ProxyPluginController::itemRemoved(PluginsItemInterface * const itemInter,
{
// 先获取可执行的controller再移除因为在判断当前插件是否加载的时候需要用到当前容器中的插件来获取当前代理
QList<AbstractPluginsController *> validController = getValidController(itemInter);
removePluginItem(itemInter);
for (AbstractPluginsController *interface : validController)
interface->itemRemoved(itemInter, itemKey);
removePluginItem(itemInter);
}
void ProxyPluginController::requestWindowAutoHide(PluginsItemInterface * const itemInter, const QString &itemKey, const bool autoHide)
@ -210,6 +208,15 @@ QList<AbstractPluginsController *> ProxyPluginController::getValidController(Plu
return validController;
}
void ProxyPluginController::addPluginItems(PluginsItemInterface * const itemInter, const QString &itemKey)
{
if (!m_pluginsItems.contains(itemInter))
m_pluginsItems << itemInter;
if (!m_pluginsItemKeys.contains(itemInter))
m_pluginsItemKeys[itemInter] = itemKey;
}
void ProxyPluginController::removePluginItem(PluginsItemInterface * const itemInter)
{
if (m_pluginsItems.contains(itemInter))

View File

@ -67,6 +67,7 @@ protected:
private:
QList<AbstractPluginsController *> getValidController(PluginsItemInterface *itemInter) const;
void addPluginItems(PluginsItemInterface * const itemInter, const QString &itemKey);
void removePluginItem(PluginsItemInterface * const itemInter);
void startLoader();

View File

@ -911,10 +911,13 @@ void MultiScreenWorker::onChildSizeChanged()
QSize dockSize = dockRect(m_ds.current(), position(), HideMode::KeepShowing, displayMode()).size();
parent()->move(dockRect(m_ds.current()).topLeft());
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) {
parent()->setFixedWidth(dockSize.width());
else
parent()->panel()->setFixedWidth(dockSize.width());
} else {
parent()->setFixedHeight(dockSize.height());
parent()->panel()->setFixedHeight(dockSize.height());
}
parent()->panel()->move(0, 0);
parent()->panel()->update();

View File

@ -1054,7 +1054,7 @@ QSize MainPanelControl::suitableSize(int screenSize, double deviceRatio) const
int iconSize = (totalLength - redundantLength) / iconCount;
if (m_position == Position::Top || m_position == Position::Bottom) {
iconSize = iconSize < height() ? iconSize : height();
iconSize = qMin(iconSize, height());
int panelWidth = qMin(iconSize * iconCount + static_cast<int>((m_fixedSpliter->width() + traySuitableSize.width() + 20) / ratio),
static_cast<int>(screenSize / deviceRatio));