Skip to content

Commit 73616c2

Browse files
committed
Modernize durationToDescriptiveString and make it plural aware
1 parent cd9260b commit 73616c2

File tree

6 files changed

+53
-67
lines changed

6 files changed

+53
-67
lines changed

src/common/utility.cpp

+17-29
Original file line numberDiff line numberDiff line change
@@ -199,46 +199,36 @@ qint64 Utility::qDateTimeToTime_t(const QDateTime &t)
199199
}
200200

201201
namespace {
202-
struct Period
202+
constexpr struct
203203
{
204-
const char *name;
205-
quint64 msec;
206-
207-
QString description(quint64 value) const
208-
{
209-
return QCoreApplication::translate("Utility", name, nullptr, value);
210-
}
211-
};
212-
// QTBUG-3945 and issue #4855: QT_TRANSLATE_NOOP does not work with plural form because lupdate
213-
// limitation unless we fake more arguments
214-
// (it must be in the form ("context", "source", "comment", n)
215-
#undef QT_TRANSLATE_NOOP
216-
#define QT_TRANSLATE_NOOP(ctx, str, ...) str
217-
Q_DECL_CONSTEXPR Period periods[] = {
218-
{ QT_TRANSLATE_NOOP("Utility", "%n year(s)", 0, _), 365 * 24 * 3600 * 1000LL },
219-
{ QT_TRANSLATE_NOOP("Utility", "%n month(s)", 0, _), 30 * 24 * 3600 * 1000LL },
220-
{ QT_TRANSLATE_NOOP("Utility", "%n day(s)", 0, _), 24 * 3600 * 1000LL },
221-
{ QT_TRANSLATE_NOOP("Utility", "%n hour(s)", 0, _), 3600 * 1000LL },
222-
{ QT_TRANSLATE_NOOP("Utility", "%n minute(s)", 0, _), 60 * 1000LL },
223-
{ QT_TRANSLATE_NOOP("Utility", "%n second(s)", 0, _), 1000LL },
224-
{ nullptr, 0 }
204+
const char *const name;
205+
const std::chrono::milliseconds msec;
206+
QString description(int value) const { return QCoreApplication::translate("Utility", name, nullptr, value); }
207+
} periods[] = {
208+
{QT_TRANSLATE_N_NOOP("Utility", "%n year(s)"), 24h * 365},
209+
{QT_TRANSLATE_N_NOOP("Utility", "%n month(s)"), 24h * 30},
210+
{QT_TRANSLATE_N_NOOP("Utility", "%n day(s)"), 24h},
211+
{QT_TRANSLATE_N_NOOP("Utility", "%n hour(s)"), 1h},
212+
{QT_TRANSLATE_N_NOOP("Utility", "%n minute(s)"), 1min},
213+
{QT_TRANSLATE_N_NOOP("Utility", "%n second(s)"), 1s},
214+
{nullptr, {}},
225215
};
226216
} // anonymous namespace
227217

228-
QString Utility::durationToDescriptiveString2(quint64 msecs)
218+
QString Utility::durationToDescriptiveString2(std::chrono::milliseconds msecs)
229219
{
230220
int p = 0;
231221
while (periods[p + 1].name && msecs < periods[p].msec) {
232222
p++;
233223
}
234224

235-
auto firstPart = periods[p].description(int(msecs / periods[p].msec));
225+
const QString firstPart = periods[p].description(static_cast<int>(msecs / periods[p].msec));
236226

237227
if (!periods[p + 1].name) {
238228
return firstPart;
239229
}
240230

241-
quint64 secondPartNum = qRound(double(msecs % periods[p].msec) / periods[p + 1].msec);
231+
const quint64 secondPartNum = qRound(static_cast<double>(msecs.count() % periods[p].msec.count()) / periods[p + 1].msec.count());
242232

243233
if (secondPartNum == 0) {
244234
return firstPart;
@@ -247,15 +237,13 @@ QString Utility::durationToDescriptiveString2(quint64 msecs)
247237
return QCoreApplication::translate("Utility", "%1 %2").arg(firstPart, periods[p + 1].description(secondPartNum));
248238
}
249239

250-
QString Utility::durationToDescriptiveString1(quint64 msecs)
240+
QString Utility::durationToDescriptiveString1(std::chrono::milliseconds msecs)
251241
{
252242
int p = 0;
253243
while (periods[p + 1].name && msecs < periods[p].msec) {
254244
p++;
255245
}
256-
257-
quint64 amount = qRound(double(msecs) / periods[p].msec);
258-
return periods[p].description(amount);
246+
return periods[p].description(qRound(static_cast<double>(msecs.count()) / periods[p].msec.count()));
259247
}
260248

261249
QString Utility::fileNameForGuiUse(const QString &fName)

src/common/utility.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ OCSYNC_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcUtility)
9696

