fix: 修复图标异常问题

1、修复拖动过程中组合图标尺寸显示异常的问题
2、修复从控制中心设置插件显示隐藏引起的异常问题
3、修复高缩放率下的组合图标显示异常问题
4、修复蓝牙面板在不同的主题下颜色的显示的问题
5、社区版键盘布局默认在任务栏显示

Log: 修复图标显示的问题
Influence: 高缩放率下,观察组合图标显示是否正常
Bug: https://pms.uniontech.com/bug-view-181723.html
Change-Id: Id351063095a2290731876ce896c2cd05a32d4ec0
This commit is contained in:
donghualin 2023-01-14 16:41:35 +08:00
parent bdd4c4b722
commit 9b6d09ffab
7 changed files with 60 additions and 35 deletions

View File

@ -27,7 +27,7 @@
"visibility": "private" "visibility": "private"
}, },
"Dock_Quick_Tray_Name": { "Dock_Quick_Tray_Name": {
"value": ["fcitx"], "value": ["fcitx", "indicator:keybord_layout"],
"serial": 0, "serial": 0,
"flags": [], "flags": [],
"name": "显示在任务栏上的托盘图标", "name": "显示在任务栏上的托盘图标",

View File

@ -837,14 +837,10 @@ void QuickDockItem::paintEvent(QPaintEvent *event)
if (pixmap.isNull()) if (pixmap.isNull())
return QWidget::paintEvent(event); return QWidget::paintEvent(event);
QSize size = pixmap.size();
QRect pixmapRect = QRect(QPoint((rect().width() - size.width()) / 2, (rect().height() - size.height()) / 2), pixmap.size());
pixmap.setDevicePixelRatio(qApp->devicePixelRatio()); pixmap.setDevicePixelRatio(qApp->devicePixelRatio());
if (m_pluginItem->pluginSizePolicy() == PluginsItemInterface::PluginSizePolicy::System) { QSize size = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? pixmap.size() / qApp->devicePixelRatio(): pixmap.size();
size = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size / qApp->devicePixelRatio(): size; QRect pixmapRect = QRect(QPoint((rect().width() - size.width()) / 2, (rect().height() - size.height()) / 2), size);
pixmapRect = QRect(QPoint((rect().width() - size.width()) / 2, (rect().height() - size.height()) / 2), size);
}
painter.drawPixmap(pixmapRect, pixmap); painter.drawPixmap(pixmapRect, pixmap);
} }

View File

