fix: 修复移除蓝牙设备后任务栏插件不消失的问题

1、任务栏插件显示区域移除对配置变化的响应,该功能已经在DockPluginController中实现
2、在配置变化的时候,判断插件是否可以加载的条件增加了判断该插件是否被加载
3、修复拖动快捷面板的问题

Log: 修复移除蓝牙设备后任务栏插件不消失的问题
Influence: 插上蓝牙,从控制中心勾选该插件,在任务栏显示,然后移除蓝牙设备,观察任务栏的蓝牙图标是否消失
Bug: https://pms.uniontech.com/bug-view-181945.html
Change-Id: Ib207f4f0e2ceeb4b100c57b1f3e3899a802b8ed7
This commit is contained in:
donghualin 2023-01-16 17:07:04 +08:00
parent c42340387e
commit 1be68d06b2
6 changed files with 20 additions and 59 deletions

View File

@ -50,4 +50,6 @@ private:
bool m_useSourcePixmap;
};
Q_DECLARE_INTERFACE(QuickIconDrag, "QuickIconDrag")
#endif // QUICKDRAGCORE_H

View File

@ -121,39 +121,6 @@ void QuickPluginModel::onPluginRemoved(PluginsItemInterface *itemInter)
Q_EMIT requestUpdate();
}
void QuickPluginModel::onSettingChanged(const QString &key, const QVariant &value)
{
if (key != PLUGINNAMEKEY)
return;
QStringList localOrder = m_dockedPluginIndex.keys();
std::sort(localOrder.begin(), localOrder.end(), [ = ](const QString &key1, const QString &key2) {
return m_dockedPluginIndex.value(key1) < m_dockedPluginIndex.value(key2);
});
if (localOrder == value.toStringList())
return;
// 当配置发生变化的时候,更新任务栏的插件显示
// 1、将当前现有的插件列表中不在配置中的插件移除
localOrder = value.toStringList();
for (PluginsItemInterface *itemInter : m_dockedPluginsItems) {
if (localOrder.contains(itemInter->pluginName()))
continue;
m_dockedPluginsItems.removeOne(itemInter);
m_dockedPluginIndex.remove(itemInter->pluginName());
}
// 2、将配置中已有的但是插件列表中没有的插件移动到任务栏上
QList<PluginsItemInterface *> plugins = QuickSettingController::instance()->pluginItems(QuickSettingController::PluginAttribute::Quick);
for (PluginsItemInterface *plugin : plugins)
m_dockedPluginsItems << plugin;
m_dockedPluginIndex.clear();
for (int i = 0; i < localOrder.size(); i++)
m_dockedPluginIndex[localOrder[i]] = i;
Q_EMIT requestUpdate();
}
void QuickPluginModel::initConnection()
{
QuickSettingController *quickController = QuickSettingController::instance();
@ -179,7 +146,6 @@ void QuickPluginModel::initConnection()
connect(quickController, &QuickSettingController::pluginRemoved, this, &QuickPluginModel::onPluginRemoved);
connect(quickController, &QuickSettingController::pluginUpdated, this, &QuickPluginModel::requestUpdatePlugin);
connect(SETTINGCONFIG, &SettingConfig::valueChanged, this, &QuickPluginModel::onSettingChanged);
}
void QuickPluginModel::initConfig()

View File

@ -54,7 +54,6 @@ protected:
private Q_SLOTS:
void onPluginRemoved(PluginsItemInterface *itemInter);
void onSettingChanged(const QString &key, const QVariant &value);
private:
void initConnection();

View File

@ -306,7 +306,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event)
m_dragEnterMimeData = nullptr;
QDropEvent *dropEvent = static_cast<QDropEvent *>(event);
if (isQuickWindow(dropEvent->source())) {
const QuickPluginMimeData *mimeData = qobject_cast<const QuickPluginMimeData *>(dropEvent->mimeData());
QuickPluginMimeData *mimeData = static_cast<QuickPluginMimeData *>(const_cast<QMimeData *>(dropEvent->mimeData()));
if (mimeData)
dragPlugin(mimeData->pluginItemInterface());
}
@ -320,7 +320,7 @@ bool QuickPluginWindow::eventFilter(QObject *watched, QEvent *event)
void QuickPluginWindow::dragEnterEvent(QDragEnterEvent *event)
{
m_dragEnterMimeData = const_cast<QuickPluginMimeData *>(qobject_cast<const QuickPluginMimeData *>(event->mimeData()));
m_dragEnterMimeData = static_cast<QuickPluginMimeData *>(const_cast<QMimeData *>(event->mimeData()));
if (m_dragEnterMimeData) {
PluginsItemInterface *plugin = m_dragEnterMimeData->pluginItemInterface();
QIcon icon = plugin->icon(DockPart::QuickShow);

View File

@ -673,7 +673,21 @@ bool DockPluginController::pluginCanDock(const QStringList &config, PluginsItemI
|| (plugin->flags() & PluginFlag::Type_Tray))
return true;
// 3、插件已经驻留在任务栏则始终显示
// 3、如果该插件并未加载未调用itemAdde或已经调用itemRemoved),则该插件不显示
if (!m_pluginsMap.contains(plugin))
return false;
const QMap<QString, QObject *> &pluginMap = m_pluginsMap[plugin];
// 如果不包含PLUGININFO说明该插件从未调用itemAdded方法无需加载
if (!pluginMap.contains(PLUGININFO))
return false;
// 如果该插件信息的m_loaded为true,说明已经调用过itemAdded方法并且之后又调用了itemRemoved方法,则插件也无需加载
PluginInfo *pluginInfo = static_cast<PluginInfo *>(pluginMap[PLUGININFO]);
if (!pluginInfo->m_loaded)
return false;
// 4、插件已经驻留在任务栏则始终显示
return config.contains(plugin->pluginName());
}

View File

@ -69,27 +69,7 @@ PluginsItemInterface *QuickSettingItem::pluginItem() const
const QPixmap QuickSettingItem::dragPixmap()
{
QPixmap pluginPixmap = m_pluginInter->icon(DockPart::QuickPanel, DGuiApplicationHelper::instance()->themeType()).pixmap(ICONWIDTH, ICONHEIGHT);
QPainter foregroundPainter(&pluginPixmap);
foregroundPainter.setPen(foregroundColor());
foregroundPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
foregroundPainter.fillRect(pluginPixmap.rect(), foregroundColor());
QPixmap pixmapDrag(ICONWIDTH + ICONSPACE + FONTSIZE * 2, ICONHEIGHT + ICONSPACE + FONTSIZE * 2);
pixmapDrag.fill(Qt::transparent);
QPainter painter(&pixmapDrag);
painter.drawPixmap(QPoint((ICONSPACE + FONTSIZE * 2) / 2, 0), pluginPixmap);
painter.setPen(foregroundPainter.pen());
QFont font;
font.setPixelSize(FONTSIZE);
painter.setFont(font);
QTextOption option;
option.setAlignment(Qt::AlignTop | Qt::AlignHCenter);
painter.drawText(QRect(QPoint(0, ICONHEIGHT + ICONSPACE),
QPoint(pixmapDrag.width(), pixmapDrag.height())), m_pluginInter->pluginDisplayName(), option);
return pixmapDrag;
return grab();
}
const QString QuickSettingItem::itemKey() const