Skip to content

Commit

Permalink
Refactor ReadableInterval, fix clang-tidy warnings
Browse files Browse the repository at this point in the history
  • Loading branch information
nishanthkarthik committed Oct 15, 2018
1 parent 85c60b8 commit 7d4e43c
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 68 deletions.
6 changes: 2 additions & 4 deletions src/libs/ui/docsetsdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -313,8 +313,7 @@ void DocsetsDialog::downloadCompleted()
if (file->open(QIODevice::WriteOnly))
file->write(data);

ReadableInterval lastModifiedInterval(QFileInfo(file->fileName()).lastModified());
ui->lastUpdatedLabel->setText(lastModifiedInterval.toReadableString());
ui->lastUpdatedLabel->setText(ReadableInterval::toReadableString(QFileInfo(file->fileName()).lastModified()));

QJsonParseError jsonError;
const QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
Expand Down Expand Up @@ -520,8 +519,7 @@ void DocsetsDialog::loadDocsetList()
return;
}

ReadableInterval lastModifiedInterval(fi.lastModified());
ui->lastUpdatedLabel->setText(lastModifiedInterval.toReadableString());
ui->lastUpdatedLabel->setText(ReadableInterval::toReadableString(fi.lastModified()));
processDocsetList(jsonDoc.array());
}

Expand Down
81 changes: 44 additions & 37 deletions src/libs/util/readableinterval.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,53 +28,60 @@

using namespace Zeal::Util;

