From 31d1664619d9832f7261a84d006c82e3b66eb0ba Mon Sep 17 00:00:00 2001 From: The Magician Date: Wed, 5 Jun 2024 14:13:29 +0100 Subject: [PATCH] Add keybindings and help menu --- sevenkeys/ui/model.go | 61 +++++++++++++++++++++++++++++++++++++++++- sevenkeys/ui/update.go | 10 ++++--- sevenkeys/ui/view.go | 26 +++++++++++------- 3 files changed, 84 insertions(+), 13 deletions(-) diff --git a/sevenkeys/ui/model.go b/sevenkeys/ui/model.go index 0130832..9a794e6 100644 --- a/sevenkeys/ui/model.go +++ b/sevenkeys/ui/model.go @@ -1,10 +1,69 @@ package ui +import ( + "github.com/charmbracelet/bubbles/help" + "github.com/charmbracelet/bubbles/key" +) + +type KeyMap struct { + Update key.Binding + SearchCriteria key.Binding + Search key.Binding + StorageOptions key.Binding + Find key.Binding + Quit key.Binding +} + +func (k KeyMap) ShortHelp() []key.Binding { + return []key.Binding{k.Update, k.SearchCriteria, k.Search, k.StorageOptions, k.Find, k.Quit} +} + +func (k KeyMap) FullHelp() [][]key.Binding { + return [][]key.Binding{ + {k.Update, k.SearchCriteria, k.Search}, + {k.StorageOptions, k.Find, k.Quit}, + } +} + +var DefaultKeyMap = KeyMap{ + Update: key.NewBinding( + key.WithKeys("u"), + key.WithHelp("u", "update database"), + ), + SearchCriteria: key.NewBinding( + key.WithKeys("c"), + key.WithHelp("c", "card printing search criteria"), + ), + Search: key.NewBinding( + key.WithKeys("s"), + key.WithHelp("s", "card printing search"), + ), + StorageOptions: key.NewBinding( + key.WithKeys("o"), + key.WithHelp("o", "card storage options"), + ), + Find: key.NewBinding( + key.WithKeys("f"), + key.WithHelp("f", "find in storage"), + ), + Quit: key.NewBinding( + key.WithKeys("ctrl+c", "q"), + key.WithHelp("q", "quit program"), + ), +} + type Model struct { WindowHeight int WindowWidth int + + Help help.Model } func NewModel() Model { - return Model{} + help := help.New() + help.ShortSeparator = help.FullSeparator + + return Model{ + Help: help, + } } diff --git a/sevenkeys/ui/update.go b/sevenkeys/ui/update.go index dcde0db..9410b2b 100644 --- a/sevenkeys/ui/update.go +++ b/sevenkeys/ui/update.go @@ -1,6 +1,9 @@ package ui -import tea "github.com/charmbracelet/bubbletea" +import ( + "github.com/charmbracelet/bubbles/key" + tea "github.com/charmbracelet/bubbletea" +) func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmd tea.Cmd @@ -9,10 +12,11 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.WindowSizeMsg: m.WindowHeight = msg.Height m.WindowWidth = msg.Width + m.Help.Width = msg.Width return m, nil case tea.KeyMsg: - switch msg.String() { - case "ctrl+c": + switch { + case key.Matches(msg, DefaultKeyMap.Quit): return m, tea.Quit } break diff --git a/sevenkeys/ui/view.go b/sevenkeys/ui/view.go index 0e1d9e2..1d886ec 100644 --- a/sevenkeys/ui/view.go +++ b/sevenkeys/ui/view.go @@ -3,6 +3,7 @@ package ui import ( "os" "path/filepath" + "strings" "github.com/lukesampson/figlet/figletlib" ) @@ -10,16 +11,23 @@ import ( func (m Model) View() string { var ui string - if m.WindowWidth > 0 { - cwd, _ := os.Getwd() - fontsdir := filepath.Join(cwd, "fonts") - - slantFont, _ := figletlib.GetFontByName(fontsdir, "slant") - termFont, _ := figletlib.GetFontByName(fontsdir, "term") - - ui += figletlib.SprintMsg("SEVENKEYS", slantFont, m.WindowWidth, slantFont.Settings(), "center") - ui += figletlib.SprintMsg("the ultimate Magic: the Gathering trading card storage system", termFont, m.WindowWidth, termFont.Settings(), "center") + if m.WindowWidth <= 0 { + return ui } + // Get fonts for figlet + cwd, _ := os.Getwd() + fontsdir := filepath.Join(cwd, "fonts") + slantFont, _ := figletlib.GetFontByName(fontsdir, "slant") + termFont, _ := figletlib.GetFontByName(fontsdir, "term") + + // Display splash screen + ui += figletlib.SprintMsg("SEVENKEYS", slantFont, m.WindowWidth, slantFont.Settings(), "center") + ui += figletlib.SprintMsg("the ultimate Magic: the Gathering trading card storage system", termFont, m.WindowWidth, termFont.Settings(), "center") + + // Display help + ui += strings.Repeat("\n", m.WindowHeight-8) // TODO: Avoid hardcoding height somehow + ui += m.Help.View(DefaultKeyMap) + return ui }