@@ -202,10 +202,60 @@ func (u *UIManager) ShowSettings(cfg *config.Config, onSave func(*config.Config)
202202 noteLabel := widget .NewLabel (u .t ("settings.provider.note" ))
203203 noteLabel .Wrapping = fyne .TextWrapWord
204204
205+ // ── Refresh interval ─────────────────────────────────────────────────
206+ intervalSlider := widget .NewSlider (10 , 120 )
207+ intervalSlider .Step = 1
208+ intervalSlider .Value = float64 (cfg .RefreshInterval )
209+ intervalLabel := widget .NewLabel (u .tFmt ("settings.interval.format" , cfg .RefreshInterval ))
210+ intervalSlider .OnChanged = func (v float64 ) {
211+ intervalLabel .SetText (u .tFmt ("settings.interval.format" , int (v )))
212+ }
213+
214+ // applyProviderSliderConstraints updates the slider range and, when
215+ // enforceFloor is true, also clamps the value to the provider minimum.
216+ // Pass enforceFloor=false on initial load so the saved config value is
217+ // preserved; pass enforceFloor=true when the user switches providers.
218+ applyProviderSliderConstraints := func (providerValue string , enforceFloor bool ) {
219+ switch providerValue {
220+ case "openweathermap" :
221+ intervalSlider .Min = 120
222+ intervalSlider .Max = 120
223+ intervalSlider .SetValue (120 )
224+ case "easyweatherwidget" :
225+ intervalSlider .Min = 10
226+ intervalSlider .Max = 120
227+ if enforceFloor && intervalSlider .Value < 30 {
228+ intervalSlider .SetValue (30 )
229+ }
230+ }
231+ intervalLabel .SetText (u .tFmt ("settings.interval.format" , int (intervalSlider .Value )))
232+ }
233+
234+ // Set initial constraints from current config — do NOT enforce the
235+ // floor so the value saved in config is shown as-is.
236+ if cfg .APIConfig != nil && cfg .APIConfig .Provider != "" {
237+ applyProviderSliderConstraints (cfg .APIConfig .Provider , false )
238+ } else {
239+ applyProviderSliderConstraints ("openweathermap" , false )
240+ }
241+
242+ // Track the initial provider so we can detect changes.
243+ initialProvider := "openweathermap"
244+ if cfg .APIConfig != nil && cfg .APIConfig .Provider != "" {
245+ initialProvider = cfg .APIConfig .Provider
246+ }
247+
248+ // Provider change handler is set below, after refreshCityList is defined,
249+ // because switching providers clears the city list.
250+ providerSelect .OnChanged = func (selected string ) {
251+ applyProviderSliderConstraints (providerDisplayToValue [selected ], true )
252+ }
253+
205254 apiSection := container .NewVBox (
206255 widget .NewForm (
207256 widget .NewFormItem (u .t ("settings.provider.label" ), container .NewBorder (nil , nil , nil , getApiBtn , providerSelect )),
208257 widget .NewFormItem (u .t ("settings.provider.apiKeyLabel" ), apiKeyEntry ),
258+ widget .NewFormItem (u .t ("settings.interval.title" ), container .NewHBox (intervalSlider , intervalLabel )),
209259 ),
210260 noteLabel ,
211261 activationCard ,
@@ -300,51 +350,6 @@ func (u *UIManager) ShowSettings(cfg *config.Config, onSave func(*config.Config)
300350 unitRadio .SetSelected (unitCelsiusLabel )
301351 }
302352
303- // ── Refresh interval ─────────────────────────────────────────────────
304- intervalSlider := widget .NewSlider (10 , 120 )
305- intervalSlider .Step = 1
306- intervalSlider .Value = float64 (cfg .RefreshInterval )
307- intervalLabel := widget .NewLabel (u .tFmt ("settings.interval.format" , cfg .RefreshInterval ))
308- intervalSlider .OnChanged = func (v float64 ) {
309- intervalLabel .SetText (u .tFmt ("settings.interval.format" , int (v )))
310- }
311-
312- // Apply initial slider constraints based on current provider.
313- applyProviderSliderConstraints := func (providerValue string ) {
314- switch providerValue {
315- case "openweathermap" :
316- intervalSlider .Min = 120
317- intervalSlider .Max = 120
318- intervalSlider .SetValue (120 )
319- case "easyweatherwidget" :
320- intervalSlider .Min = 10
321- intervalSlider .Max = 120
322- if intervalSlider .Value < 30 {
323- intervalSlider .SetValue (30 )
324- }
325- }
326- intervalLabel .SetText (u .tFmt ("settings.interval.format" , int (intervalSlider .Value )))
327- }
328-
329- // Set initial constraints from current config.
330- if cfg .APIConfig != nil && cfg .APIConfig .Provider != "" {
331- applyProviderSliderConstraints (cfg .APIConfig .Provider )
332- } else {
333- applyProviderSliderConstraints ("openweathermap" )
334- }
335-
336- // Track the initial provider so we can detect changes.
337- initialProvider := "openweathermap"
338- if cfg .APIConfig != nil && cfg .APIConfig .Provider != "" {
339- initialProvider = cfg .APIConfig .Provider
340- }
341-
342- // Provider change handler is set below, after refreshCityList is defined,
343- // because switching providers clears the city list.
344- providerSelect .OnChanged = func (selected string ) {
345- applyProviderSliderConstraints (providerDisplayToValue [selected ])
346- }
347-
348353 // ── RIGHT PANEL ───────────────────────────────────────────────────────
349354 // City list in a scroll area (top), add-form fixed below.
350355
@@ -396,7 +401,7 @@ func (u *UIManager) ShowSettings(cfg *config.Config, onSave func(*config.Config)
396401 // to also clear cities when the provider switches.
397402 providerSelect .OnChanged = func (selected string ) {
398403 newProvider := providerDisplayToValue [selected ]
399- applyProviderSliderConstraints (newProvider )
404+ applyProviderSliderConstraints (newProvider , true )
400405
401406 if newProvider == "openweathermap" {
402407 getApiBtn .SetText (u .t ("settings.provider.getFreeApi" ))
@@ -719,9 +724,6 @@ func (u *UIManager) ShowSettings(cfg *config.Config, onSave func(*config.Config)
719724 sectionBlock (u .t ("settings.temperature.title" ), u .t ("settings.temperature.subtitle" ),
720725 unitRadio ,
721726 ),
722- sectionBlock (u .t ("settings.interval.title" ), u .t ("settings.interval.subtitle" ),
723- container .NewHBox (intervalSlider , intervalLabel ),
724- ),
725727 sectionBlock (u .t ("settings.startup.title" ), u .t ("settings.startup.subtitle" ),
726728 autoStartCheck ,
727729 ),
0 commit comments