forked from quickshell/quickshell
core/clock: add SystemClock
This commit is contained in:
parent
ba1e535f9c
commit
76744c903a
4 changed files with 133 additions and 0 deletions
|
@ -36,6 +36,7 @@ qt_add_library(quickshell-core STATIC
|
||||||
popupanchor.cpp
|
popupanchor.cpp
|
||||||
types.cpp
|
types.cpp
|
||||||
qsmenuanchor.cpp
|
qsmenuanchor.cpp
|
||||||
|
clock.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set_source_files_properties(main.cpp PROPERTIES COMPILE_DEFINITIONS GIT_REVISION="${GIT_REVISION}")
|
set_source_files_properties(main.cpp PROPERTIES COMPILE_DEFINITIONS GIT_REVISION="${GIT_REVISION}")
|
||||||
|
|
66
src/core/clock.cpp
Normal file
66
src/core/clock.cpp
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
#include "clock.hpp"
|
||||||
|
|
||||||
|
#include <qdatetime.h>
|
||||||
|
#include <qobject.h>
|
||||||
|
#include <qtimer.h>
|
||||||
|
#include <qtmetamacros.h>
|
||||||
|
|
||||||
|
#include "util.hpp"
|
||||||
|
|
||||||
|
SystemClock::SystemClock(QObject* parent): QObject(parent) {
|
||||||
|
QObject::connect(&this->timer, &QTimer::timeout, this, &SystemClock::update);
|
||||||
|
this->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SystemClock::enabled() const { return this->mEnabled; }
|
||||||
|
|
||||||
|
void SystemClock::setEnabled(bool enabled) {
|
||||||
|
if (enabled == this->mEnabled) return;
|
||||||
|
this->mEnabled = enabled;
|
||||||
|
emit this->enabledChanged();
|
||||||
|
this->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
SystemClock::Enum SystemClock::precision() const { return this->mPrecision; }
|
||||||
|
|
||||||
|
void SystemClock::setPrecision(SystemClock::Enum precision) {
|
||||||
|
if (precision == this->mPrecision) return;
|
||||||
|
this->mPrecision = precision;
|
||||||
|
emit this->precisionChanged();
|
||||||
|
this->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SystemClock::update() {
|
||||||
|
auto time = QTime::currentTime();
|
||||||
|
|
||||||
|
if (this->mEnabled) {
|
||||||
|
auto secondPrecision = this->mPrecision >= SystemClock::Seconds;
|
||||||
|
auto secondChanged = this->setSeconds(secondPrecision ? time.second() : 0);
|
||||||
|
|
||||||
|
auto minutePrecision = this->mPrecision >= SystemClock::Minutes;
|
||||||
|
auto minuteChanged = this->setMinutes(minutePrecision ? time.minute() : 0);
|
||||||
|
|
||||||
|
auto hourPrecision = this->mPrecision >= SystemClock::Hours;
|
||||||
|
auto hourChanged = this->setHours(hourPrecision ? time.hour() : 0);
|
||||||
|
|
||||||
|
DropEmitter::call(secondChanged, minuteChanged, hourChanged);
|
||||||
|
|
||||||
|
auto nextTime = QTime(
|
||||||
|
hourPrecision ? time.hour() : 0,
|
||||||
|
minutePrecision ? time.minute() : 0,
|
||||||
|
secondPrecision ? time.second() : 0
|
||||||
|
);
|
||||||
|
|
||||||
|
if (secondPrecision) nextTime = nextTime.addSecs(1);
|
||||||
|
else if (minutePrecision) nextTime = nextTime.addSecs(60);
|
||||||
|
else if (hourPrecision) nextTime = nextTime.addSecs(3600);
|
||||||
|
|
||||||
|
this->timer.start(time.msecsTo(nextTime));
|
||||||
|
} else {
|
||||||
|
this->timer.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFINE_MEMBER_GETSET(SystemClock, hours, setHours);
|
||||||
|
DEFINE_MEMBER_GETSET(SystemClock, minutes, setMinutes);
|
||||||
|
DEFINE_MEMBER_GETSET(SystemClock, seconds, setSeconds);
|
65
src/core/clock.hpp
Normal file
65
src/core/clock.hpp
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <qobject.h>
|
||||||
|
#include <qqmlintegration.h>
|
||||||
|
#include <qtimer.h>
|
||||||
|
#include <qtmetamacros.h>
|
||||||
|
|
||||||
|
#include "util.hpp"
|
||||||
|
|
||||||
|
///! System clock accessor.
|
||||||
|
class SystemClock: public QObject {
|
||||||
|
Q_OBJECT;
|
||||||
|
/// If the clock should update. Defaults to true.
|
||||||
|
///
|
||||||
|
/// Setting enabled to false pauses the clock.
|
||||||
|
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged);
|
||||||
|
/// The precision the clock should measure at. Defaults to `SystemClock.Seconds`.
|
||||||
|
Q_PROPERTY(SystemClock::Enum precision READ precision WRITE setPrecision NOTIFY precisionChanged);
|
||||||
|
/// The current hour.
|
||||||
|
Q_PROPERTY(quint32 hours READ hours NOTIFY hoursChanged);
|
||||||
|
/// The current minute, or 0 if @@precision is `SystemClock.Hours`.
|
||||||
|
Q_PROPERTY(quint32 minutes READ minutes NOTIFY minutesChanged);
|
||||||
|
/// The current second, or 0 if @@precision is `SystemClock.Hours` or `SystemClock.Minutes`.
|
||||||
|
Q_PROPERTY(quint32 seconds READ seconds NOTIFY secondsChanged);
|
||||||
|
QML_ELEMENT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// must be named enum until docgen is ready to handle member enums better
|
||||||
|
enum Enum {
|
||||||
|
Hours = 1,
|
||||||
|
Minutes = 2,
|
||||||
|
Seconds = 3,
|
||||||
|
};
|
||||||
|
Q_ENUM(Enum);
|
||||||
|
|
||||||
|
explicit SystemClock(QObject* parent = nullptr);
|
||||||
|
|
||||||
|
[[nodiscard]] bool enabled() const;
|
||||||
|
void setEnabled(bool enabled);
|
||||||
|
|
||||||
|
[[nodiscard]] SystemClock::Enum precision() const;
|
||||||
|
void setPrecision(SystemClock::Enum precision);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void enabledChanged();
|
||||||
|
void precisionChanged();
|
||||||
|
void hoursChanged();
|
||||||
|
void minutesChanged();
|
||||||
|
void secondsChanged();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void update();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool mEnabled = true;
|
||||||
|
SystemClock::Enum mPrecision = SystemClock::Seconds;
|
||||||
|
quint32 mHours = 0;
|
||||||
|
quint32 mMinutes = 0;
|
||||||
|
quint32 mSeconds = 0;
|
||||||
|
QTimer timer;
|
||||||
|
|
||||||
|
DECLARE_PRIVATE_MEMBER(SystemClock, hours, setHours, mHours, hoursChanged);
|
||||||
|
DECLARE_PRIVATE_MEMBER(SystemClock, minutes, setMinutes, mMinutes, minutesChanged);
|
||||||
|
DECLARE_PRIVATE_MEMBER(SystemClock, seconds, setSeconds, mSeconds, secondsChanged);
|
||||||
|
};
|
|
@ -27,5 +27,6 @@ headers = [
|
||||||
"popupanchor.hpp",
|
"popupanchor.hpp",
|
||||||
"types.hpp",
|
"types.hpp",
|
||||||
"qsmenuanchor.hpp",
|
"qsmenuanchor.hpp",
|
||||||
|
"clock.hpp",
|
||||||
]
|
]
|
||||||
-----
|
-----
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue