presentation/PimEditorTime.h
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include <QDateTime> | ||
| 4 | #include <QTimeZone> | ||
| 5 | |||
| 6 | // DATE is a calendar date, encoded at UTC midnight only for the existing | ||
| 7 | // store. DATE-TIME is an instant; editor text includes its local UTC offset | ||
| 8 | // and subsecond precision so a title-only edit cannot change that instant. | ||
| 9 | namespace PimEditorTime { | ||
| 10 | 1472 | inline QString display(const QDateTime &stamp, bool dateOnly) { | |
| 11 |
2/2✓ Branch 3 → 4 taken 893 times.
✓ Branch 3 → 5 taken 579 times.
|
1472 | if (!stamp.isValid()) return {}; |
| 12 |
1/1✓ Branch 6 → 7 taken 158 times.
|
158 | return dateOnly ? stamp.date().toString(Qt::ISODate) |
| 13 |
7/9✓ Branch 5 → 6 taken 158 times.
✓ Branch 5 → 8 taken 421 times.
✓ Branch 7 → 10 taken 158 times.
✓ Branch 8 → 9 taken 421 times.
✓ Branch 9 → 10 taken 421 times.
✓ Branch 11 → 12 taken 421 times.
✓ Branch 11 → 13 taken 158 times.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
|
1316 | : stamp.toLocalTime().toString(Qt::ISODateWithMs); |
| 14 | } | ||
| 15 | |||
| 16 | 125 | inline QDateTime parse(const QString &input, bool dateOnly) { | |
| 17 |
1/1✓ Branch 2 → 3 taken 125 times.
|
125 | const QString text = input.trimmed(); |
| 18 |
2/2✓ Branch 4 → 5 taken 1 time.
✓ Branch 4 → 6 taken 124 times.
|
125 | if (text.isEmpty()) return {}; |
| 19 |
2/2✓ Branch 6 → 7 taken 23 times.
✓ Branch 6 → 17 taken 101 times.
|
124 | if (dateOnly) { |
| 20 |
1/1✓ Branch 7 → 8 taken 23 times.
|
23 | const QDate date = QDate::fromString(text, Qt::ISODate); |
| 21 |
8/10✓ Branch 8 → 9 taken 23 times.
✓ Branch 9 → 10 taken 22 times.
✓ Branch 9 → 13 taken 1 time.
✓ Branch 10 → 11 taken 22 times.
✓ Branch 11 → 12 taken 22 times.
✓ Branch 12 → 14 taken 22 times.
✓ Branch 14 → 15 taken 22 times.
✓ Branch 14 → 16 taken 1 time.
✗ Branch 71 → 72 not taken.
✗ Branch 71 → 73 not taken.
|
23 | return date.isValid() ? QDateTime(date, QTime(0, 0), QTimeZone::utc()) : QDateTime(); |
| 22 | } | ||
| 23 | 101 | QString normalized = text; | |
| 24 |
5/6✓ Branch 19 → 20 taken 101 times.
✗ Branch 19 → 26 not taken.
✓ Branch 24 → 25 taken 4 times.
✓ Branch 24 → 26 taken 97 times.
✓ Branch 27 → 28 taken 4 times.
✓ Branch 27 → 32 taken 97 times.
|
101 | if (normalized.size() > 10 && normalized.at(10) == QLatin1Char(' ')) |
| 25 |
1/1✓ Branch 30 → 31 taken 4 times.
|
4 | normalized[10] = QLatin1Char('T'); |
| 26 |
1/1✓ Branch 32 → 33 taken 101 times.
|
101 | const auto parsed = QDateTime::fromString(normalized, Qt::ISODateWithMs); |
| 27 |
2/3✓ Branch 33 → 34 taken 101 times.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 36 taken 101 times.
|
101 | if (!parsed.isValid()) return {}; |
| 28 |
3/3✓ Branch 36 → 37 taken 101 times.
✓ Branch 37 → 38 taken 6 times.
✓ Branch 37 → 39 taken 95 times.
|
101 | if (parsed.timeSpec() != Qt::LocalTime) return parsed; |
| 29 | // Do not silently normalize a DST gap or choose one side of a fold. | ||
| 30 | // An explicit offset supplied by the editor/user resolves a fold. | ||
| 31 |
2/2✓ Branch 39 → 40 taken 95 times.
✓ Branch 40 → 41 taken 95 times.
|
95 | const QDate date = QDate::fromString(normalized.left(10), Qt::ISODate); |
| 32 | 95 | QTime time = normalized.size() == 10 ? QTime(0, 0) | |
| 33 |
4/9✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 95 times.
✗ Branch 44 → 47 not taken.
✓ Branch 45 → 46 taken 95 times.
✓ Branch 46 → 47 taken 95 times.
✓ Branch 47 → 48 taken 95 times.
✗ Branch 47 → 49 not taken.
✗ Branch 81 → 82 not taken.
✗ Branch 81 → 83 not taken.
|
95 | : QTime::fromString(normalized.mid(11), Qt::ISODateWithMs); |
| 34 |
2/5✓ Branch 49 → 50 taken 95 times.
✗ Branch 50 → 51 not taken.
✓ Branch 50 → 60 taken 95 times.
✗ Branch 54 → 55 not taken.
✗ Branch 55 → 56 not taken.
|
95 | if (!time.isValid()) time = QTime::fromString(normalized.mid(11), QStringLiteral("HH:mm")); |
| 35 |
1/1✓ Branch 60 → 61 taken 95 times.
|
190 | return QDateTime(date, time, QTimeZone::systemTimeZone(), |
| 36 |
1/1✓ Branch 61 → 62 taken 95 times.
|
95 | QDateTime::TransitionResolution::Reject); |
| 37 | 125 | } | |
| 38 | } | ||
| 39 |