102 lines
2.9 KiB
QML
102 lines
2.9 KiB
QML
pragma Singleton
|
|
|
|
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Io
|
|
import qs.Commons
|
|
import qs.Services
|
|
|
|
Singleton {
|
|
id: root
|
|
|
|
// Night Light properties - directly bound to settings
|
|
readonly property var params: Settings.data.nightLight
|
|
property var lastCommand: []
|
|
|
|
function apply() {
|
|
// If using LocationService, wait for it to be ready
|
|
if (!params.forced && params.autoSchedule && !LocationService.coordinatesReady) {
|
|
return
|
|
}
|
|
|
|
var command = buildCommand()
|
|
|
|
// Compare with previous command to avoid unecessary restart
|
|
if (JSON.stringify(command) !== JSON.stringify(lastCommand)) {
|
|
lastCommand = command
|
|
runner.command = command
|
|
|
|
// Set running to false so it may restarts below if still enabled
|
|
runner.running = false
|
|
}
|
|
runner.running = params.enabled
|
|
}
|
|
|
|
function buildCommand() {
|
|
var cmd = ["wlsunset"]
|
|
if (params.forced) {
|
|
// Force immediate full night temperature regardless of time
|
|
// Keep distinct day/night temps but set times so we're effectively always in "night"
|
|
cmd.push("-t", `${params.nightTemp}`, "-T", `${params.dayTemp}`)
|
|
// Night spans from sunset (00:00) to sunrise (23:59) covering almost the full day
|
|
cmd.push("-S", "23:59") // sunrise very late
|
|
cmd.push("-s", "00:00") // sunset at midnight
|
|
// Near-instant transition
|
|
cmd.push("-d", 1)
|
|
} else {
|
|
cmd.push("-t", `${params.nightTemp}`, "-T", `${params.dayTemp}`)
|
|
if (params.autoSchedule) {
|
|
cmd.push("-l", `${LocationService.stableLatitude}`, "-L", `${LocationService.stableLongitude}`)
|
|
} else {
|
|
cmd.push("-S", params.manualSunrise)
|
|
cmd.push("-s", params.manualSunset)
|
|
}
|
|
cmd.push("-d", 60 * 15) // 15min progressive fade at sunset/sunrise
|
|
}
|
|
return cmd
|
|
}
|
|
|
|
// Observe setting changes and location readiness
|
|
Connections {
|
|
target: Settings.data.nightLight
|
|
function onEnabledChanged() {
|
|
apply()
|
|
// Toast: night light toggled
|
|
const enabled = !!Settings.data.nightLight.enabled
|
|
ToastService.showNotice("Night Light", enabled ? "Enabled" : "Disabled")
|
|
}
|
|
function onForcedChanged() {
|
|
apply()
|
|
if (Settings.data.nightLight.enabled) {
|
|
ToastService.showNotice("Night Light", Settings.data.nightLight.forced ? "Forced activation" : "Normal mode")
|
|
}
|
|
}
|
|
function onNightTempChanged() {
|
|
apply()
|
|
}
|
|
function onDayTempChanged() {
|
|
apply()
|
|
}
|
|
}
|
|
|
|
Connections {
|
|
target: LocationService
|
|
function onCoordinatesReadyChanged() {
|
|
if (LocationService.coordinatesReady) {
|
|
apply()
|
|
}
|
|
}
|
|
}
|
|
|
|
// Foreground process runner
|
|
Process {
|
|
id: runner
|
|
running: false
|
|
onStarted: {
|
|
Logger.log("NightLight", "Wlsunset started:", runner.command)
|
|
}
|
|
onExited: function (code, status) {
|
|
Logger.log("NightLight", "Wlsunset exited:", code, status)
|
|
}
|
|
}
|
|
}
|