103 lines
2.7 KiB
QML
103 lines
2.7 KiB
QML
pragma Singleton
|
|
|
|
import qs.config
|
|
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Io
|
|
|
|
Singleton {
|
|
id: root
|
|
property var manualActive
|
|
property string from: Config.services.sunsetFrom
|
|
property string to: Config.services.sunsetTo
|
|
property bool automatic: from !== to
|
|
property bool shouldBeOn
|
|
property bool firstEvaluation: true
|
|
property bool active: false
|
|
|
|
property int fromHour: Number(from.split(":")[0])
|
|
property int fromMinute: Number(from.split(":")[1])
|
|
property int toHour: Number(to.split(":")[0])
|
|
property int toMinute: Number(to.split(":")[1])
|
|
|
|
property int clockHour: Time.hours
|
|
property int clockMinute: Time.minutes
|
|
|
|
onClockMinuteChanged: reEvaluate()
|
|
onAutomaticChanged: {
|
|
root.manualActive = undefined;
|
|
root.firstEvaluation = true;
|
|
reEvaluate();
|
|
}
|
|
function reEvaluate() {
|
|
const t = clockHour * 60 + clockMinute;
|
|
const from = fromHour * 60 + fromMinute;
|
|
const to = toHour * 60 + toMinute;
|
|
|
|
if (from < to) {
|
|
root.shouldBeOn = t >= from && t <= to;
|
|
} else {
|
|
// Wrapped around midnight
|
|
root.shouldBeOn = t >= from || t <= to;
|
|
}
|
|
if (firstEvaluation) {
|
|
firstEvaluation = false;
|
|
root.ensureState();
|
|
}
|
|
}
|
|
|
|
onShouldBeOnChanged: ensureState()
|
|
function ensureState() {
|
|
if (!root.automatic || root.manualActive !== undefined)
|
|
return;
|
|
if (root.shouldBeOn) {
|
|
root.enable();
|
|
} else {
|
|
root.disable();
|
|
}
|
|
}
|
|
|
|
function load() { } // Dummy to force init
|
|
|
|
function enable() {
|
|
root.active = true;
|
|
Quickshell.execDetached(["hyprsunset", "--temperature", Config.services.sunsetTemperature]);
|
|
}
|
|
|
|
function disable() {
|
|
root.active = false;
|
|
Quickshell.execDetached(["pkill", "hyprsunset"]);
|
|
}
|
|
|
|
function fetchState() {
|
|
fetchProc.running = true;
|
|
}
|
|
|
|
Process {
|
|
id: fetchProc
|
|
running: true
|
|
command: ["hyprctl", "hyprsunset", "temperature"]
|
|
stdout: StdioCollector {
|
|
id: stateCollector
|
|
onStreamFinished: {
|
|
const output = stateCollector.text.trim();
|
|
if (output.length == 0 || output.startsWith("Couldn't"))
|
|
root.active = false;
|
|
else
|
|
root.active = (output != "6500");
|
|
}
|
|
}
|
|
}
|
|
|
|
function toggle() {
|
|
if (root.manualActive === undefined)
|
|
root.manualActive = root.active;
|
|
|
|
root.manualActive = !root.manualActive;
|
|
if (root.manualActive) {
|
|
root.enable();
|
|
} else {
|
|
root.disable();
|
|
}
|
|
}
|
|
}
|