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"
},
"Dock_Quick_Tray_Name": {
"value": ["fcitx"],
"value": ["fcitx", "indicator:keybord_layout"],
"serial": 0,
"flags": [],
"name": "显示在任务栏上的托盘图标",

View File

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

View File

@ -42,6 +42,7 @@ BluetoothMainWidget::BluetoothMainWidget(AdaptersManager *adapterManager, QWidge
, m_nameLabel(new QLabel(this))
, m_stateLabel(new QLabel(this))
, m_expandLabel(new QLabel(this))
, m_mouseEnter(false)
{
initUi();
initConnection();
@ -66,8 +67,11 @@ bool BluetoothMainWidget::eventFilter(QObject *watcher, QEvent *event)
QPainterPath path;
path.addEllipse(ptCenter, size / 2 - 1, size / 2 - 1);
// 设置黑色背景色
QColor backColor(Qt::black);
backColor.setAlphaF(0.1);
QColor backColor = (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType ? Qt::black : Qt::white);
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.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);
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: {
bool status = !(isOpen());
for (const Adapter *adapter : m_adapterManager->adapters())
@ -115,10 +129,7 @@ void BluetoothMainWidget::initUi()
QFont nameFont = DFontSizeManager::instance()->t6();
nameFont.setBold(true);
QPalette pe;
pe.setColor(QPalette::WindowText, Qt::black);
m_nameLabel->setParent(textWidget);
m_nameLabel->setPalette(pe);
m_nameLabel->setFont(nameFont);
m_stateLabel->setParent(textWidget);

View File

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

View File

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

View File

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

View File

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