Prevent weather icon flicker

This commit is contained in:
David Heinemeier Hansson
2026-07-18 21:19:10 -07:00
parent c7952c980f
commit be1aab859d
3 changed files with 10 additions and 1 deletions
+7
View File
@@ -194,6 +194,12 @@ function currentIcon(current, fallback) {
return fallback || ""
}
// wttr.in has no day/night flag. Use its icon only to fill an empty initial
// state, never to replace a day/night-aware icon resolved by Open-Meteo.
function provisionalCurrentIcon(current, resolvedIcon) {
return resolvedIcon || currentIcon(current, "")
}
function weatherResponseCompletesSave(hasConfiguredCoordinates, source) {
return hasConfiguredCoordinates ? source === "open-meteo" : source === "wttr"
}
@@ -290,6 +296,7 @@ if (typeof module !== "undefined") {
openMeteoForecastDays: openMeteoForecastDays,
openMeteoCurrentCondition: openMeteoCurrentCondition,
currentIcon: currentIcon,
provisionalCurrentIcon: provisionalCurrentIcon,
weatherResponseCompletesSave: weatherResponseCompletesSave,
wttrNextForecastDays: wttrNextForecastDays,
buildForecastDays: buildForecastDays,
+1 -1
View File
@@ -315,7 +315,7 @@ Panel {
var parsed = JSON.parse(raw)
root.report = parsed
if (!root.hasConfiguredCoordinates)
root.label = Model.currentIcon(parsed.current_condition && parsed.current_condition[0], root.label)
root.label = Model.provisionalCurrentIcon(parsed.current_condition && parsed.current_condition[0], root.label)
root.forecastRetries = 0
if (Model.weatherResponseCompletesSave(root.hasConfiguredCoordinates, "wttr"))
root.finishSavingLocation()
+2
View File
@@ -112,6 +112,8 @@ assert(weather.dayIcon({ openMeteoWeatherCode: 95 }).length > 0, 'weather maps O
assertEqual(weather.currentIcon({ openMeteoWeatherCode: 0, isDay: 1 }, ''), weather.iconForOpenMeteoCode(0), 'weather uses the current Open-Meteo icon with current values')
assertEqual(weather.currentIcon({ openMeteoWeatherCode: 0, isDay: 0 }, ''), weather.iconForCode(113, true), 'weather uses the nighttime Open-Meteo icon after sunset')
assert(weather.iconForOpenMeteoCode(45, true) !== weather.iconForOpenMeteoCode(45, false), 'weather distinguishes nighttime fog from daytime fog')
assertEqual(weather.provisionalCurrentIcon({ weatherCode: 113 }, ''), weather.iconForCode(113, false), 'weather uses wttr to fill an empty initial icon')
assertEqual(weather.provisionalCurrentIcon({ weatherCode: 113 }, 'night'), 'night', 'weather refresh preserves a resolved day-night icon')
assert(
fs.readFileSync(root + '/shell/plugins/panels/weather/Panel.qml', 'utf8').includes('text: root.label || "—"'),
'weather hero and bar use the same resolved icon'