From 0584380b20f90f530b0e303664febd48a95c83a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=8D=9A=E6=96=87?= Date: Mon, 26 Jun 2017 15:20:16 +0800 Subject: [PATCH] datetime: add am/pm tips on 24 hour format Change-Id: I51affb6a5a59492cfd8804b3766a29d107d20aa5 --- frame/item/pluginsitem.cpp | 5 ++ frame/item/pluginsitem.h | 19 +++--- plugins/datetime/datetimeplugin.cpp | 3 +- plugins/datetime/datetimewidget.cpp | 69 ++++++++++++++++---- plugins/datetime/datetimewidget.h | 1 + plugins/datetime/resources.qrc | 2 + plugins/datetime/resources/icons/tips-am.svg | 46 +++++++++++++ plugins/datetime/resources/icons/tips-pm.svg | 46 +++++++++++++ 8 files changed, 168 insertions(+), 23 deletions(-) create mode 100755 plugins/datetime/resources/icons/tips-am.svg create mode 100755 plugins/datetime/resources/icons/tips-pm.svg diff --git a/frame/item/pluginsitem.cpp b/frame/item/pluginsitem.cpp index 85f71f51c..19fe5dfdb 100644 --- a/frame/item/pluginsitem.cpp +++ b/frame/item/pluginsitem.cpp @@ -79,6 +79,11 @@ void PluginsItem::setInContainer(const bool container) m_pluginInter->setItemIsInContainer(m_itemKey, container); } +QSize PluginsItem::sizeHint() const +{ + return m_centralWidget->sizeHint(); +} + void PluginsItem::refershIcon() { m_pluginInter->refershIcon(m_itemKey); diff --git a/frame/item/pluginsitem.h b/frame/item/pluginsitem.h index 3aec68613..aed53c10a 100644 --- a/frame/item/pluginsitem.h +++ b/frame/item/pluginsitem.h @@ -23,20 +23,21 @@ public: using DockItem::showContextMenu; using DockItem::hidePopup; - inline ItemType itemType() const {return Plugins;} + inline ItemType itemType() const override {return Plugins;} + QSize sizeHint() const override; public slots: - void refershIcon(); + void refershIcon() override; private: - void mousePressEvent(QMouseEvent *e); - void mouseMoveEvent(QMouseEvent *e); - void mouseReleaseEvent(QMouseEvent *e); - bool eventFilter(QObject *o, QEvent *e); + void mousePressEvent(QMouseEvent *e) override; + void mouseMoveEvent(QMouseEvent *e) override; + void mouseReleaseEvent(QMouseEvent *e) override; + bool eventFilter(QObject *o, QEvent *e) override; - void invokedMenuItem(const QString &itemId, const bool checked); - const QString contextMenu() const; - QWidget *popupTips(); + void invokedMenuItem(const QString &itemId, const bool checked) override; + const QString contextMenu() const override; + QWidget *popupTips() override; private: void startDrag(); diff --git a/plugins/datetime/datetimeplugin.cpp b/plugins/datetime/datetimeplugin.cpp index 01bc15400..47798b1cc 100644 --- a/plugins/datetime/datetimeplugin.cpp +++ b/plugins/datetime/datetimeplugin.cpp @@ -18,7 +18,8 @@ DatetimePlugin::DatetimePlugin(QObject *parent) m_centralWidget = new DatetimeWidget; - connect(m_centralWidget, &DatetimeWidget::requestContextMenu, [this] {m_proxyInter->requestContextMenu(this, QString());}); + connect(m_centralWidget, &DatetimeWidget::requestContextMenu, [this] { m_proxyInter->requestContextMenu(this, QString()); }); + connect(m_centralWidget, &DatetimeWidget::requestUpdateGeometry, [this] { m_proxyInter->itemUpdate(this, QString()); }); connect(m_refershTimer, &QTimer::timeout, this, &DatetimePlugin::updateCurrentTimeString); } diff --git a/plugins/datetime/datetimewidget.cpp b/plugins/datetime/datetimewidget.cpp index 504fdfb60..6620e0eba 100644 --- a/plugins/datetime/datetimewidget.cpp +++ b/plugins/datetime/datetimewidget.cpp @@ -25,13 +25,18 @@ void DatetimeWidget::toggleHourFormat() m_cachedTime.clear(); update(); + + emit requestUpdateGeometry(); } QSize DatetimeWidget::sizeHint() const { QFontMetrics fm(qApp->font()); - return fm.boundingRect("88:88").size() + QSize(20, 10); + if (m_24HourFormat) + return fm.boundingRect("88:88").size() + QSize(20, 10); + else + return fm.boundingRect("88:88 A.A.").size() + QSize(20, 20); } void DatetimeWidget::resizeEvent(QResizeEvent *e) @@ -46,16 +51,26 @@ void DatetimeWidget::paintEvent(QPaintEvent *e) Q_UNUSED(e); const Dock::DisplayMode displayMode = qApp->property(PROP_DISPLAY_MODE).value(); + const Dock::Position position = qApp->property(PROP_POSITION).value(); const QDateTime current = QDateTime::currentDateTime(); QPainter painter(this); if (displayMode == Dock::Efficient) { - const QString text = current.toString(m_24HourFormat ? "hh:mm" : "hh:mm A"); + QString format; + if (m_24HourFormat) + format = "hh:mm"; + else + { + if (position == Dock::Top || position == Dock::Bottom) + format = "hh:mm AP"; + else + format = "hh:mm\nAP"; + } painter.setPen(Qt::white); - painter.drawText(rect(), Qt::AlignCenter, text.left(5)); + painter.drawText(rect(), Qt::AlignCenter, current.time().toString(format)); return; } @@ -97,17 +112,45 @@ void DatetimeWidget::paintEvent(QPaintEvent *e) const QPoint bigNum2Offset = bigNum1Offset + QPoint(bigNumWidth + 1, 0); p.drawPixmap(bigNum2Offset, bigNum2); - // draw small num 1 - const QString smallNum1Path = QString(":/icons/resources/icons/small%1.svg").arg(currentTimeString[2]); - const QPixmap smallNum1 = loadSvg(smallNum1Path, QSize(smallNumWidth, smallNumHeight)); - const QPoint smallNum1Offset = bigNum2Offset + QPoint(bigNumWidth + 2, smallNumHeight); - p.drawPixmap(smallNum1Offset, smallNum1); + if (!m_24HourFormat) + { + // draw small num 1 + const QString smallNum1Path = QString(":/icons/resources/icons/small%1.svg").arg(currentTimeString[2]); + const QPixmap smallNum1 = loadSvg(smallNum1Path, QSize(smallNumWidth, smallNumHeight)); + const QPoint smallNum1Offset = bigNum2Offset + QPoint(bigNumWidth + 2, 1); + p.drawPixmap(smallNum1Offset, smallNum1); - // draw small num 2 - const QString smallNum2Path = QString(":/icons/resources/icons/small%1.svg").arg(currentTimeString[3]); - const QPixmap smallNum2 = loadSvg(smallNum2Path, QSize(smallNumWidth, smallNumHeight)); - const QPoint smallNum2Offset = smallNum1Offset + QPoint(smallNumWidth + 1, 0); - p.drawPixmap(smallNum2Offset, smallNum2); + // draw small num 2 + const QString smallNum2Path = QString(":/icons/resources/icons/small%1.svg").arg(currentTimeString[3]); + const QPixmap smallNum2 = loadSvg(smallNum2Path, QSize(smallNumWidth, smallNumHeight)); + const QPoint smallNum2Offset = smallNum1Offset + QPoint(smallNumWidth + 1, 0); + p.drawPixmap(smallNum2Offset, smallNum2); + + // draw am/pm tips + const int tips_width = (smallNumWidth * 2 + 2) & ~0x1; + const int tips_height = tips_width / 2; + + QPixmap tips; + if (current.time().hour() > 12) + tips = loadSvg(":/icons/resources/icons/tips-pm.svg", QSize(tips_width, tips_height)); + else + tips = loadSvg(":/icons/resources/icons/tips-am.svg", QSize(tips_width, tips_height)); + + const QPoint tipsOffset = bigNum2Offset + QPoint(bigNumWidth + 2, bigNumHeight - tips_height); + p.drawPixmap(tipsOffset, tips); + } else { + // draw small num 1 + const QString smallNum1Path = QString(":/icons/resources/icons/small%1.svg").arg(currentTimeString[2]); + const QPixmap smallNum1 = loadSvg(smallNum1Path, QSize(smallNumWidth, smallNumHeight)); + const QPoint smallNum1Offset = bigNum2Offset + QPoint(bigNumWidth + 2, smallNumHeight); + p.drawPixmap(smallNum1Offset, smallNum1); + + // draw small num 2 + const QString smallNum2Path = QString(":/icons/resources/icons/small%1.svg").arg(currentTimeString[3]); + const QPixmap smallNum2 = loadSvg(smallNum2Path, QSize(smallNumWidth, smallNumHeight)); + const QPoint smallNum2Offset = smallNum1Offset + QPoint(smallNumWidth + 1, 0); + p.drawPixmap(smallNum2Offset, smallNum2); + } } // draw cached fashion mode time item diff --git a/plugins/datetime/datetimewidget.h b/plugins/datetime/datetimewidget.h index 91763de76..d09f91493 100644 --- a/plugins/datetime/datetimewidget.h +++ b/plugins/datetime/datetimewidget.h @@ -14,6 +14,7 @@ public: bool is24HourFormat() const { return m_24HourFormat; } signals: + void requestUpdateGeometry() const; void requestContextMenu() const; public slots: diff --git a/plugins/datetime/resources.qrc b/plugins/datetime/resources.qrc index c961ff6ae..826605443 100644 --- a/plugins/datetime/resources.qrc +++ b/plugins/datetime/resources.qrc @@ -21,5 +21,7 @@ resources/icons/small7.svg resources/icons/small8.svg resources/icons/small9.svg + resources/icons/tips-am.svg + resources/icons/tips-pm.svg diff --git a/plugins/datetime/resources/icons/tips-am.svg b/plugins/datetime/resources/icons/tips-am.svg new file mode 100755 index 000000000..8822fe133 --- /dev/null +++ b/plugins/datetime/resources/icons/tips-am.svg @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/plugins/datetime/resources/icons/tips-pm.svg b/plugins/datetime/resources/icons/tips-pm.svg new file mode 100755 index 000000000..113f7bbc3 --- /dev/null +++ b/plugins/datetime/resources/icons/tips-pm.svg @@ -0,0 +1,46 @@ + + + + + + + + +