NightLight: add force activation

This commit is contained in:
Ly-sec 2025-09-10 12:34:52 +02:00
parent 74fce51c2d
commit d91a635781
4 changed files with 58 additions and 11 deletions

View file

@ -443,6 +443,7 @@ Singleton {
// night light // night light
property JsonObject nightLight: JsonObject { property JsonObject nightLight: JsonObject {
property bool enabled: false property bool enabled: false
property bool forced: false
property bool autoSchedule: true property bool autoSchedule: true
property string nightTemp: "4000" property string nightTemp: "4000"
property string dayTemp: "6500" property string dayTemp: "6500"

View file

@ -15,14 +15,24 @@ NIconButton {
property real scaling: 1.0 property real scaling: 1.0
sizeRatio: 0.8 sizeRatio: 0.8
colorBg: Settings.data.nightLight.enabled ? Color.mPrimary : Color.mSurfaceVariant colorBg: Settings.data.nightLight.enabled ? (Settings.data.nightLight.forced ? Color.mTertiary : Color.mPrimary) : Color.mSurfaceVariant
colorFg: Settings.data.nightLight.enabled ? Color.mOnPrimary : Color.mOnSurface colorFg: Settings.data.nightLight.enabled ? Color.mOnPrimary : Color.mOnSurface
colorBorder: Color.transparent colorBorder: Color.transparent
colorBorderHover: Color.transparent colorBorderHover: Color.transparent
icon: Settings.data.nightLight.enabled ? "nightlight-on" : "nightlight-off" icon: Settings.data.nightLight.enabled ? (Settings.data.nightLight.forced ? "alert-triangle" : "nightlight-on") : "nightlight-off"
tooltipText: `Night light: ${Settings.data.nightLight.enabled ? "enabled." : "disabled."}\nLeft click to toggle.\nRight click to access settings.` tooltipText: `Night light: ${Settings.data.nightLight.enabled ? (Settings.data.nightLight.forced ? "forced." : "enabled.") : "disabled."}\nLeft click to cycle (disabled normal forced).\nRight click to access settings.`
onClicked: Settings.data.nightLight.enabled = !Settings.data.nightLight.enabled onClicked: {
if (!Settings.data.nightLight.enabled) {
Settings.data.nightLight.enabled = true
Settings.data.nightLight.forced = false
} else if (Settings.data.nightLight.enabled && !Settings.data.nightLight.forced) {
Settings.data.nightLight.forced = true
} else {
Settings.data.nightLight.enabled = false
Settings.data.nightLight.forced = false
}
}
onRightClicked: { onRightClicked: {
var settingsPanel = PanelService.getPanel("settingsPanel") var settingsPanel = PanelService.getPanel("settingsPanel")

View file

@ -194,6 +194,7 @@ ColumnLayout {
wlsunsetCheck.running = true wlsunsetCheck.running = true
} else { } else {
Settings.data.nightLight.enabled = false Settings.data.nightLight.enabled = false
Settings.data.nightLight.forced = false
NightLightService.apply() NightLightService.apply()
ToastService.showNotice("Night Light", "Disabled") ToastService.showNotice("Night Light", "Disabled")
} }
@ -276,6 +277,7 @@ ColumnLayout {
ColumnLayout { ColumnLayout {
spacing: Style.marginXS * scaling spacing: Style.marginXS * scaling
visible: Settings.data.nightLight.enabled && !Settings.data.nightLight.autoSchedule visible: Settings.data.nightLight.enabled && !Settings.data.nightLight.autoSchedule
&& !Settings.data.nightLight.forced
RowLayout { RowLayout {
Layout.fillWidth: false Layout.fillWidth: false
@ -319,4 +321,21 @@ ColumnLayout {
} }
} }
} }
// Force activation toggle
NToggle {
label: "Force activation"
description: "Immediately apply night temperature without scheduling or fade."
checked: Settings.data.nightLight.forced
onToggled: checked => {
Settings.data.nightLight.forced = checked
if (checked && !Settings.data.nightLight.enabled) {
// Ensure enabled when forcing
wlsunsetCheck.running = true
} else {
NightLightService.apply()
}
}
visible: Settings.data.nightLight.enabled
}
} }

View file

@ -15,7 +15,7 @@ Singleton {
function apply() { function apply() {
// If using LocationService, wait for it to be ready // If using LocationService, wait for it to be ready
if (params.autoSchedule && !LocationService.coordinatesReady) { if (!params.forced && params.autoSchedule && !LocationService.coordinatesReady) {
return return
} }
@ -34,14 +34,25 @@ Singleton {
function buildCommand() { function buildCommand() {
var cmd = ["wlsunset"] var cmd = ["wlsunset"]
cmd.push("-t", `${params.nightTemp}`, "-T", `${params.dayTemp}`) if (params.forced) {
if (params.autoSchedule) { // Force immediate full night temperature regardless of time
cmd.push("-l", `${LocationService.stableLatitude}`, "-L", `${LocationService.stableLongitude}`) // 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 { } else {
cmd.push("-S", params.manualSunrise) cmd.push("-t", `${params.nightTemp}`, "-T", `${params.dayTemp}`)
cmd.push("-s", params.manualSunset) 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
} }
cmd.push("-d", 60 * 15) // 15min progressive fade at sunset/sunrise
return cmd return cmd
} }
@ -54,6 +65,12 @@ Singleton {
const enabled = !!Settings.data.nightLight.enabled const enabled = !!Settings.data.nightLight.enabled
ToastService.showNotice("Night Light", enabled ? "Enabled" : "Disabled") 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() { function onNightTempChanged() {
apply() apply()
} }