diff options
Diffstat (limited to 'accounts/gkleen@sif/shell/quickshell-plugins/Chrono.cpp')
-rw-r--r-- | accounts/gkleen@sif/shell/quickshell-plugins/Chrono.cpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/accounts/gkleen@sif/shell/quickshell-plugins/Chrono.cpp b/accounts/gkleen@sif/shell/quickshell-plugins/Chrono.cpp new file mode 100644 index 00000000..929b7be6 --- /dev/null +++ b/accounts/gkleen@sif/shell/quickshell-plugins/Chrono.cpp | |||
@@ -0,0 +1,88 @@ | |||
1 | #include "Chrono.hpp" | ||
2 | |||
3 | #include <format> | ||
4 | #include <iostream> | ||
5 | #include <cmath> | ||
6 | |||
7 | Chrono::Chrono(QObject* parent): QObject(parent) { | ||
8 | QObject::connect(&this->timer, &QTimer::timeout, this, &Chrono::onTimeout); | ||
9 | this->update(); | ||
10 | } | ||
11 | |||
12 | bool Chrono::enabled() const { return this->mEnabled; } | ||
13 | |||
14 | void Chrono::setEnabled(bool enabled) { | ||
15 | if (enabled == this->mEnabled) return; | ||
16 | this->mEnabled = enabled; | ||
17 | emit this->enabledChanged(); | ||
18 | this->update(); | ||
19 | } | ||
20 | |||
21 | Chrono::Precision Chrono::precision() const { return this->mPrecision; } | ||
22 | |||
23 | void Chrono::setPrecision(Chrono::Precision precision) { | ||
24 | if (precision == this->mPrecision) return; | ||
25 | this->mPrecision = precision; | ||
26 | emit this->precisionChanged(); | ||
27 | this->update(); | ||
28 | } | ||
29 | |||
30 | void Chrono::onTimeout() { | ||
31 | this->setTime(this->targetTime); | ||
32 | this->schedule(this->targetTime); | ||
33 | } | ||
34 | |||
35 | void Chrono::update() { | ||
36 | if (this->mEnabled) { | ||
37 | this->setTime(std::chrono::time_point<std::chrono::system_clock>()); | ||
38 | this->schedule(std::chrono::time_point<std::chrono::system_clock>()); | ||
39 | } else { | ||
40 | this->timer.stop(); | ||
41 | } | ||
42 | } | ||
43 | |||
44 | void Chrono::setTime(const std::chrono::time_point<std::chrono::system_clock>& targetTime) { | ||
45 | auto currentTime = std::chrono::system_clock::now(); | ||
46 | auto offset = std::chrono::duration_cast<std::chrono::milliseconds>(targetTime - currentTime); | ||
47 | this->currentTime = abs(offset.count()) < 500 ? targetTime : currentTime; | ||
48 | |||
49 | switch (this->mPrecision) { | ||
50 | case Chrono::Hours: this->currentTime = std::chrono::time_point_cast<std::chrono::hours>(this->currentTime); | ||
51 | case Chrono::Minutes: this->currentTime = std::chrono::time_point_cast<std::chrono::minutes>(this->currentTime); | ||
52 | case Chrono::Seconds: this->currentTime = std::chrono::time_point_cast<std::chrono::seconds>(this->currentTime); | ||
53 | } | ||
54 | |||
55 | emit this->dateChanged(); | ||
56 | } | ||
57 | |||
58 | void Chrono::schedule(const std::chrono::time_point<std::chrono::system_clock>& targetTime) { | ||
59 | auto currentTime = std::chrono::system_clock::now(); | ||
60 | auto offset = std::chrono::duration_cast<std::chrono::milliseconds>(targetTime - currentTime); | ||
61 | auto nextTime = abs(offset.count()) < 500 ? targetTime : currentTime; | ||
62 | |||
63 | { | ||
64 | using namespace std::chrono_literals; | ||
65 | |||
66 | switch (this->mPrecision) { | ||
67 | case Chrono::Hours: nextTime = std::chrono::time_point_cast<std::chrono::hours>(nextTime) + 1h; | ||
68 | case Chrono::Minutes: nextTime = std::chrono::time_point_cast<std::chrono::minutes>(nextTime) + 1min; | ||
69 | case Chrono::Seconds: nextTime = std::chrono::time_point_cast<std::chrono::seconds>(nextTime) + 1s; | ||
70 | } | ||
71 | } | ||
72 | |||
73 | this->targetTime = nextTime; | ||
74 | auto delay = std::chrono::duration_cast<std::chrono::milliseconds>(nextTime - currentTime); | ||
75 | this->timer.start(delay); | ||
76 | } | ||
77 | |||
78 | QString Chrono::format() const { return this->mFormat; } | ||
79 | void Chrono::setFormat(QString format) { | ||
80 | if (format == this->mFormat) return; | ||
81 | this->mFormat = format; | ||
82 | emit this->formatChanged(); | ||
83 | this->update(); | ||
84 | } | ||
85 | |||
86 | QString Chrono::date() const { | ||
87 | return QString::fromStdString(std::format(std::runtime_format(this->mFormat.toStdString()), std::chrono::zoned_time(std::chrono::current_zone(), std::chrono::time_point_cast<std::chrono::seconds>(this->currentTime)))); | ||
88 | } | ||