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 }