diff options
author | Owais Akhtar <[email protected]> | 2025-05-08 08:32:59 +0300 |
---|---|---|
committer | Owais Akhtar <[email protected]> | 2025-06-05 10:30:03 +0000 |
commit | 82428c0f79de0c2307641ad35acf8e849fd08a7c (patch) | |
tree | c88d104c4cc910230b553f3baa674ced81936a30 | |
parent | 4c03576ce10b3a60be4486e117694c6bf6ac96bc (diff) |
Fixes: QTBUG-128220
Change-Id: Ib360fa08d66aa58f044ecbe7dab10d5cc00e25c9
Reviewed-by: Sami Varanka <[email protected]>
4 files changed, 81 insertions, 5 deletions
diff --git a/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.cpp b/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.cpp index 36f485f7..d2add223 100644 --- a/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.cpp +++ b/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.cpp @@ -96,6 +96,18 @@ QT_BEGIN_NAMESPACE The default value is 0, which means that intervals are automatically calculated based on the min and max range. */ +/*! + \property QDateTimeAxis::timeZone + \brief The time zone that will be used to display labels of the axis. + The accepted values are based on IANA time zone IDs. The default time zone is UTC. + \since 6.10 +*/ +/*! + \qmlproperty string DateTimeAxis::timeZone + The time zone that will be used to display labels of the axis. + The accepted values are based on IANA time zone IDs. The default time zone is UTC. + \since 6.10 +*/ /*! \property QDateTimeAxis::labelFormat @@ -137,14 +149,18 @@ QT_BEGIN_NAMESPACE This signal is emitted when the tick interval value, specified by \a tickInterval, changes. */ +/*! + \qmlsignal DateTimeAxis::timeZoneChanged() + This signal is emitted when the time zone is changed. It represents a string value for the + IANA time zone ID that was set. + \since 6.10 +*/ QDateTimeAxis::QDateTimeAxis(QObject *parent) : QAbstractAxis(*(new QDateTimeAxisPrivate), parent) {} -QDateTimeAxis::~QDateTimeAxis() -{ -} +QDateTimeAxis::~QDateTimeAxis() {} QAbstractAxis::AxisType QDateTimeAxis::type() const { @@ -163,7 +179,7 @@ void QDateTimeAxis::setMin(const QDateTime &min) QDateTime QDateTimeAxis::min() const { Q_D(const QDateTimeAxis); - return QDateTime::fromMSecsSinceEpoch(d->m_min, QTimeZone::UTC); + return QDateTime::fromMSecsSinceEpoch(d->m_min, d->m_timeZone); } void QDateTimeAxis::setMax(const QDateTime &max) @@ -178,7 +194,7 @@ void QDateTimeAxis::setMax(const QDateTime &max) QDateTime QDateTimeAxis::max() const { Q_D(const QDateTimeAxis); - return QDateTime::fromMSecsSinceEpoch(d->m_max, QTimeZone::UTC); + return QDateTime::fromMSecsSinceEpoch(d->m_max, d->m_timeZone); } void QDateTimeAxis::setLabelFormat(const QString &format) @@ -237,6 +253,35 @@ void QDateTimeAxis::setSubTickCount(int newSubTickCount) emit update(); } +QString QDateTimeAxis::timeZone() const +{ +#if QT_CONFIG(timezone) + Q_D(const QDateTimeAxis); + + return QString::fromUtf8(d->m_timeZone.id()); +#else + return QString::fromUtf8("UTC"); +#endif +} + +void QDateTimeAxis::setTimeZone(const QString &zoneId) +{ + Q_D(QDateTimeAxis); + +#if QT_CONFIG(timezone) + auto zone = QTimeZone(zoneId.toUtf8()); +#else + auto zone = QTimeZone(QTimeZone::Initialization::UTC); +#endif + + if (!zone.isValid()) + return; + + d->m_timeZone = zone; + emit timeZoneChanged(zoneId); + emit update(); +} + /////////////////////////////////////////////////////////////////////////////// QDateTimeAxisPrivate::QDateTimeAxisPrivate() {} diff --git a/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.h b/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.h index b4abffb9..2d8dadab 100644 --- a/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.h +++ b/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.h @@ -21,6 +21,8 @@ class Q_GRAPHS_EXPORT QDateTimeAxis : public QAbstractAxis int subTickCount READ subTickCount WRITE setSubTickCount NOTIFY subTickCountChanged FINAL) Q_PROPERTY( qreal tickInterval READ tickInterval WRITE setTickInterval NOTIFY tickIntervalChanged FINAL) + Q_PROPERTY( + QString timeZone READ timeZone WRITE setTimeZone NOTIFY timeZoneChanged REVISION(6, 10)) QML_NAMED_ELEMENT(DateTimeAxis) public: @@ -48,12 +50,16 @@ public: int subTickCount() const; void setSubTickCount(int newSubTickCount); + Q_REVISION(6, 10) QString timeZone() const; + Q_REVISION(6, 10) void setTimeZone(const QString &zoneId); + Q_SIGNALS: void minChanged(const QDateTime &min); void maxChanged(const QDateTime &max); void labelFormatChanged(const QString &format); void tickIntervalChanged(); void subTickCountChanged(); + Q_REVISION(6, 10) void timeZoneChanged(const QString &timeZone); private: Q_DECLARE_PRIVATE(QDateTimeAxis) diff --git a/src/graphs2d/axis/datetimeaxis/qdatetimeaxis_p.h b/src/graphs2d/axis/datetimeaxis/qdatetimeaxis_p.h index cbd31dc6..0421b415 100644 --- a/src/graphs2d/axis/datetimeaxis/qdatetimeaxis_p.h +++ b/src/graphs2d/axis/datetimeaxis/qdatetimeaxis_p.h @@ -27,6 +27,7 @@ public: protected: qreal m_min = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC).toMSecsSinceEpoch(); qreal m_max = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC).addYears(10).toMSecsSinceEpoch(); + QTimeZone m_timeZone = QTimeZone::UTC; qreal m_tickInterval = 0.0; qsizetype m_subTickCount = 0; QString m_format = QStringLiteral("dd-MMMM-yy"); diff --git a/tests/auto/cpp2dtest/qgaxis-datetime/tst_datetimeaxis.cpp b/tests/auto/cpp2dtest/qgaxis-datetime/tst_datetimeaxis.cpp index 8f8c7ff0..ebc31d3f 100644 --- a/tests/auto/cpp2dtest/qgaxis-datetime/tst_datetimeaxis.cpp +++ b/tests/auto/cpp2dtest/qgaxis-datetime/tst_datetimeaxis.cpp @@ -58,17 +58,25 @@ void tst_datetimeaxis::initialProperties() QCOMPARE(m_axis->labelFormat(), "dd-MMMM-yy"); QCOMPARE(m_axis->subTickCount(), 0); QCOMPARE(m_axis->tickInterval(), 0.0); + QCOMPARE(m_axis->timeZone(), "UTC"); } void tst_datetimeaxis::initializeProperties() { QVERIFY(m_axis); +#ifdef QT_FEATURE_timezone + QString tzone = "Europe/Helsinki"; +#else + QString tzone = "UTC"; +#endif + QSignalSpy minSpy(m_axis, &QDateTimeAxis::minChanged); QSignalSpy maxSpy(m_axis, &QDateTimeAxis::maxChanged); QSignalSpy labelFormatSpy(m_axis, &QDateTimeAxis::labelFormatChanged); QSignalSpy tickIntervalSpy(m_axis, &QDateTimeAxis::tickIntervalChanged); QSignalSpy subTickCountSpy(m_axis, &QDateTimeAxis::subTickCountChanged); + QSignalSpy timeZoneSpy(m_axis, &QDateTimeAxis::timeZoneChanged); m_axis->setMin(QDateTime(QDate::currentDate(), QTime::fromMSecsSinceStartOfDay(0))); m_axis->setMax( @@ -88,11 +96,27 @@ void tst_datetimeaxis::initializeProperties() QCOMPARE(m_axis->subTickCount(), 2); QCOMPARE(m_axis->tickInterval(), 0.5); + auto tz = QString(tzone).toUtf8(); + m_axis->setTimeZone(tz); + + auto max = QDateTime(QDate::currentDate(), QTime::fromMSecsSinceStartOfDay(0), QTimeZone::UTC) + .addYears(20); + auto min = QDateTime(QDate::currentDate(), QTime::fromMSecsSinceStartOfDay(0)); + max.toTimeZone(QTimeZone(tz)); + min.toTimeZone(QTimeZone(tz)); + + QCOMPARE(m_axis->timeZone(), tzone); + QCOMPARE(m_axis->min(), min); + QCOMPARE(m_axis->max(), max); + QCOMPARE(m_axis->min().timeZone().offsetFromUtc(m_axis->min()), QTimeZone(tz).offsetFromUtc(m_axis->min())); + QCOMPARE(m_axis->max().timeZone().offsetFromUtc(m_axis->max()), QTimeZone(tz).offsetFromUtc(m_axis->max())); + QCOMPARE(minSpy.size(), 1); QCOMPARE(maxSpy.size(), 1); QCOMPARE(labelFormatSpy.size(), 1); QCOMPARE(tickIntervalSpy.size(), 1); QCOMPARE(subTickCountSpy.size(), 1); + QCOMPARE(timeZoneSpy.size(), 1); } void tst_datetimeaxis::invalidProperties() |