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 #pragma once
0009 
0010 #include <QDateTime>
0011 #include <QObject>
0012 #include <QTimer>
0013 
0014 class StopwatchTimer : public QObject
0015 {
0016     Q_OBJECT
0017     Q_PROPERTY(int elapsedTime READ elapsedTime NOTIFY timeChanged)
0018     Q_PROPERTY(QString hours READ hoursDisplay NOTIFY timeChanged)
0019     Q_PROPERTY(QString minutes READ minutesDisplay NOTIFY timeChanged)
0020     Q_PROPERTY(QString seconds READ secondsDisplay NOTIFY timeChanged)
0021     Q_PROPERTY(QString small READ smallDisplay NOTIFY timeChanged)
0022 
0023 public:
0024     explicit StopwatchTimer(QObject *parent = nullptr);
0025 
0026     long long hours() const;
0027     long long minutes() const;
0028     long long seconds() const;
0029     long long small() const;
0030     QString hoursDisplay() const;
0031     QString minutesDisplay() const;
0032     QString secondsDisplay() const;
0033     QString smallDisplay() const;
0034 
0035     long long elapsedTime() const;
0036 
0037     Q_INVOKABLE void reset();
0038     Q_INVOKABLE void toggle();
0039 
0040 Q_SIGNALS:
0041     void timeChanged();
0042 
0043 private Q_SLOTS:
0044     void updateTime();
0045 
0046 private:
0047     static QString displayZeroOrAmount(const int &amount);
0048 
0049     const int m_interval = 41; // 24fps
0050 
0051     long long timerStartStamp = QDateTime::currentMSecsSinceEpoch();
0052     long long pausedStamp = QDateTime::currentMSecsSinceEpoch();
0053     long long pausedElapsed = 0;
0054 
0055     bool stopped = true, paused = false;
0056     QTimer *m_timer;
0057 };