From 93b3e4874b254885a12dbd5baa9d2d9fafca1d11 Mon Sep 17 00:00:00 2001 From: Pablo Fuentes Date: Mon, 1 Mar 2021 12:13:21 -0500 Subject: [PATCH] Allow custom themes to react theme variant changes, fixes #2006 (#2049) --- app/settings.go | 36 ++++++++++++++++++----------- app/settings_test.go | 54 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 14 deletions(-) diff --git a/app/settings.go b/app/settings.go index 8da8ccc207..01078999c6 100644 --- a/app/settings.go +++ b/app/settings.go @@ -139,26 +139,36 @@ 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.applyTheme(theme.LightTheme(), theme.VariantLight) - } else if name == "dark" { - s.applyTheme(theme.DarkTheme(), theme.VariantDark) - } else { - if defaultVariant() == theme.VariantLight { - s.applyTheme(theme.LightTheme(), theme.VariantLight) - } else { - s.applyTheme(theme.DarkTheme(), theme.VariantDark) + var variant fyne.ThemeVariant + effectiveTheme := s.theme + switch name { + case "light": + variant = theme.VariantLight + if !s.themeSpecified { + effectiveTheme = theme.LightTheme() + } + case "dark": + variant = theme.VariantDark + if !s.themeSpecified { + effectiveTheme = theme.DarkTheme() + } + default: + variant = defaultVariant() + if s.themeSpecified { + break + } + effectiveTheme = theme.DarkTheme() + if variant == theme.VariantLight { + effectiveTheme = theme.LightTheme() } } + + s.applyTheme(effectiveTheme, variant) } func loadSettings() *settings { diff --git a/app/settings_test.go b/app/settings_test.go index ea2368883e..67592838c7 100644 --- a/app/settings_test.go +++ b/app/settings_test.go @@ -76,16 +76,68 @@ func TestOverrideTheme_IgnoresSettingsChange(t *testing.T) { } set.setupTheme() assert.Equal(t, theme.LightTheme(), set.Theme()) + + err = set.loadFromFile(filepath.Join("testdata", "dark-theme.json")) + 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) } +} + +func TestCustomTheme(t *testing.T) { + type customTheme struct { + fyne.Theme + } + set := &settings{} + ctheme := &customTheme{theme.LightTheme()} + set.SetTheme(ctheme) + + set.setupTheme() + assert.True(t, set.Theme() == ctheme) + assert.Equal(t, defaultVariant(), set.ThemeVariant()) + + err := set.loadFromFile(filepath.Join("testdata", "light-theme.json")) + if err != nil { + t.Error(err) + } + set.setupTheme() + assert.True(t, set.Theme() == ctheme) + assert.Equal(t, theme.VariantLight, set.ThemeVariant()) err = set.loadFromFile(filepath.Join("testdata", "dark-theme.json")) if err != nil { t.Error(err) } + set.setupTheme() + assert.True(t, set.Theme() == ctheme) + assert.Equal(t, theme.VariantDark, set.ThemeVariant()) + err = os.Setenv("FYNE_THEME", "light") + if err != nil { + t.Error(err) + } set.setupTheme() - assert.Equal(t, theme.LightTheme(), set.Theme()) + assert.True(t, set.Theme() == ctheme) + assert.Equal(t, theme.VariantLight, set.ThemeVariant()) + + err = os.Setenv("FYNE_THEME", "dark") + if err != nil { + t.Error(err) + } + set.setupTheme() + assert.True(t, set.Theme() == ctheme) + assert.Equal(t, theme.VariantDark, set.ThemeVariant()) + + err = os.Setenv("FYNE_THEME", "") + if err != nil { + t.Error(err) + } + set.setupTheme() + assert.True(t, set.Theme() == ctheme) + assert.Equal(t, theme.VariantDark, set.ThemeVariant()) }