diff --git a/app/settings.go b/app/settings.go index a032284b20..9cc2cceabd 100644 --- a/app/settings.go +++ b/app/settings.go @@ -26,8 +26,9 @@ func (sc *SettingsSchema) StoragePath() string { var _ fyne.Settings = (*settings)(nil) type settings struct { - themeLock sync.RWMutex - theme fyne.Theme + themeLock sync.RWMutex + theme fyne.Theme + themeSpecified bool listenerLock sync.Mutex changeListeners []chan fyne.Settings @@ -43,6 +44,11 @@ func (s *settings) Theme() fyne.Theme { } func (s *settings) SetTheme(theme fyne.Theme) { + s.themeSpecified = true + s.applyTheme(theme) +} + +func (s *settings) applyTheme(theme fyne.Theme) { s.themeLock.Lock() defer s.themeLock.Unlock() s.theme = theme @@ -103,17 +109,21 @@ func (s *settings) fileChanged() { } func (s *settings) setupTheme() { + if s.themeSpecified { + return + } name := s.schema.ThemeName if env := os.Getenv("FYNE_THEME"); env != "" { + s.themeSpecified = true name = env } if name == "light" { - s.SetTheme(theme.LightTheme()) + s.applyTheme(theme.LightTheme()) } else if name == "dark" { - s.SetTheme(theme.DarkTheme()) + s.applyTheme(theme.DarkTheme()) } else { - s.SetTheme(defaultTheme()) + s.applyTheme(defaultTheme()) } } diff --git a/app/settings_test.go b/app/settings_test.go index 8b945f9131..803c6e0dda 100644 --- a/app/settings_test.go +++ b/app/settings_test.go @@ -56,3 +56,26 @@ func TestOverrideTheme(t *testing.T) { t.Error(err) } } + +func TestOverrideTheme_IgnoresSettingsChange(t *testing.T) { + // check that a file-load does not overwrite our value + set := &settings{} + err := os.Setenv("FYNE_THEME", "light") + if err != nil { + t.Error(err) + } + set.setupTheme() + assert.Equal(t, theme.LightTheme(), set.Theme()) + err = os.Setenv("FYNE_THEME", "") + if err != nil { + t.Error(err) + } + + err = set.loadFromFile(filepath.Join("testdata", "dark-theme.json")) + if err != nil { + t.Error(err) + } + + set.setupTheme() + assert.Equal(t, theme.LightTheme(), set.Theme()) +} diff --git a/widget/box.go b/widget/box.go index 7cdec656a9..a94add3d6f 100644 --- a/widget/box.go +++ b/widget/box.go @@ -21,7 +21,9 @@ type Box struct { // Refresh updates this box to match the current theme func (b *Box) Refresh() { - b.background = theme.BackgroundColor() + if b.background != nil { + b.background = theme.BackgroundColor() + } b.BaseWidget.Refresh() }