NightLight: add force activation
This commit is contained in:
parent
74fce51c2d
commit
d91a635781
4 changed files with 58 additions and 11 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue