diff --git a/frame/window/components/datetimedisplayer.cpp b/frame/window/components/datetimedisplayer.cpp index dccd0b5f7..a78bcf6cf 100644 --- a/frame/window/components/datetimedisplayer.cpp +++ b/frame/window/components/datetimedisplayer.cpp @@ -35,6 +35,7 @@ DateTimeDisplayer::DateTimeDisplayer(bool showMultiRow, QWidget *parent) , m_timedateInter(new Timedate("org.deepin.dde.Timedate1", "/org/deepin/dde/Timedate1", QDBusConnection::sessionBus(), this)) , m_position(Dock::Position::Bottom) , m_dateFont(DFontSizeManager::instance()->t10()) + , m_timeFont(timeFont()) , m_tipsWidget(new Dock::TipsWidget(this)) , m_menu(new QMenu(this)) , m_tipsTimer(new QTimer(this)) @@ -195,28 +196,30 @@ DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo(const Dock::Posi info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, textWidth, DATETIMESIZE / 2); return info; } - int timeWidth = QFontMetrics(timeFont()).boundingRect(info.m_time).width(); - int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width(); + int timeWidth = QFontMetrics(m_timeFont).boundingRect(info.m_time).width() + 2; + int dateWidth = QFontMetrics(m_dateFont).boundingRect(info.m_date).width() + 2; + + int rHeight = height(); // 如果是上下方向 if (m_showMultiRow) { // 日期时间多行显示(一般是高效模式下,向下和向上偏移2个像素) - info.m_timeRect = QRect(0, 2, timeWidth, height() / 2); - info.m_dateRect = QRect(0, height() / 2 -2, dateWidth, height() / 2); + info.m_timeRect = QRect(0, 2, timeWidth, rHeight / 2); + info.m_dateRect = QRect(0, rHeight / 2 -2, dateWidth, rHeight / 2); } else { // 3:时间和日期3部分间隔 if (rect().width() > (ITEMSPACE * 3 + timeWidth + dateWidth)) { - info.m_timeRect = QRect(ITEMSPACE, 0, timeWidth, height()); + info.m_timeRect = QRect(ITEMSPACE, 0, timeWidth, rHeight); int dateX = info.m_timeRect.right() + (rect().width() -(ITEMSPACE * 2 + timeWidth + dateWidth)); - info.m_dateRect = QRect(dateX, 0, dateWidth, height()); + info.m_dateRect = QRect(dateX, 0, dateWidth, rHeight); } else { // 宽度不满足间隔为ITEMSPACE的,需要自己计算间隔。 int itemSpace = (rect().width() - timeWidth - dateWidth) / 3; - info.m_timeRect = QRect(itemSpace, 0, timeWidth, height()); + info.m_timeRect = QRect(itemSpace, 0, timeWidth, rHeight); int dateX = info.m_timeRect.right() + itemSpace; - info.m_dateRect = QRect(dateX, 0, dateWidth, height()); + info.m_dateRect = QRect(dateX, 0, dateWidth, rHeight); } } @@ -262,19 +265,17 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e) int timeAlignFlag = Qt::AlignCenter; int dateAlignFlag = Qt::AlignCenter; - QFont strTimeFont = timeFont(); - if (m_showMultiRow) { timeAlignFlag = Qt::AlignHCenter | Qt::AlignBottom; dateAlignFlag = Qt::AlignHCenter | Qt::AlignTop; } else { - if (strTimeFont.pixelSize() >= rect().height()) { - strTimeFont.setPixelSize(rect().height() - 2); + if (m_timeFont.pixelSize() >= rect().height()) { + m_timeFont.setPixelSize(rect().height() - 2); m_dateFont.setPixelSize(rect().height() - 2); } } - painter.setFont(strTimeFont); + painter.setFont(m_timeFont); painter.drawText(textRect(info.m_timeRect), timeAlignFlag, info.m_time); painter.setFont(m_dateFont); painter.drawText(textRect(info.m_dateRect), dateAlignFlag, info.m_date); @@ -315,18 +316,20 @@ QFont DateTimeDisplayer::timeFont() const if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) return DFontSizeManager::instance()->t6(); -#define MINHEIGHT 40 + static constexpr int MINHEIGHT = 40; // 如果是上下方向,且当前只有一行,则始终显示小号字体 - if (m_oneRow || rect().height() <= MINHEIGHT) + if (m_oneRow && ( Dock::Position::Top == m_position || Dock::Position::Bottom == m_position )) { return DFontSizeManager::instance()->t10(); + } - static QList dateFontSize = { DFontSizeManager::instance()->t10(), - DFontSizeManager::instance()->t9(), - DFontSizeManager::instance()->t8(), - DFontSizeManager::instance()->t7() }; - - int index = qMin(qMax(static_cast((rect().height() - MINHEIGHT) / 3), 0), dateFontSize.size() - 1); + QList dateFontSize = { DFontSizeManager::instance()->t7(), + DFontSizeManager::instance()->t6(), + DFontSizeManager::instance()->t5(), + DFontSizeManager::instance()->t4() }; + + // dock size >= 70 get max font(t4) size + int index = qMin(qMax(((rect().height() - MINHEIGHT) / 10), 0), dateFontSize.size() - 1); return dateFontSize[index]; } @@ -403,3 +406,15 @@ QString DateTimeDisplayer::getTimeString() const { return getTimeString(m_position); } + +bool DateTimeDisplayer::event(QEvent *event) +{ + if (event->type() == QEvent::FontChange) { + m_dateFont = DFontSizeManager::instance()->t10(); + m_timeFont = timeFont(); + Q_EMIT requestUpdate(); + } else if (event->type() == QEvent::Resize) { + m_timeFont = timeFont(); + } + return QWidget::event(event); +} diff --git a/frame/window/components/datetimedisplayer.h b/frame/window/components/datetimedisplayer.h index d9ea8628c..9ade66560 100644 --- a/frame/window/components/datetimedisplayer.h +++ b/frame/window/components/datetimedisplayer.h @@ -50,6 +50,7 @@ protected: void paintEvent(QPaintEvent *e) override; void enterEvent(QEvent *event) override; void leaveEvent(QEvent *event) override; + bool event(QEvent *event) override; private: void updatePolicy(); @@ -75,6 +76,7 @@ private: Timedate *m_timedateInter; Dock::Position m_position; QFont m_dateFont; + QFont m_timeFont; Dock::TipsWidget *m_tipsWidget; QMenu *m_menu; QSharedPointer m_tipPopupWindow; diff --git a/frame/window/docktraywindow.cpp b/frame/window/docktraywindow.cpp index 36f762766..9f7789fc9 100644 --- a/frame/window/docktraywindow.cpp +++ b/frame/window/docktraywindow.cpp @@ -373,7 +373,8 @@ void DockTrayWindow::onUpdateComponentSize() case Dock::Position::Bottom: m_toolLineLabel->setFixedSize(SPLITERSIZE, height() * 0.6); m_showDesktopWidget->setFixedSize(FRONTSPACING, QWIDGETSIZE_MAX); - m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), QWIDGETSIZE_MAX); + // FIXME: in some cases, m_dateTimeWidget QWIDGETSIZE_MAX get a huge height. + m_dateTimeWidget->setFixedSize(m_dateTimeWidget->suitableSize().width(), qMin(QWIDGETSIZE_MAX, this->height())); m_systemPuginWidget->setFixedSize(m_systemPuginWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_quickIconWidget->setFixedSize(m_quickIconWidget->suitableSize().width(), QWIDGETSIZE_MAX); m_trayView->setFixedSize(m_trayView->suitableSize().width(), QWIDGETSIZE_MAX);