mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-03 00:15:21 +00:00
fix: 修复日历图标数字显示有偏移的问题
在高分屏开1.5倍缩放,日历图片上的数字有偏移 Log: 修复日历图标数字显示有偏移的问题 Bug: https://pms.uniontech.com/zentao/bug-view-33865.html Change-Id: Ief4589cbc713c98ee503f414cce9ef5793dccad5
This commit is contained in:
parent
c607c4b00f
commit
f43195a892
@ -601,9 +601,9 @@ void AppItem::refreshIcon()
|
||||
const int iconSize = qMin(width(), height());
|
||||
|
||||
if (DockDisplayMode == Efficient)
|
||||
m_iconValid = ThemeAppIcon::getIcon(m_appIcon, icon, iconSize * 0.7, devicePixelRatioF(), !m_iconValid);
|
||||
m_iconValid = ThemeAppIcon::getIcon(m_appIcon, icon, iconSize * 0.7, !m_iconValid);
|
||||
else
|
||||
m_iconValid = ThemeAppIcon::getIcon(m_appIcon, icon, iconSize * 0.8, devicePixelRatioF(), !m_iconValid);
|
||||
m_iconValid = ThemeAppIcon::getIcon(m_appIcon, icon, iconSize * 0.8, !m_iconValid);
|
||||
|
||||
if (!m_refershIconTimer->isActive() && m_itemEntryInter->icon() == "dde-calendar") {
|
||||
m_refershIconTimer->start();
|
||||
|
@ -52,9 +52,9 @@ void LauncherItem::refreshIcon()
|
||||
{
|
||||
const int iconSize = qMin(width(), height());
|
||||
if (DockDisplayMode == Efficient) {
|
||||
ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.7, devicePixelRatioF());
|
||||
ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.7);
|
||||
} else {
|
||||
ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.8, devicePixelRatioF());
|
||||
ThemeAppIcon::getIcon(m_icon, "deepin-launcher", iconSize * 0.8);
|
||||
}
|
||||
|
||||
update();
|
||||
|
@ -25,12 +25,13 @@
|
||||
#include <QWidget>
|
||||
#include <QPixmap>
|
||||
#include <QSvgRenderer>
|
||||
#include <QApplication>
|
||||
|
||||
class ImageUtil
|
||||
{
|
||||
public:
|
||||
static const QPixmap loadSvg(const QString &iconName, const QString &localPath, const int size, const qreal ratio);
|
||||
static const QPixmap loadSvg(const QString &iconName, const QSize size, const qreal ratio);
|
||||
static const QPixmap loadSvg(const QString &iconName, const QSize size, const qreal ratio = qApp->devicePixelRatio());
|
||||
};
|
||||
|
||||
#endif // IMAGEUTIL_H
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QDate>
|
||||
#include <QPainter>
|
||||
|
||||
#include <private/qguiapplication_p.h>
|
||||
#include <private/qiconloader_p.h>
|
||||
@ -68,66 +69,43 @@ QIcon ThemeAppIcon::getIcon(const QString &name)
|
||||
return icon;
|
||||
}
|
||||
|
||||
bool ThemeAppIcon::getIcon(QPixmap &pix, const QString iconName, const int size, const qreal ratio, bool reObtain)
|
||||
bool ThemeAppIcon::getIcon(QPixmap &pix, const QString iconName, const int size, bool reObtain)
|
||||
{
|
||||
QString key;
|
||||
QIcon icon;
|
||||
bool ret = true;
|
||||
// 把size改为小于size的最大偶数 :)
|
||||
const int s = int(size * ratio) & ~1;
|
||||
const float iconZoom = size / 64.0 * 0.8;
|
||||
const int s = int(size * qApp->devicePixelRatio()) & ~1;
|
||||
|
||||
if (iconName == "dde-calendar") {
|
||||
const double iconZoom = s / 256.0;
|
||||
QDate const date(QDate::currentDate());
|
||||
|
||||
auto calendar = new QWidget() ;
|
||||
calendar->setFixedSize(s, s);
|
||||
QPixmap pixmap(":/indicator/resources/calendar_bg.svg");
|
||||
pixmap = pixmap.scaled(s, s, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||
|
||||
calendar->setAutoFillBackground(true);
|
||||
QPalette palette = calendar->palette();
|
||||
palette.setBrush(QPalette::Window,
|
||||
QBrush(QPixmap(":/indicator/resources/calendar_bg.svg").scaled(
|
||||
calendar->size(),
|
||||
Qt::IgnoreAspectRatio,
|
||||
Qt::SmoothTransformation)));
|
||||
calendar->setPalette(palette);
|
||||
QPainter painter(&pixmap);
|
||||
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform);
|
||||
|
||||
QVBoxLayout *layout = new QVBoxLayout;
|
||||
layout->setSpacing(0);
|
||||
auto month = new QLabel();
|
||||
auto monthPix = ImageUtil::loadSvg(QString(":/icons/resources/month%1.svg").arg(date.month()), QSize(36, 16)*iconZoom, ratio);
|
||||
month->setPixmap(monthPix.scaled(monthPix.width()*ratio,monthPix.height()*ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||
month->setFixedHeight(month->pixmap()->height());
|
||||
month->setAlignment(Qt::AlignCenter);
|
||||
month->setFixedWidth(s - 5 * iconZoom);
|
||||
layout->addWidget(month, Qt::AlignVCenter);
|
||||
//根据不同日期显示不同日历图表
|
||||
int tw = pixmap.rect().width();
|
||||
int th = pixmap.rect().height();
|
||||
int tx = pixmap.rect().x();
|
||||
int ty = pixmap.rect().y();
|
||||
|
||||
auto day = new QLabel();
|
||||
auto dayPix =ImageUtil::loadSvg(QString(":/icons/resources/day%1.svg").arg(date.day()), QSize(32, 30)*iconZoom, ratio);
|
||||
day->setPixmap(dayPix.scaled(dayPix.width()*ratio,dayPix.height()*ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||
day->setAlignment(Qt::AlignCenter);
|
||||
day->setFixedHeight(day->pixmap()->height()/ratio);
|
||||
day->raise();
|
||||
layout->addWidget(day, Qt::AlignVCenter);
|
||||
//绘制月份
|
||||
QRectF rcMonth(tx + (tw / 3.4), ty + (th / 5.4), 80 * iconZoom, 40 * iconZoom);
|
||||
painter.drawPixmap(rcMonth.topLeft(), ImageUtil::loadSvg(QString(":/icons/resources/month%1.svg").arg(date.month()), rcMonth.size().toSize()));
|
||||
//绘制日
|
||||
QRectF rcDay(tx + (tw / 3.5), ty + th / 3.1, 112 * iconZoom, 104 * iconZoom);
|
||||
painter.drawPixmap(rcDay.topLeft(), ImageUtil::loadSvg(QString(":/icons/resources/day%1.svg").arg(date.day()), rcDay.size().toSize()));
|
||||
//绘制周
|
||||
QRectF rcWeek(tx + (tw / 2.3), ty + ((th / 3.9) * 2.8), 56 * iconZoom, 24 * iconZoom);
|
||||
painter.drawPixmap(rcWeek.topLeft(), ImageUtil::loadSvg(QString(":/icons/resources/week%1.svg").arg(date.dayOfWeek()), rcWeek.size().toSize()));
|
||||
|
||||
auto week = new QLabel();
|
||||
auto weekPix = ImageUtil::loadSvg(QString(":/icons/resources/week%1.svg").arg(date.dayOfWeek()), QSize(26, 13)*iconZoom, ratio);
|
||||
week->setPixmap(weekPix.scaled(weekPix.width()*ratio,weekPix.height()*ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||
week->setFixedHeight(week->pixmap()->height());
|
||||
week->setAlignment(Qt::AlignCenter);
|
||||
week->setFixedWidth(s + 5 * iconZoom);
|
||||
layout->addWidget(week, Qt::AlignVCenter);
|
||||
layout->setSpacing(0);
|
||||
layout->setContentsMargins(0, 10 * iconZoom, 0, 10 * iconZoom);
|
||||
calendar->setLayout(layout);
|
||||
pix = calendar->grab(calendar->rect());
|
||||
pix = pixmap;
|
||||
pix.setDevicePixelRatio(qApp->devicePixelRatio());
|
||||
|
||||
delete calendar;
|
||||
calendar = nullptr;
|
||||
|
||||
if (pix.size().width() != s) {
|
||||
pix = pix.scaled(s, s, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -194,7 +172,7 @@ bool ThemeAppIcon::getIcon(QPixmap &pix, const QString iconName, const int size,
|
||||
if (pix.size().width() != s) {
|
||||
pix = pix.scaled(s, s, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||
}
|
||||
pix.setDevicePixelRatio(ratio);
|
||||
pix.setDevicePixelRatio(qApp->devicePixelRatio());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ public:
|
||||
~ThemeAppIcon();
|
||||
|
||||
static QIcon getIcon(const QString &name);
|
||||
static bool getIcon(QPixmap &pix, const QString iconName, const int size, const qreal ratio, bool reObtain = false);
|
||||
static bool getIcon(QPixmap &pix, const QString iconName, const int size, bool reObtain = false);
|
||||
};
|
||||
|
||||
#endif // THEMEAPPICON_H
|
||||
|
@ -542,7 +542,7 @@ QPixmap SNITrayWidget::newIconPixmap(IconType iconType)
|
||||
// so, it should be the last fallback
|
||||
if (!iconName.isEmpty()) {
|
||||
// ThemeAppIcon::getIcon 会处理高分屏缩放问题
|
||||
ThemeAppIcon::getIcon(pixmap, iconName, IconSize, devicePixelRatioF());
|
||||
ThemeAppIcon::getIcon(pixmap, iconName, IconSize);
|
||||
if (!pixmap.isNull()) {
|
||||
break;
|
||||
}
|
||||
|
@ -45,17 +45,17 @@ TEST_F(Ut_ThemeAppIcon, getIcon_test)
|
||||
{
|
||||
ThemeAppIcon appIcon;
|
||||
QPixmap pix1;
|
||||
appIcon.getIcon(pix1, "", 50, 1.0);
|
||||
appIcon.getIcon(pix1, "", 50);
|
||||
ASSERT_FALSE(pix1.isNull());
|
||||
|
||||
QPixmap pix;
|
||||
appIcon.getIcon(pix, "dde-calendar", 50, 1.0);
|
||||
appIcon.getIcon(pix, "dde-calendar", 50);
|
||||
|
||||
QPixmap pix2;
|
||||
appIcon.getIcon(pix2, "data:image/test", 50, 1.0);
|
||||
appIcon.getIcon(pix2, "data:image/test", 50);
|
||||
ASSERT_FALSE(pix2.isNull());
|
||||
|
||||
QPixmap pix3;
|
||||
appIcon.getIcon(pix3, ":/res/all_settings_on.png", 50, 1.0);
|
||||
appIcon.getIcon(pix3, ":/res/all_settings_on.png", 50);
|
||||
ASSERT_FALSE(pix3.isNull());
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user