ReadableInterval::ReadableInterval(QDateTime timestamp, QDateTime reference) :
m_timestamp(timestamp),
m_reference(reference)
{
m_delta = m_reference.toSecsSinceEpoch() - m_timestamp.toSecsSinceEpoch();
}
namespace {
const qint16 SECONDSPERMINUTE = 60;
const qint16 SECONDSPERHOUR = SECONDSPERMINUTE * 60;
const qint32 SECONDSPERDAY = SECONDSPERHOUR * 24;
const qint32 SECONDSPERYEAR = SECONDSPERDAY * 365;

ReadableInterval::ReadableInterval(QDateTime timestamp) :
m_timestamp(timestamp)
{
m_reference = QDateTime::currentDateTime();
m_delta = m_reference.toSecsSinceEpoch() - m_timestamp.toSecsSinceEpoch();
const qint8 MAX_FIELDS_DISPLAYED = 3;

const QString ZERO_INTERVAL_STRING = "now";
const QString PAST_INTERVAL_STRING = "ago";
const QString FUTURE_INTERVAL_STRING = "from now";
const QString YEAR = "Year";
const QString DAY = "Day";
const QString HOUR = "Hour";
const QString MIN = "Minute";
const QString SEC = "Second";
const QString JOIN_SEQ= ", ";
}

QString ReadableInterval::pluralForm(QString word, qint64 quantity)
QString ReadableInterval::pluralForm(const QString &word, qint64 quantity)
{
return word + (quantity > 1 ? "s" : "");
}

void ReadableInterval::computeDateTimeComponents()
QString ReadableInterval::toReadableString(const QDateTime& timestamp, const QDateTime& reference)
{
m_isPast = m_delta > 0;
m_year = m_delta / SECONDSPERYEAR;
m_day = (m_delta % SECONDSPERYEAR) / SECONDSPERDAY;
m_hour = ((m_delta % SECONDSPERYEAR) % SECONDSPERDAY) / SECONDSPERHOUR;
m_min = (((m_delta % SECONDSPERYEAR) % SECONDSPERDAY) % SECONDSPERHOUR) / SECONDSPERMINUTE;
m_sec = (((m_delta % SECONDSPERYEAR) % SECONDSPERDAY) % SECONDSPERHOUR) % SECONDSPERMINUTE;
}
qint64 delta, year, day, hour, min, sec;
bool isPast;

QString ReadableInterval::toReadableString()
{
if (m_delta == 0)
return ZERO_INTERVAL_STRING;
else {
delta = reference.toSecsSinceEpoch() - timestamp.toSecsSinceEpoch();

if (delta) {
QStringList list;
qint8 fieldCount = 0;
computeDateTimeComponents();
if (m_year && ++fieldCount <= MAX_FIELDS_DISPLAYED)
list.append(QStringLiteral("%1 %2").arg(m_year).arg(pluralForm(YEAR, m_year)));
if (m_day && ++fieldCount <= MAX_FIELDS_DISPLAYED)
list.append(QStringLiteral("%1 %2").arg(m_day).arg(pluralForm(DAY, m_day)));
if (m_hour && ++fieldCount <= MAX_FIELDS_DISPLAYED)
list.append(QStringLiteral("%1 %2").arg(m_hour).arg(pluralForm(HOUR, m_hour)));
if (m_min && ++fieldCount <= MAX_FIELDS_DISPLAYED)
list.append(QStringLiteral("%1 %2").arg(m_min).arg(pluralForm(MIN, m_min)));
if (m_sec && ++fieldCount <= MAX_FIELDS_DISPLAYED)
list.append(QStringLiteral("%1 %2").arg(m_sec).arg(pluralForm(SEC, m_sec)));
return QStringLiteral("%1 %2").arg(list.join(JOIN_SEQ)).arg(m_isPast ? PAST_INTERVAL_STRING : FUTURE_INTERVAL_STRING);

isPast = delta > 0;
year = delta / SECONDSPERYEAR;
day = (delta % SECONDSPERYEAR) / SECONDSPERDAY;
hour = ((delta % SECONDSPERYEAR) % SECONDSPERDAY) / SECONDSPERHOUR;
min = (((delta % SECONDSPERYEAR) % SECONDSPERDAY) % SECONDSPERHOUR) / SECONDSPERMINUTE;
sec = (((delta % SECONDSPERYEAR) % SECONDSPERDAY) % SECONDSPERHOUR) % SECONDSPERMINUTE;

if (year && ++fieldCount <= MAX_FIELDS_DISPLAYED)
list.append(QStringLiteral("%1 %2").arg(year).arg(ReadableInterval::pluralForm(YEAR, year)));
if (day && ++fieldCount <= MAX_FIELDS_DISPLAYED)
list.append(QStringLiteral("%1 %2").arg(day).arg(ReadableInterval::pluralForm(DAY, day)));
if (hour && ++fieldCount <= MAX_FIELDS_DISPLAYED)
list.append(QStringLiteral("%1 %2").arg(hour).arg(ReadableInterval::pluralForm(HOUR, hour)));
if (min && ++fieldCount <= MAX_FIELDS_DISPLAYED)
list.append(QStringLiteral("%1 %2").arg(min).arg(ReadableInterval::pluralForm(MIN, min)));
if (sec && ++fieldCount <= MAX_FIELDS_DISPLAYED)
list.append(QStringLiteral("%1 %2").arg(sec).arg(ReadableInterval::pluralForm(SEC, sec)));
return QStringLiteral("%1 %2").arg(list.join(JOIN_SEQ), isPast ? PAST_INTERVAL_STRING : FUTURE_INTERVAL_STRING);
} else {
return ZERO_INTERVAL_STRING;
}
}
29 changes: 2 additions & 27 deletions src/libs/util/readableinterval.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,35 +31,10 @@ namespace Util {
class ReadableInterval
{
public:
ReadableInterval(QDateTime timestamp, QDateTime reference);
ReadableInterval(QDateTime timestamp);

QString toReadableString();
static QString toReadableString(const QDateTime& timestamp, const QDateTime& reference = QDateTime::currentDateTime());

private:
void computeDateTimeComponents();
QString pluralForm(QString word, qint64 quantity);

QDateTime m_timestamp, m_reference;
qint64 m_delta, m_year, m_day, m_hour, m_min, m_sec;
bool m_isPast;

const qint16 SECONDSPERMINUTE = 60;
const qint16 SECONDSPERHOUR = SECONDSPERMINUTE * 60;
const qint32 SECONDSPERDAY = SECONDSPERHOUR * 24;
const qint32 SECONDSPERYEAR = SECONDSPERDAY * 365;

const qint8 MAX_FIELDS_DISPLAYED = 3;

QString ZERO_INTERVAL_STRING = "now";
QString PAST_INTERVAL_STRING = "ago";
QString FUTURE_INTERVAL_STRING = "from now";
QString YEAR = "Year";
QString DAY = "Day";
QString HOUR = "Hour";
QString MIN = "Minute";
QString SEC = "Second";
QString JOIN_SEQ= ", ";
static QString pluralForm(const QString& word, qint64 quantity);
};

} // namespace Util
Expand Down

0 comments on commit 7d4e43c

Please sign in to comment.