fix: datetime font size error

make font size adjusted by height or width not follow system font size

log: as title
This commit is contained in:
tsic404 2023-08-30 16:05:02 +08:00 committed by deepin-bot[bot]
parent 3cbb828863
commit 7ed222aadb
3 changed files with 51 additions and 43 deletions

View File

@ -19,6 +19,7 @@
#include <QMenu> #include <QMenu>
#include <QPainterPath> #include <QPainterPath>
#include <QMouseEvent> #include <QMouseEvent>
#include <QFontMetrics>
DWIDGET_USE_NAMESPACE DWIDGET_USE_NAMESPACE
DGUI_USE_NAMESPACE DGUI_USE_NAMESPACE
@ -34,8 +35,8 @@ DateTimeDisplayer::DateTimeDisplayer(bool showMultiRow, QWidget *parent)
: QWidget (parent) : QWidget (parent)
, m_timedateInter(new Timedate("org.deepin.dde.Timedate1", "/org/deepin/dde/Timedate1", QDBusConnection::sessionBus(), this)) , m_timedateInter(new Timedate("org.deepin.dde.Timedate1", "/org/deepin/dde/Timedate1", QDBusConnection::sessionBus(), this))
, m_position(Dock::Position::Bottom) , m_position(Dock::Position::Bottom)
, m_dateFont(DFontSizeManager::instance()->t10()) , m_dateFont(QFont())
, m_timeFont(timeFont()) , m_timeFont(QFont())
, m_tipsWidget(new Dock::TipsWidget(this)) , m_tipsWidget(new Dock::TipsWidget(this))
, m_menu(new QMenu(this)) , m_menu(new QMenu(this))
, m_tipsTimer(new QTimer(this)) , m_tipsTimer(new QTimer(this))
@ -197,8 +198,12 @@ DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo(const Dock::Posi
// 如果是左右方向 // 如果是左右方向
if (position == Dock::Position::Left || position == Dock::Position::Right) { if (position == Dock::Position::Left || position == Dock::Position::Right) {
int textWidth = rect().width(); int textWidth = rect().width();
info.m_timeRect = QRect(0, 0, textWidth, DATETIMESIZE / 2);
info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, textWidth, DATETIMESIZE / 2); int timeHeight = QFontMetrics(m_timeFont).boundingRect(info.m_time).height() * (info.m_time.count('\n') + 1);
int dateHeight = QFontMetrics(m_dateFont).boundingRect(info.m_date).height();
info.m_timeRect = QRect(0, 0, textWidth, timeHeight);
info.m_dateRect = QRect(0, timeHeight, textWidth, dateHeight);
return info; return info;
} }
int timeWidth = QFontMetrics(m_timeFont).boundingRect(info.m_time).width() + 2; int timeWidth = QFontMetrics(m_timeFont).boundingRect(info.m_time).width() + 2;
@ -265,7 +270,7 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e)
QPainter painter(this); QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(QPen(palette().brightText(), 1));
int timeAlignFlag = Qt::AlignCenter; int timeAlignFlag = Qt::AlignCenter;
int dateAlignFlag = Qt::AlignCenter; int dateAlignFlag = Qt::AlignCenter;
@ -273,16 +278,14 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e)
if (m_showMultiRow) { if (m_showMultiRow) {
timeAlignFlag = Qt::AlignHCenter | Qt::AlignBottom; timeAlignFlag = Qt::AlignHCenter | Qt::AlignBottom;
dateAlignFlag = Qt::AlignHCenter | Qt::AlignTop; dateAlignFlag = Qt::AlignHCenter | Qt::AlignTop;
} else {
if (m_timeFont.pixelSize() >= rect().height()) {
m_timeFont.setPixelSize(rect().height() - 2);
m_dateFont.setPixelSize(rect().height() - 2);
}
} }
painter.setFont(m_timeFont); painter.setFont(m_timeFont);
painter.setPen(QPen(palette().brightText(), 2));
painter.drawText(textRect(info.m_timeRect), timeAlignFlag, info.m_time); painter.drawText(textRect(info.m_timeRect), timeAlignFlag, info.m_time);
painter.setFont(m_dateFont); painter.setFont(m_dateFont);
painter.setPen(QPen(palette().brightText(), 1));
painter.drawText(textRect(info.m_dateRect), dateAlignFlag, info.m_date); painter.drawText(textRect(info.m_dateRect), dateAlignFlag, info.m_date);
updateLastData(info); updateLastData(info);
@ -316,26 +319,36 @@ QPoint DateTimeDisplayer::tipsPoint() const
return window()->mapToGlobal(pointInTopWidget); return window()->mapToGlobal(pointInTopWidget);
} }
QFont DateTimeDisplayer::timeFont() const void DateTimeDisplayer::updateFont() const
{ {
if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) auto info = getTimeString(m_position);
return DFontSizeManager::instance()->t6(); // "xx:xx\nAP" 获取到前 xx:xx 部分
info = info.left(info.indexOf('\n'));
static constexpr int MINHEIGHT = 40; if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) {
auto f = QFont();
// 如果是上下方向,且当前只有一行,则始终显示小号字体 bool caled = false;
if (m_oneRow && ( Dock::Position::Top == m_position || Dock::Position::Bottom == m_position )) { f.setPixelSize(100);
return DFontSizeManager::instance()->t10(); // 左右时根据获取可以全部显示文本的最小的宽度, 且最大只到40
while(width() > 0 && f.pixelSize() > 2 &&
(QFontMetrics(f).boundingRect(info).width() > qMin(DATETIMESIZE, width()) - 4)) {
f.setPixelSize(f.pixelSize() - 1);
caled = true;
}
// 经过正确的计算后才能更新字体大小
if (caled) {
m_timeFont.setPixelSize(f.pixelSize());
m_dateFont.setPixelSize(f.pixelSize() - 2);
}
return;
} }
QList<QFont> dateFontSize = { DFontSizeManager::instance()->t8(), if ((Dock::Position::Top == m_position || Dock::Position::Bottom == m_position )) {
DFontSizeManager::instance()->t7(), // 单行时保持高度的一半双行时尽量和高度一致但最大只到12。
DFontSizeManager::instance()->t6(), auto s = height() / (m_oneRow ? 2 : 1) - 2;
DFontSizeManager::instance()->t5() }; m_timeFont.setPixelSize(std::min(s, 12));
// 双行时日期比时间字体小两个像素。
// dock size >= 70 get max font(t5) size m_dateFont.setPixelSize(std::min(s, 12) - (m_oneRow ? 0 : 2));
int index = qMin(qMax(((rect().height() - MINHEIGHT) / 10), 0), dateFontSize.size() - 1); }
return dateFontSize[index];
} }
void DateTimeDisplayer::createMenuItem() void DateTimeDisplayer::createMenuItem()
@ -396,6 +409,11 @@ void DateTimeDisplayer::leaveEvent(QEvent *event)
m_tipPopupWindow->hide(); m_tipPopupWindow->hide();
} }
QString DateTimeDisplayer::getTimeString() const
{
return getTimeString(m_position);
}
void DateTimeDisplayer::updateLastData(const DateTimeInfo &info) void DateTimeDisplayer::updateLastData(const DateTimeInfo &info)
{ {
m_lastDateString = info.m_date; m_lastDateString = info.m_date;
@ -407,20 +425,10 @@ void DateTimeDisplayer::updateLastData(const DateTimeInfo &info)
m_currentSize = dateTimeSize.height(); m_currentSize = dateTimeSize.height();
} }
QString DateTimeDisplayer::getTimeString() const
{
return getTimeString(m_position);
}
bool DateTimeDisplayer::event(QEvent *event) bool DateTimeDisplayer::event(QEvent *event)
{ {
if (event->type() == QEvent::FontChange) { if (event->type() == QEvent::Resize) {
m_dateFont = DFontSizeManager::instance()->t10(); updateFont();
m_timeFont = timeFont();
Q_EMIT requestUpdate();
} else if (event->type() == QEvent::Resize) {
m_dateFont = DFontSizeManager::instance()->t10();
m_timeFont = timeFont();
} }
return QWidget::event(event); return QWidget::event(event);
} }