@ -42,6 +42,7 @@ BluetoothMainWidget::BluetoothMainWidget(AdaptersManager *adapterManager, QWidge
, m_nameLabel(new QLabel(this)) , m_nameLabel(new QLabel(this))
, m_stateLabel(new QLabel(this)) , m_stateLabel(new QLabel(this))
, m_expandLabel(new QLabel(this)) , m_expandLabel(new QLabel(this))
, m_mouseEnter(false)
{ {
initUi(); initUi();
initConnection(); initConnection();
@ -66,8 +67,11 @@ bool BluetoothMainWidget::eventFilter(QObject *watcher, QEvent *event)
QPainterPath path; QPainterPath path;
path.addEllipse(ptCenter, size / 2 - 1, size / 2 - 1); path.addEllipse(ptCenter, size / 2 - 1, size / 2 - 1);
// 设置黑色背景色 // 设置黑色背景色
QColor backColor(Qt::black); QColor backColor = (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType ? Qt::black : Qt::white);
backColor.setAlphaF(0.1); if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType)
backColor.setAlphaF(m_mouseEnter ? 0.2 : 0.1);
else
backColor.setAlphaF(m_mouseEnter ? 0.1 : 0.2);
painter.setBrush(backColor); painter.setBrush(backColor);
painter.fillPath(path, backColor); painter.fillPath(path, backColor);
// 添加图标 // 添加图标
@ -81,6 +85,16 @@ bool BluetoothMainWidget::eventFilter(QObject *watcher, QEvent *event)
painter.drawPixmap(QPoint(ptCenter.x() - pixmap.size().width() / 2, ptCenter.y() - pixmap.size().height() / 2), pixmap); painter.drawPixmap(QPoint(ptCenter.x() - pixmap.size().width() / 2, ptCenter.y() - pixmap.size().height() / 2), pixmap);
return true; return true;
} }
case QEvent::Enter: {
m_mouseEnter = true;
m_iconWidget->update();
break;
}
case QEvent::Leave: {
m_mouseEnter = false;
m_iconWidget->update();
break;
}
case QEvent::MouseButtonRelease: { case QEvent::MouseButtonRelease: {
bool status = !(isOpen()); bool status = !(isOpen());
for (const Adapter *adapter : m_adapterManager->adapters()) for (const Adapter *adapter : m_adapterManager->adapters())
@ -115,10 +129,7 @@ void BluetoothMainWidget::initUi()
QFont nameFont = DFontSizeManager::instance()->t6(); QFont nameFont = DFontSizeManager::instance()->t6();
nameFont.setBold(true); nameFont.setBold(true);
QPalette pe;
pe.setColor(QPalette::WindowText, Qt::black);
m_nameLabel->setParent(textWidget); m_nameLabel->setParent(textWidget);
m_nameLabel->setPalette(pe);
m_nameLabel->setFont(nameFont); m_nameLabel->setFont(nameFont);
m_stateLabel->setParent(textWidget); m_stateLabel->setParent(textWidget);

View File

@ -59,6 +59,7 @@ private:
QLabel *m_nameLabel; QLabel *m_nameLabel;
QLabel *m_stateLabel; QLabel *m_stateLabel;
QLabel *m_expandLabel; QLabel *m_expandLabel;
bool m_mouseEnter;
}; };
#endif // BLUETOOTHMAINWIDGET_H #endif // BLUETOOTHMAINWIDGET_H

View File

