Themes
Switch between dark, light and system themes in a Fyne application.
Show Code
package main
import ( "image/color"
"fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget")
// customTheme wraps a base theme but forces a specific variant.type customTheme struct { base fyne.Theme variant fyne.ThemeVariant}
func (t *customTheme) Color(n fyne.ThemeColorName, _ fyne.ThemeVariant) color.Color { return t.base.Color(n, t.variant)}func (t *customTheme) Icon(n fyne.ThemeIconName) fyne.Resource { return t.base.Icon(n) }func (t *customTheme) Font(s fyne.TextStyle) fyne.Resource { return t.base.Font(s) }func (t *customTheme) Size(n fyne.ThemeSizeName) float32 { return t.base.Size(n) }
func main() { a := app.New() w := a.NewWindow("Theme Toggle")
mode := 0 // 0=System, 1=Dark, 2=Light
apply := func() { switch mode { case 0: // system fyne.CurrentApp().Settings().SetTheme(theme.DefaultTheme()) case 1: // dark fyne.CurrentApp().Settings().SetTheme( &customTheme{base: theme.DefaultTheme(), variant: theme.VariantDark}, ) case 2: // light. fyne.CurrentApp().Settings().SetTheme( &customTheme{base: theme.DefaultTheme(), variant: theme.VariantLight}, ) } }
btn := widget.NewButton("Toggle Theme", func() { mode = (mode + 1) % 3 apply() })
w.SetContent(container.NewCenter(btn)) w.Resize(fyne.NewSize(520, 300)) apply() // start in System/adaptive w.ShowAndRun()}