From 81edbf000051de267e099cfe28ad1c4ab5db8fcb Mon Sep 17 00:00:00 2001 From: donghualin Date: Thu, 12 Jan 2023 22:13:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98=E7=BC=A9?= =?UTF-8?q?=E6=94=BE=E7=8E=87=E4=B8=8B=E6=8F=92=E4=BB=B6=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 高缩放率下,需要将图标按照缩放下的图标进行显示 Log: 优化高缩放率下插件图标显示异常 Influence: 高分屏,设置缩放率为最高,观察任务栏插件区域的图标显示是否正常 Bug: https://pms.uniontech.com/bug-view-183543.html Change-Id: I3087c87737a8624b906f9076351a952a2dec8452 --- frame/window/quickpluginwindow.cpp | 5 ++ plugins/onboard/onboarditem.cpp | 1 + plugins/pluginmanager/iconmanager.cpp | 68 ++++++++++++++++++--------- plugins/sound/soundwidget.cpp | 10 ++-- 4 files changed, 57 insertions(+), 27 deletions(-) diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index d349960d7..5ce16691b 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -839,7 +839,12 @@ void QuickDockItem::paintEvent(QPaintEvent *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); + } painter.drawPixmap(pixmapRect, pixmap); } diff --git a/plugins/onboard/onboarditem.cpp b/plugins/onboard/onboarditem.cpp index 442433192..b44eb0984 100644 --- a/plugins/onboard/onboarditem.cpp +++ b/plugins/onboard/onboarditem.cpp @@ -116,6 +116,7 @@ const QPixmap OnboardItem::loadSvg(const QString &fileName, const QSize &size) c QSize pixmapSize = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size : (size * ratio); QPixmap pixmap = QIcon::fromTheme(fileName, m_icon).pixmap(pixmapSize); pixmap.setDevicePixelRatio(ratio); + pixmap = pixmap.scaled(size * ratio); return pixmap; } diff --git a/plugins/pluginmanager/iconmanager.cpp b/plugins/pluginmanager/iconmanager.cpp index 5929d797f..563534ba9 100644 --- a/plugins/pluginmanager/iconmanager.cpp +++ b/plugins/pluginmanager/iconmanager.cpp @@ -87,41 +87,65 @@ QPixmap IconManager::pixmap(DGuiApplicationHelper::ColorType colorType) const // 组合图标 QPixmap pixmap; if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - if (m_displayMode == Dock::DisplayMode::Efficient) { - // 高效模式下,高度固定为30,圆角固定为8 - pixmap = QPixmap(ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1), 30); - } else { - // 时尚模式下,高度随着任务栏的大小变化而变化 - pixmap = QPixmap(ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1), m_size.height() - 8); + // 高效模式下,高度固定为30, 时尚模式下,高度随着任务栏的大小变化而变化 + int iconHeight = (m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.height() - 8); + int iconWidth = ITEMSPACE; + for (PluginsItemInterface *plugin : plugins) { + QIcon icon = plugin->icon(DockPart::QuickShow); + QSize iconSize(ITEMWIDTH, ITEMHEIGHT); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + iconSize = iconSizes.first() / qApp->devicePixelRatio(); + iconWidth += iconSize.width() + ITEMSPACE; } + iconWidth += ITEMSPACE; + pixmap = QPixmap(iconWidth, iconHeight); } else { - if (m_displayMode == Dock::DisplayMode::Efficient) { - // 高校模式下,宽度固定 - pixmap = QPixmap(30, ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1)); - } else { - pixmap = QPixmap(m_size.width() - 8, ITEMWIDTH * plugins.size() + ITEMSPACE * (plugins.size() + 1)); + // 左右方向,高效模式下,宽度固定为30,时尚模式下,宽度随任务栏的大小变化而变化 + int iconWidth = m_displayMode == Dock::DisplayMode::Efficient ? 30 : m_size.width() - 8; + int iconHeight = ITEMHEIGHT; + for (PluginsItemInterface *plugin : plugins) { + QIcon icon = plugin->icon(DockPart::QuickShow); + QSize iconSize(ITEMWIDTH, ITEMHEIGHT); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + iconSize = iconSizes.first() / qApp->devicePixelRatio(); + iconHeight += iconSize.height() + ITEMSPACE; } + pixmap = QPixmap(iconWidth, iconHeight); } pixmap.fill(Qt::transparent); QPainter painter(&pixmap); painter.setRenderHints(QPainter::SmoothPixmapTransform | QPainter::Antialiasing); if (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom) { - QPoint pointPixmap(ITEMSPACE, (pixmap.height() - ITEMHEIGHT) / 2); + int x = ITEMSPACE; for (PluginsItemInterface *plugin : plugins) { QIcon icon = plugin->icon(DockPart::QuickShow); - QPixmap pixmapDraw = icon.pixmap(ITEMHEIGHT, ITEMHEIGHT); - painter.drawPixmap(pointPixmap, pixmapDraw); - pointPixmap.setX(pointPixmap.x() + ITEMWIDTH + ITEMSPACE); + QSize iconSize = QSize(ITEMWIDTH, ITEMHEIGHT) * qApp->devicePixelRatio(); + QList iconSizes = icon.availableSizes(); + 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); + painter.drawPixmap(rectPixmap, pixmapDraw); + x += ITEMWIDTH + ITEMSPACE; } } else { - QPoint pointPixmap((pixmap.width() - ITEMWIDTH) / 2, ITEMSPACE); - for (PluginsItemInterface *plugin : plugins) { - QIcon icon = plugin->icon(DockPart::QuickShow); - QPixmap pixmapDraw = icon.pixmap(ITEMHEIGHT, ITEMHEIGHT); - painter.drawPixmap(pointPixmap, pixmapDraw); - pointPixmap.setY(pointPixmap.y() + ITEMWIDTH + ITEMSPACE); - } + int y = ITEMSPACE; + for (PluginsItemInterface *plugin : plugins) { + QIcon icon = plugin->icon(DockPart::QuickShow); + QSize iconSize(ITEMWIDTH, ITEMHEIGHT); + QList iconSizes = icon.availableSizes(); + if (iconSizes.size() > 0) + iconSize = iconSizes.first() / qApp->devicePixelRatio(); + + QPixmap pixmapDraw = icon.pixmap(iconSize); + QRect rectPixmap(QPoint((pixmap.width() - ITEMWIDTH) / 2, y), iconSize); + painter.drawPixmap(rectPixmap, pixmapDraw); + y += ITEMHEIGHT + ITEMSPACE; + } } painter.end(); return pixmap; diff --git a/plugins/sound/soundwidget.cpp b/plugins/sound/soundwidget.cpp index 878699b0e..7918fae9b 100644 --- a/plugins/sound/soundwidget.cpp +++ b/plugins/sound/soundwidget.cpp @@ -40,7 +40,7 @@ DGUI_USE_NAMESPACE -#define ICON_SIZE 24 +#define ICON_SIZE 18 #define BACKSIZE 36 SoundWidget::SoundWidget(QWidget *parent) @@ -68,7 +68,7 @@ void SoundWidget::initUi() QPixmap leftPixmap = ImageUtil::loadSvg(leftIcon(), QSize(ICON_SIZE, ICON_SIZE)); QPixmap rightPixmap = ImageUtil::loadSvg(rightIcon(), QSize(ICON_SIZE, ICON_SIZE)); - m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 12); + m_sliderContainer->setIcon(SliderContainer::IconPosition::LeftIcon, leftPixmap, QSize(), 10); m_sliderContainer->setIcon(SliderContainer::IconPosition::RightIcon, rightPixmap, QSize(BACKSIZE, BACKSIZE), 12); m_sliderContainer->setRange(0, std::round(m_dbusAudio->maxUIVolume() * 100.00)); m_sliderContainer->setPageStep(2); @@ -127,14 +127,14 @@ const QString SoundWidget::leftIcon() { const bool mute = existActiveOutputDevice() ? m_defaultSink->mute() : true; if (mute) - return QString(":/icons/resources/audio-volume-muted-dark"); + return QString(":/icons/resources/audio-volume-muted-dark.svg"); - return QString(":/icons/resources/volume"); + return QString(":/icons/resources/volume.svg"); } const QString SoundWidget::rightIcon() { - return QString(":/icons/resources/broadcast"); + return QString(":/icons/resources/broadcast.svg"); } /** 判断是否存在未禁用的声音输出设备