@ -660,6 +660,12 @@ bool DockPluginController::eventFilter(QObject *object, QEvent *event)
} }
bool DockPluginController::pluginCanDock(PluginsItemInterface *plugin) const bool DockPluginController::pluginCanDock(PluginsItemInterface *plugin) const
{
const QStringList configPlugins = SETTINGCONFIG->value(DOCK_QUICK_PLUGINS).toStringList();
return pluginCanDock(configPlugins, plugin);
}
bool DockPluginController::pluginCanDock(const QStringList &config, PluginsItemInterface *plugin) const
{ {
// 1、如果插件是强制驻留任务栏则始终显示 // 1、如果插件是强制驻留任务栏则始终显示
// 2、如果插件是托盘插件例如U盘插件则始终显示 // 2、如果插件是托盘插件例如U盘插件则始终显示
@ -668,8 +674,7 @@ bool DockPluginController::pluginCanDock(PluginsItemInterface *plugin) const
return true; return true;
// 3、插件已经驻留在任务栏则始终显示 // 3、插件已经驻留在任务栏则始终显示
const QStringList configPlugins = SETTINGCONFIG->value(DOCK_QUICK_PLUGINS).toStringList(); return config.contains(plugin->pluginName());
return configPlugins.contains(plugin->pluginName());
} }
void DockPluginController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) void DockPluginController::updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part)
@ -687,13 +692,14 @@ void DockPluginController::onConfigChanged(const QString &key, const QVariant &v
// 这里只处理工具插件(回收站)和系统插件(电源插件) // 这里只处理工具插件(回收站)和系统插件(电源插件)
for (PluginsItemInterface *plugin : plugins()) { for (PluginsItemInterface *plugin : plugins()) {
QString itemKey = this->itemKey(plugin); QString itemKey = this->itemKey(plugin);
if (!pluginNames.contains(plugin->pluginName()) && isPluginLoaded(plugin)) { bool canDock = pluginCanDock(pluginNames, plugin);
if (!canDock && isPluginLoaded(plugin)) {
// 如果当前配置中不包含当前插件,但是当前插件已经加载,那么就移除该插件 // 如果当前配置中不包含当前插件,但是当前插件已经加载,那么就移除该插件
removePluginItem(plugin, itemKey); removePluginItem(plugin, itemKey);
QWidget *itemWidget = plugin->itemWidget(itemKey); QWidget *itemWidget = plugin->itemWidget(itemKey);
if (itemWidget) if (itemWidget)
itemWidget->setVisible(false); itemWidget->setVisible(false);
} else if (pluginNames.contains(plugin->pluginName()) && !isPluginLoaded(plugin)) { } else if (canDock && !isPluginLoaded(plugin)) {
// 如果当前配置中包含当前插件,但是当前插件并未加载,那么就加载该插件 // 如果当前配置中包含当前插件,但是当前插件并未加载,那么就加载该插件
addPluginItem(plugin, itemKey); addPluginItem(plugin, itemKey);
// 只有工具插件是通过QWidget的方式进行显示的因此这里只处理工具插件 // 只有工具插件是通过QWidget的方式进行显示的因此这里只处理工具插件

View File

@ -69,6 +69,7 @@ protected:
bool eventFilter(QObject *object, QEvent *event) override; bool eventFilter(QObject *object, QEvent *event) override;
bool pluginCanDock(PluginsItemInterface *plugin) const; bool pluginCanDock(PluginsItemInterface *plugin) const;
bool pluginCanDock(const QStringList &config, PluginsItemInterface *plugin) const;
void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override; void updateDockInfo(PluginsItemInterface * const itemInter, const DockPart &part) override;
private: private:

View File

@ -33,6 +33,8 @@
#define ITEMSPACE 6 #define ITEMSPACE 6
#define ITEMHEIGHT 16 #define ITEMHEIGHT 16
#define ITEMWIDTH 18 #define ITEMWIDTH 18
#define MINISIZE 1
#define STARTPOS 2
static QStringList pluginNames = {"power", "sound", "network"}; static QStringList pluginNames = {"power", "sound", "network"};
@ -84,34 +86,44 @@ QPixmap IconManager::pixmap(DGuiApplicationHelper::ColorType colorType) const
return pixmap; return pixmap;
} }
int itemSpace = 0;
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom)
itemSpace = (m_displayMode == Dock::DisplayMode::Efficient ? 8 : 10);
else
itemSpace = 2;
// 组合图标 // 组合图标
QPixmap pixmap; QPixmap pixmap;
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) {
// 高效模式下高度固定为30, 时尚模式下,高度随着任务栏的大小变化而变化 // 高效模式下高度固定为30, 时尚模式下,高度随着任务栏的大小变化而变化
int iconHeight = (m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.height() - 8); int iconHeight = (m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.height() - 8);
int iconWidth = ITEMSPACE; if (iconHeight <= 0)
iconHeight = MINISIZE;
int iconWidth = STARTPOS;
for (PluginsItemInterface *plugin : plugins) { for (PluginsItemInterface *plugin : plugins) {
QIcon icon = plugin->icon(DockPart::QuickShow); QIcon icon = plugin->icon(DockPart::QuickShow);
QSize iconSize(ITEMWIDTH, ITEMHEIGHT); QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio();
QList<QSize> iconSizes = icon.availableSizes(); QList<QSize> iconSizes = icon.availableSizes();
if (iconSizes.size() > 0) if (iconSizes.size() > 0)
iconSize = iconSizes.first() / qApp->devicePixelRatio(); iconSize = iconSizes.first();
iconWidth += iconSize.width() + ITEMSPACE; iconWidth += iconSize.width();
} }
iconWidth += ITEMSPACE; iconWidth += itemSpace * (plugins.size() - 1);
pixmap = QPixmap(iconWidth, iconHeight); pixmap = QPixmap(iconWidth, iconHeight);
} else { } else {
// 左右方向高效模式下宽度固定为30时尚模式下宽度随任务栏的大小变化而变化 // 左右方向高效模式下宽度固定为30时尚模式下宽度随任务栏的大小变化而变化
int iconWidth = m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.width() - 8; int iconWidth = m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.width() - 8;
int iconHeight = ITEMHEIGHT; if (iconWidth <= 0)
iconWidth = MINISIZE;
int iconHeight = STARTPOS;
for (PluginsItemInterface *plugin : plugins) { for (PluginsItemInterface *plugin : plugins) {
QIcon icon = plugin->icon(DockPart::QuickShow); QIcon icon = plugin->icon(DockPart::QuickShow);
QSize iconSize(ITEMWIDTH, ITEMHEIGHT); QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio();
QList<QSize> iconSizes = icon.availableSizes(); QList<QSize> iconSizes = icon.availableSizes();
if (iconSizes.size() > 0) if (iconSizes.size() > 0)
iconSize = iconSizes.first() / qApp->devicePixelRatio(); iconSize = iconSizes.first();
iconHeight += iconSize.height() + ITEMSPACE; iconHeight += iconSize.height();
} }
iconHeight += itemSpace * (plugins.size() - 1);
pixmap = QPixmap(iconWidth, iconHeight); pixmap = QPixmap(iconWidth, iconHeight);
} }
@ -119,7 +131,7 @@ QPixmap IconManager::pixmap(DGuiApplicationHelper::ColorType colorType) const
QPainter painter(&pixmap); QPainter painter(&pixmap);
painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing); painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing);
if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) {
int x = ITEMSPACE; int x = STARTPOS;
for (PluginsItemInterface *plugin : plugins) { for (PluginsItemInterface *plugin : plugins) {
QIcon icon = plugin->icon(DockPart::QuickShow); QIcon icon = plugin->icon(DockPart::QuickShow);
QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio(); QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio();
@ -127,24 +139,22 @@ QPixmap IconManager::pixmap(DGuiApplicationHelper::ColorType colorType) const
if (iconSizes.size() > 0) if (iconSizes.size() > 0)
iconSize = iconSizes.first(); iconSize = iconSizes.first();
QPixmap pixmapDraw = icon.pixmap(iconSize); QPixmap pixmapDraw = icon.pixmap(iconSize);
QSize realIconSize = iconSize / qApp->devicePixelRatio(); QRect rectPixmap(QPoint(x, (pixmap.height() - iconSize.height()) / 2), iconSize);
QRect rectPixmap(QPoint(x, (pixmap.height() - realIconSize.height()) / 2), realIconSize);
painter.drawPixmap(rectPixmap, pixmapDraw); painter.drawPixmap(rectPixmap, pixmapDraw);
x += ITEMWIDTH + ITEMSPACE; x += iconSize.width() + itemSpace;
} }
} else { } else {
int y = ITEMSPACE; int y = STARTPOS;
for (PluginsItemInterface *plugin : plugins) { for (PluginsItemInterface *plugin : plugins) {
QIcon icon = plugin->icon(DockPart::QuickShow); QIcon icon = plugin->icon(DockPart::QuickShow);
QSize iconSize(ITEMWIDTH, ITEMHEIGHT); QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio();
QList<QSize> iconSizes = icon.availableSizes(); QList<QSize> iconSizes = icon.availableSizes();
if (iconSizes.size() > 0) if (iconSizes.size() > 0)
iconSize = iconSizes.first() / qApp->devicePixelRatio(); iconSize = iconSizes.first();
QPixmap pixmapDraw = icon.pixmap(iconSize); QPixmap pixmapDraw = icon.pixmap(iconSize);
QRect rectPixmap(QPoint((pixmap.width() - ITEMWIDTH) / 2, y), iconSize); QRect rectPixmap(QPoint((pixmap.width() - iconSize.width()) / 2, y), iconSize);
painter.drawPixmap(rectPixmap, pixmapDraw); painter.drawPixmap(rectPixmap, pixmapDraw);
y += ITEMHEIGHT + ITEMSPACE; y += iconSize.height() + itemSpace;
} }
} }
painter.end(); painter.end();