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(); } } }