View File

@ -57,13 +57,13 @@ private:
DateTimeInfo dateTimeInfo(const Dock::Position &position) const; DateTimeInfo dateTimeInfo(const Dock::Position &position) const;
void updateLastData(const DateTimeInfo &info); void updateLastData(const DateTimeInfo &info);
QString getTimeString() const; inline QString getTimeString() const;
QString getTimeString(const Dock::Position &position) const; QString getTimeString(const Dock::Position &position) const;
QString getDateString() const; inline QString getDateString() const;
QString getDateString(const Dock::Position &position) const; QString getDateString(const Dock::Position &position) const;
QPoint tipsPoint() const; QPoint tipsPoint() const;
QFont timeFont() const; void updateFont() const;
void createMenuItem(); void createMenuItem();
QRect textRect(const QRect &sourceRect) const; QRect textRect(const QRect &sourceRect) const;

View File

@ -182,7 +182,7 @@ int TrayManagerWindow::appDatetimeSize(const Dock::Position &position) const
int trayHeight = m_trayView->suitableSize(position).height(); int trayHeight = m_trayView->suitableSize(position).height();
int traypluginHeight = trayHeight + m_quickIconWidget->suitableSize(position).height() + m_appPluginLayout->spacing(); int traypluginHeight = trayHeight + m_quickIconWidget->suitableSize(position).height() + m_appPluginLayout->spacing();
return traypluginHeight + m_dateTimeWidget->suitableSize(position).height() + 10; return traypluginHeight + m_dateTimeWidget->suitableSize(position).height() + 2;
} }
QSize TrayManagerWindow::suitableSize() const QSize TrayManagerWindow::suitableSize() const