9797
/**
9898
* @brief Convert milliseconds duration to human readable string.
99-
* @param quint64 msecs the milliseconds to convert to string.
99+
* @param msecs the milliseconds to convert to string.
100100
* @return an HMS representation of the milliseconds value.
101101
*
102102
* durationToDescriptiveString1 describes the duration in a single
@@ -105,8 +105,8 @@ OCSYNC_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcUtility)
105105
* durationToDescriptiveString2 uses two units where possible, so
106106
* "5 minutes 43 seconds" or "1 month 3 days".
107107
*/
108-
OCSYNC_EXPORT QString durationToDescriptiveString1(quint64 msecs);
109-
OCSYNC_EXPORT QString durationToDescriptiveString2(quint64 msecs);
108+
OCSYNC_EXPORT QString durationToDescriptiveString1(std::chrono::milliseconds msecs);
109+
OCSYNC_EXPORT QString durationToDescriptiveString2(std::chrono::milliseconds msecs);
110110

111111
/**
112112
* @brief hasDarkSystray - determines whether the systray is dark or light.

src/gui/folderstatusmodel.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ namespace {
157157
.arg(s1, s2)
158158
.arg(currentFile)
159159
.arg(totalFileCount)
160-
.arg(Utility::durationToDescriptiveString1(progress.totalProgress().estimatedEta));
160+
.arg(Utility::durationToDescriptiveString1(std::chrono::milliseconds(progress.totalProgress().estimatedEta)));
161161

162162
} else {
163163
//: Example text: "12 MB of 345 MB, file 6 of 7"

src/gui/owncloudgui.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,7 @@ void ownCloudGui::slotUpdateProgress(Folder *folder, const ProgressInfo &progres
779779
msg = tr("Syncing %1 of %2 (%3 left)")
780780
.arg(currentFile)
781781
.arg(totalFileCount)
782-
.arg(Utility::durationToDescriptiveString2(progress.totalProgress().estimatedEta));
782+
.arg(Utility::durationToDescriptiveString2(std::chrono::milliseconds(progress.totalProgress().estimatedEta)));
783783
} else {
784784
msg = tr("Syncing %1 of %2")
785785
.arg(currentFile)
@@ -791,7 +791,7 @@ void ownCloudGui::slotUpdateProgress(Folder *folder, const ProgressInfo &progres
791791
QString msg;
792792
if (progress.trustEta()) {
793793
msg = tr("Syncing %1 (%2 left)")
794-
.arg(totalSizeStr, Utility::durationToDescriptiveString2(progress.totalProgress().estimatedEta));
794+
.arg(totalSizeStr, Utility::durationToDescriptiveString2(std::chrono::milliseconds(progress.totalProgress().estimatedEta)));
795795
} else {
796796
msg = tr("Syncing %1")
797797
.arg(totalSizeStr);

src/libsync/syncengine.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ bool SyncEngine::checkErrorBlacklisting(SyncFileItem &item)
152152
} else {
153153
item._status = SyncFileItem::BlacklistedError;
154154

155-
auto waitSecondsStr = Utility::durationToDescriptiveString1(1000 * waitSeconds);
155+
auto waitSecondsStr = Utility::durationToDescriptiveString1(std::chrono::seconds(waitSeconds));
156156
item._errorString = tr("%1 (skipped due to earlier error, trying again in %2)").arg(entry._errorString, waitSecondsStr);
157157

158158
if (entry._errorCategory == SyncJournalErrorBlacklistRecord::Category::InsufficientRemoteStorage) {

test/testutility.cpp

+29-31
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#include "common/filesystembase.h"
1414
#include "common/utility.h"
1515

16+
using namespace std::chrono_literals;
17+
1618
using namespace OCC::Utility;
1719

1820
namespace OCC {
@@ -67,38 +69,34 @@ private Q_SLOTS:
6769
QLocale::setDefault(QLocale(QStringLiteral("C")));
6870
//NOTE: in order for the plural to work we would need to load the english translation
6971

70-
quint64 sec = 1000;
71-
quint64 hour = 3600 * sec;
72-
73-
QDateTime current = QDateTime::currentDateTimeUtc();
74-
75-
QCOMPARE(durationToDescriptiveString2(0), QString::fromLatin1("0 second(s)"));
76-
QCOMPARE(durationToDescriptiveString2(5), QString::fromLatin1("0 second(s)"));
77-
QCOMPARE(durationToDescriptiveString2(1000), QString::fromLatin1("1 second(s)"));
78-
QCOMPARE(durationToDescriptiveString2(1005), QString::fromLatin1("1 second(s)"));
79-
QCOMPARE(durationToDescriptiveString2(56123), QString::fromLatin1("56 second(s)"));
80-
QCOMPARE(durationToDescriptiveString2(90 * sec), QString::fromLatin1("1 minute(s) 30 second(s)"));
81-
QCOMPARE(durationToDescriptiveString2(3 * hour), QString::fromLatin1("3 hour(s)"));
82-
QCOMPARE(durationToDescriptiveString2(3 * hour + 20 * sec), QString::fromLatin1("3 hour(s)"));
83-
QCOMPARE(durationToDescriptiveString2(3 * hour + 70 * sec), QString::fromLatin1("3 hour(s) 1 minute(s)"));
84-
QCOMPARE(durationToDescriptiveString2(3 * hour + 100 * sec), QString::fromLatin1("3 hour(s) 2 minute(s)"));
85-
QCOMPARE(durationToDescriptiveString2(current.msecsTo(current.addYears(4).addMonths(5).addDays(2).addSecs(23 * 60 * 60))),
72+
const QDateTime current = QDateTime::currentDateTimeUtc();
73+
74+
QCOMPARE(durationToDescriptiveString2(0ms), QString::fromLatin1("0 second(s)"));
75+
QCOMPARE(durationToDescriptiveString2(5ms), QString::fromLatin1("0 second(s)"));
76+
QCOMPARE(durationToDescriptiveString2(1s), QString::fromLatin1("1 second(s)"));
77+
QCOMPARE(durationToDescriptiveString2(1005ms), QString::fromLatin1("1 second(s)"));
78+
QCOMPARE(durationToDescriptiveString2(56123ms), QString::fromLatin1("56 second(s)"));
79+
QCOMPARE(durationToDescriptiveString2(90s), QString::fromLatin1("1 minute(s) 30 second(s)"));
80+
QCOMPARE(durationToDescriptiveString2(3h), QString::fromLatin1("3 hour(s)"));
81+
QCOMPARE(durationToDescriptiveString2(3h + 20s), QString::fromLatin1("3 hour(s)"));
82+
QCOMPARE(durationToDescriptiveString2(3h + 70s), QString::fromLatin1("3 hour(s) 1 minute(s)"));
83+
QCOMPARE(durationToDescriptiveString2(3h + 100s), QString::fromLatin1("3 hour(s) 2 minute(s)"));
84+
QCOMPARE(durationToDescriptiveString2(current.addYears(4).addMonths(5).addDays(2).addSecs(23 * 60 * 60) - current),
8685
QString::fromLatin1("4 year(s) 5 month(s)"));
87-
QCOMPARE(durationToDescriptiveString2(current.msecsTo(current.addDays(2).addSecs(23 * 60 * 60))), QString::fromLatin1("2 day(s) 23 hour(s)"));
88-
89-
QCOMPARE(durationToDescriptiveString1(0), QString::fromLatin1("0 second(s)"));
90-
QCOMPARE(durationToDescriptiveString1(5), QString::fromLatin1("0 second(s)"));
91-
QCOMPARE(durationToDescriptiveString1(1000), QString::fromLatin1("1 second(s)"));
92-
QCOMPARE(durationToDescriptiveString1(1005), QString::fromLatin1("1 second(s)"));
93-
QCOMPARE(durationToDescriptiveString1(56123), QString::fromLatin1("56 second(s)"));
94-
QCOMPARE(durationToDescriptiveString1(90 * sec), QString::fromLatin1("2 minute(s)"));
95-
QCOMPARE(durationToDescriptiveString1(3 * hour), QString::fromLatin1("3 hour(s)"));
96-
QCOMPARE(durationToDescriptiveString1(3 * hour + 20 * sec), QString::fromLatin1("3 hour(s)"));
97-
QCOMPARE(durationToDescriptiveString1(3 * hour + 70 * sec), QString::fromLatin1("3 hour(s)"));
98-
QCOMPARE(durationToDescriptiveString1(3 * hour + 100 * sec), QString::fromLatin1("3 hour(s)"));
99-
QCOMPARE(
100-
durationToDescriptiveString1(current.msecsTo(current.addYears(4).addMonths(5).addDays(2).addSecs(23 * 60 * 60))), QString::fromLatin1("4 year(s)"));
101-
QCOMPARE(durationToDescriptiveString1(current.msecsTo(current.addDays(2).addSecs(23 * 60 * 60))), QString::fromLatin1("3 day(s)"));
86+
QCOMPARE(durationToDescriptiveString2(current.addDays(2).addSecs(23 * 60 * 60) - current), QString::fromLatin1("2 day(s) 23 hour(s)"));
87+
88+
QCOMPARE(durationToDescriptiveString1(0s), QString::fromLatin1("0 second(s)"));
89+
QCOMPARE(durationToDescriptiveString1(5ms), QString::fromLatin1("0 second(s)"));
90+
QCOMPARE(durationToDescriptiveString1(1s), QString::fromLatin1("1 second(s)"));
91+
QCOMPARE(durationToDescriptiveString1(1005ms), QString::fromLatin1("1 second(s)"));
92+
QCOMPARE(durationToDescriptiveString1(56123ms), QString::fromLatin1("56 second(s)"));
93+
QCOMPARE(durationToDescriptiveString1(90s), QString::fromLatin1("2 minute(s)"));
94+
QCOMPARE(durationToDescriptiveString1(3h), QString::fromLatin1("3 hour(s)"));
95+
QCOMPARE(durationToDescriptiveString1(3h + 20s), QString::fromLatin1("3 hour(s)"));
96+
QCOMPARE(durationToDescriptiveString1(3h + 70s), QString::fromLatin1("3 hour(s)"));
97+
QCOMPARE(durationToDescriptiveString1(3h + 100s), QString::fromLatin1("3 hour(s)"));
98+
QCOMPARE(durationToDescriptiveString1(current.addYears(4).addMonths(5).addDays(2).addSecs(23 * 60 * 60) - current), QString::fromLatin1("4 year(s)"));
99+
QCOMPARE(durationToDescriptiveString1(current.addDays(2).addSecs(23 * 60 * 60) - current), QString::fromLatin1("3 day(s)"));
102100
}
103101

104102
void testTimeAgo()

0 commit comments

Comments
 (0)