clone

fifteen puzzle games for the terminal, with daily puzzles, weekly ladders and xp, built on bubble tea

refactor/root-tui-model
puzzletea / app / handle_theme.go
handle_theme.go 1.5K
1package app23import (4 "github.com/FelineStateMachine/puzzletea/theme"5 "github.com/FelineStateMachine/puzzletea/ui"67 "charm.land/bubbles/v2/list"8 tea "charm.land/bubbletea/v2"9)1011func (m model) handleThemeEnter() (model, tea.Cmd) {12 m.theme.previous = m.cfg.Theme1314 names := theme.ThemeNames()15 items := make([]list.Item, len(names))16 for i, n := range names {17 desc := "dark theme"18 if n == theme.DefaultThemeName {19 desc = "built-in earth-tone palette"20 } else if t := theme.LookupTheme(n); t != nil && !t.Meta.IsDark {21 desc = "light theme"22 }23 items[i] = ui.MenuItem{ItemTitle: n, Desc: desc}24 }2526 const maxVisibleItems = 827 listH := min(m.height, maxVisibleItems*3)28 listW := min(m.width, theme.MaxNameLen+4)2930 m.theme.list = ui.InitThemeList(items, listW, listH)31 for i, item := range items {32 if mi, ok := item.(ui.MenuItem); ok && mi.ItemTitle == m.theme.previous {33 m.theme.list.Select(i)34 break35 }36 }37 if m.theme.previous == "" {38 m.theme.list.Select(0)39 }4041 m.state = themeSelectView42 m = m.clearNotice()43 m = m.initScreen(themeSelectView)44 return m, nil45}4647func (m model) handleThemeConfirm() (model, tea.Cmd) {48 item, ok := m.theme.list.SelectedItem().(ui.MenuItem)49 if !ok {50 return m, nil51 }5253 themeName := item.ItemTitle54 if themeName == theme.DefaultThemeName {55 themeName = ""56 }5758 _ = theme.Apply(item.ItemTitle)59 m.cfg.Theme = themeName60 if err := m.cfg.Save(m.configPath); err != nil {61 m = m.setErrorf("Theme changed, but saving config failed: %v", err)62 }6364 m.state = mainMenuView65 return m, nil66}