From 17b09739ad4dcc3f78974823afe8b6a1eb08f4a5 Mon Sep 17 00:00:00 2001 From: Olaf Luijks Date: Sat, 29 Nov 2025 10:23:39 +0100 Subject: [PATCH] fix(night-light): replace day/night color temperature inputs with sliders - use separate sliders for night and day temperatures - apply changes on slider release to avoid harsh flashing - add per-slider descriptions and update translations --- Assets/Translations/de.json | 6 +- Assets/Translations/en.json | 6 +- Assets/Translations/es.json | 6 +- Assets/Translations/fr.json | 6 +- Assets/Translations/ja.json | 6 +- Assets/Translations/nl.json | 6 +- Assets/Translations/pt.json | 6 +- Assets/Translations/ru.json | 6 +- Assets/Translations/tr.json | 6 +- Assets/Translations/uk-UA.json | 6 +- Assets/Translations/zh-CN.json | 6 +- Modules/Panels/Settings/Tabs/DisplayTab.qml | 137 +++++++++++++++----- 12 files changed, 146 insertions(+), 57 deletions(-) diff --git a/Assets/Translations/de.json b/Assets/Translations/de.json index 8005efc7..224bd971 100644 --- a/Assets/Translations/de.json +++ b/Assets/Translations/de.json @@ -1258,10 +1258,12 @@ "label": "Nachtlicht" }, "temperature": { - "day": "Tag", "description": "Farbwärme für Nacht- und Tageszeit einstellen.", "label": "Farbtemperatur", - "night": "Nacht" + "day": "Tag", + "day-description": "Steuert die Farbtemperatur tagsüber.", + "night": "Nacht", + "night-description": "Steuert die Farbtemperatur nachts." } }, "title": "Anzeige" diff --git a/Assets/Translations/en.json b/Assets/Translations/en.json index 3f12e31d..8f19fffa 100644 --- a/Assets/Translations/en.json +++ b/Assets/Translations/en.json @@ -1258,10 +1258,12 @@ "label": "Night Light" }, "temperature": { - "day": "Day", "description": "Set the color warmth for nighttime and daytime.", "label": "Color temperature", - "night": "Night" + "day": "Day", + "day-description": "Controls the temperature during daytime.", + "night": "Night", + "night-description": "Controls the temperature during nighttime." } }, "title": "Display" diff --git a/Assets/Translations/es.json b/Assets/Translations/es.json index 525818a0..dc6d9cea 100644 --- a/Assets/Translations/es.json +++ b/Assets/Translations/es.json @@ -1258,10 +1258,12 @@ "label": "Luz nocturna" }, "temperature": { - "day": "Día", "description": "Establece la calidez del color para la noche y el día.", "label": "Temperatura de color", - "night": "Noche" + "day": "Día", + "day-description": "Controla la temperatura durante el día.", + "night": "Noche", + "night-description": "Controla la temperatura durante la noche." } }, "title": "Pantalla" diff --git a/Assets/Translations/fr.json b/Assets/Translations/fr.json index 97a60cc4..d943f1a9 100644 --- a/Assets/Translations/fr.json +++ b/Assets/Translations/fr.json @@ -1258,10 +1258,12 @@ "label": "Éclairage nocturne" }, "temperature": { - "day": "Jour", "description": "Réglez la chaleur des couleurs pour la nuit et le jour.", "label": "Température de couleur", - "night": "Nuit" + "day": "Jour", + "day-description": "Contrôle la température pendant la journée.", + "night": "Nuit", + "night-description": "Contrôle la température pendant la nuit." } }, "title": "Affichage" diff --git a/Assets/Translations/ja.json b/Assets/Translations/ja.json index ed7140aa..9c2ddad4 100644 --- a/Assets/Translations/ja.json +++ b/Assets/Translations/ja.json @@ -1258,10 +1258,12 @@ "label": "夜間モード" }, "temperature": { - "day": "日中", "description": "日中と夜間の色温度(暖かさ)を設定します。", "label": "色温度", - "night": "夜間" + "day": "日中", + "day-description": "昼間の色温度を調整します。", + "night": "夜間", + "night-description": "夜間の色温度を調整します。" } }, "title": "ディスプレイ" diff --git a/Assets/Translations/nl.json b/Assets/Translations/nl.json index 5f2e6e92..1797a4cf 100644 --- a/Assets/Translations/nl.json +++ b/Assets/Translations/nl.json @@ -1258,10 +1258,12 @@ "label": "Nachtlicht" }, "temperature": { - "day": "Dag", "description": "Stel de kleurwarmte voor nacht en dag in.", "label": "Kleurtemperatuur", - "night": "Nacht" + "day": "Dag", + "day-description": "Regelt de kleurtemperatuur overdag.", + "night": "Nacht", + "night-description": "Regelt de kleurtemperatuur 's nachts." } }, "title": "Beeldscherm" diff --git a/Assets/Translations/pt.json b/Assets/Translations/pt.json index 25e9a3e1..795a1b91 100644 --- a/Assets/Translations/pt.json +++ b/Assets/Translations/pt.json @@ -1258,10 +1258,12 @@ "label": "Luz noturna" }, "temperature": { - "day": "Dia", "description": "Defina o quão quente a cor será durante a noite e o dia.", "label": "Temperatura da cor", - "night": "Noite" + "day": "Dia", + "day-description": "Controla a temperatura durante o dia.", + "night": "Noite", + "night-description": "Controla a temperatura durante a noite." } }, "title": "Tela" diff --git a/Assets/Translations/ru.json b/Assets/Translations/ru.json index 781cb0ad..68101157 100644 --- a/Assets/Translations/ru.json +++ b/Assets/Translations/ru.json @@ -1258,10 +1258,12 @@ "label": "Ночной свет" }, "temperature": { - "day": "День", "description": "Установите цветовую температуру для ночного и дневного времени.", "label": "Цветовая температура", - "night": "Ночь" + "day": "День", + "day-description": "Управляет цветовой температурой в дневное время.", + "night": "Ночь", + "night-description": "Управляет цветовой температурой в ночное время." } }, "title": "Дисплей" diff --git a/Assets/Translations/tr.json b/Assets/Translations/tr.json index 9c9eeaed..95b5bf4d 100644 --- a/Assets/Translations/tr.json +++ b/Assets/Translations/tr.json @@ -1258,10 +1258,12 @@ "label": "Gece ışığı" }, "temperature": { - "day": "Gündüz", "description": "Gece ve gündüz için renk sıcaklığını ayarlayın.", "label": "Renk sıcaklığı", - "night": "Gece" + "day": "Gündüz", + "day-description": "Gündüz saatlerindeki renk sıcaklığını kontrol eder.", + "night": "Gece", + "night-description": "Gece saatlerindeki renk sıcaklığını kontrol eder." } }, "title": "Görüntü" diff --git a/Assets/Translations/uk-UA.json b/Assets/Translations/uk-UA.json index 009b9401..5a09ecca 100644 --- a/Assets/Translations/uk-UA.json +++ b/Assets/Translations/uk-UA.json @@ -1258,10 +1258,12 @@ "label": "Нічне світло" }, "temperature": { - "day": "День", "description": "Встановіть теплоту кольору для нічного та денного часу.", "label": "Колірна температура", - "night": "Ніч" + "day": "День", + "day-description": "Керує колірною температурою вдень.", + "night": "Ніч", + "night-description": "Керує колірною температурою вночі." } }, "title": "Дисплей" diff --git a/Assets/Translations/zh-CN.json b/Assets/Translations/zh-CN.json index e7347ca1..dffb9f19 100644 --- a/Assets/Translations/zh-CN.json +++ b/Assets/Translations/zh-CN.json @@ -1258,10 +1258,12 @@ "label": "夜间模式" }, "temperature": { - "day": "白天", "description": "设置夜间和白天的颜色温暖度。", "label": "色温", - "night": "夜间" + "day": "白天", + "day-description": "控制白天的色温。", + "night": "夜间", + "night-description": "控制夜间的色温。" } }, "title": "显示" diff --git a/Modules/Panels/Settings/Tabs/DisplayTab.qml b/Modules/Panels/Settings/Tabs/DisplayTab.qml index eac33485..2a209057 100644 --- a/Modules/Panels/Settings/Tabs/DisplayTab.qml +++ b/Modules/Panels/Settings/Tabs/DisplayTab.qml @@ -232,63 +232,130 @@ ColumnLayout { // Temperature ColumnLayout { - spacing: Style.marginXS - Layout.alignment: Qt.AlignVCenter + visible: Settings.data.nightLight.enabled + spacing: Style.marginM + Layout.fillWidth: true + // Night temperature NLabel { - label: I18n.tr("settings.display.night-light.temperature.label") - description: I18n.tr("settings.display.night-light.temperature.description") + label: I18n.tr("settings.display.night-light.temperature.night") + description: I18n.tr("settings.display.night-light.temperature.night-description") + Layout.fillWidth: true } RowLayout { - visible: Settings.data.nightLight.enabled + Layout.fillWidth: true spacing: Style.marginM - Layout.fillWidth: false - Layout.fillHeight: true - Layout.alignment: Qt.AlignVCenter - NText { - text: I18n.tr("settings.display.night-light.temperature.night") - pointSize: Style.fontSizeM - color: Color.mOnSurfaceVariant - Layout.alignment: Qt.AlignVCenter - } + NSlider { + id: nightSlider + Layout.fillWidth: true - NTextInput { - text: Settings.data.nightLight.nightTemp - inputMethodHints: Qt.ImhDigitsOnly - Layout.alignment: Qt.AlignVCenter - onEditingFinished: { - var nightTemp = parseInt(text); + from: 1000 + to: 6500 + value: Settings.data.nightLight.nightTemp + + // Clamp as the thumb moves, but do NOT change Settings here + onValueChanged: { var dayTemp = parseInt(Settings.data.nightLight.dayTemp); - if (!isNaN(nightTemp) && !isNaN(dayTemp)) { - // Clamp value between [1000 .. (dayTemp-500)] - var clampedValue = Math.min(dayTemp - 500, Math.max(1000, nightTemp)); - text = Settings.data.nightLight.nightTemp = clampedValue.toString(); + var v = Math.round(value); + + if (!isNaN(dayTemp)) { + var maxNight = dayTemp - 500; + v = Math.min(maxNight, Math.max(1000, v)); + } else { + v = Math.max(1000, v); + } + + if (v !== value) + value = v; + } + + // Only write back to Settings when the user releases the slider + onPressedChanged: { + if (!pressed) { + var dayTemp = parseInt(Settings.data.nightLight.dayTemp); + var v = Math.round(value); + + if (!isNaN(dayTemp)) { + var maxNight = dayTemp - 500; + v = Math.min(maxNight, Math.max(1000, v)); + } else { + v = Math.max(1000, v); + } + + Settings.data.nightLight.nightTemp = v; } } } NText { - text: I18n.tr("settings.display.night-light.temperature.day") + text: nightSlider.value + "K" pointSize: Style.fontSizeM color: Color.mOnSurfaceVariant Layout.alignment: Qt.AlignVCenter } - NTextInput { - text: Settings.data.nightLight.dayTemp - inputMethodHints: Qt.ImhDigitsOnly - Layout.alignment: Qt.AlignVCenter - onEditingFinished: { - var dayTemp = parseInt(text); + } + + // Day temperature + NLabel { + label: I18n.tr("settings.display.night-light.temperature.day") + description: I18n.tr("settings.display.night-light.temperature.day-description") + Layout.fillWidth: true + } + + RowLayout { + Layout.fillWidth: true + spacing: Style.marginM + + NSlider { + id: daySlider + Layout.fillWidth: true + + from: 1000 + to: 6500 + value: Settings.data.nightLight.dayTemp + + // Clamp as the thumb moves, but do NOT change Settings here + onValueChanged: { var nightTemp = parseInt(Settings.data.nightLight.nightTemp); - if (!isNaN(nightTemp) && !isNaN(dayTemp)) { - // Clamp value between [(nightTemp+500) .. 6500] - var clampedValue = Math.max(nightTemp + 500, Math.min(6500, dayTemp)); - text = Settings.data.nightLight.dayTemp = clampedValue.toString(); + var v = Math.round(value); + + if (!isNaN(nightTemp)) { + var minDay = nightTemp + 500; + v = Math.max(minDay, Math.min(6500, v)); + } else { + v = Math.min(6500, v); + } + + if (v !== value) + value = v; + } + + // Only write back to Settings when the user releases the slider + onPressedChanged: { + if (!pressed) { + var nightTemp = parseInt(Settings.data.nightLight.nightTemp); + var v = Math.round(value); + + if (!isNaN(nightTemp)) { + var minDay = nightTemp + 500; + v = Math.max(minDay, Math.min(6500, v)); + } else { + v = Math.min(6500, v); + } + + Settings.data.nightLight.dayTemp = v; } } } + + NText { + text: daySlider.value + "K" + pointSize: Style.fontSizeM + color: Color.mOnSurfaceVariant + Layout.alignment: Qt.AlignVCenter + } } }