File indexing completed on 2024-06-23 05:45:41

0001 /*
0002  * Copyright 2020 Han Young <hanyoung@protonmail.com>
0003  * Copyright 2020-2021 Devin Lin <devin@kde.org>
0004  *
0005  * SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #include "stopwatchtimer.h"
0009 
0010 #include <QDebug>
0011 
0012 StopwatchTimer::StopwatchTimer(QObject *parent)
0013     : QObject(parent)
0014     , m_timer{new QTimer{this}}
0015 {
0016     connect(m_timer, &QTimer::timeout, this, &StopwatchTimer::updateTime);
0017 }
0018 
0019 void StopwatchTimer::updateTime()
0020 {
0021     Q_EMIT timeChanged();
0022 }
0023 
0024 void StopwatchTimer::toggle()
0025 {
0026     if (stopped) { // start (from zero)
0027         stopped = false;
0028         paused = false;
0029 
0030         timerStartStamp = QDateTime::currentMSecsSinceEpoch();
0031         pausedElapsed = 0;
0032 
0033         m_timer->start(m_interval);
0034     } else if (paused) { // unpause
0035         paused = false;
0036 
0037         pausedElapsed += QDateTime::currentMSecsSinceEpoch() - pausedStamp;
0038 
0039         m_timer->start(m_interval);
0040     } else { // pause
0041         paused = true;
0042         pausedStamp = QDateTime::currentMSecsSinceEpoch();
0043         m_timer->stop();
0044     }
0045 }
0046 
0047 void StopwatchTimer::reset()
0048 {
0049     m_timer->stop();
0050     pausedElapsed = 0;
0051     stopped = true;
0052     paused = false;
0053     Q_EMIT timeChanged();
0054 }
0055 
0056 long long StopwatchTimer::elapsedTime() const
0057 {
0058     long long cur = QDateTime::currentMSecsSinceEpoch();
0059     if (stopped) {
0060         return 0;
0061     } else if (paused) {
0062         return cur - timerStartStamp - pausedElapsed - (cur - pausedStamp);
0063     } else {
0064         return cur - timerStartStamp - pausedElapsed;
0065     }
0066 }
0067 
0068 long long StopwatchTimer::hours() const
0069 {
0070     return elapsedTime() / 3600000;
0071 }
0072 
0073 long long StopwatchTimer::minutes() const
0074 {
0075     return elapsedTime() / 1000 / 60;
0076 }
0077 
0078 long long StopwatchTimer::seconds() const
0079 {
0080     return elapsedTime() / 1000 - 60 * minutes();
0081 }
0082 
0083 long long StopwatchTimer::small() const
0084 {
0085     return elapsedTime() / 10 - 100 * seconds() - 100 * 60 * minutes();
0086 }
0087 
0088 QString StopwatchTimer::displayZeroOrAmount(const int &amount)
0089 {
0090     return QStringLiteral("%1").arg(amount, 2, 10, QLatin1Char('0'));
0091 }
0092 
0093 QString StopwatchTimer::hoursDisplay() const
0094 {
0095     long long amount = hours();
0096     return displayZeroOrAmount(amount);
0097 }
0098 
0099 QString StopwatchTimer::minutesDisplay() const
0100 {
0101     // % 60 discards anything above 60 minutes. Not used in minutes() because
0102     // it may tamper with seconds() and small().
0103     long long amount = minutes() % 60;
0104     return displayZeroOrAmount(amount);
0105 }
0106 
0107 QString StopwatchTimer::secondsDisplay() const
0108 {
0109     long long amount = seconds();
0110     return displayZeroOrAmount(amount);
0111 }
0112 
0113 QString StopwatchTimer::smallDisplay() const
0114 {
0115     long long amount = small();
0116     return displayZeroOrAmount(amount);
0117 }