Files
termdoku/internal/ui/keymap.go

98 lines
3.1 KiB
Go

package ui
import (
"github.com/charmbracelet/bubbles/key"
"strings"
)
type KeyMap struct {
Up, Down, Left, Right key.Binding
Undo, Redo key.Binding
ToggleAuto key.Binding
ToggleTimer key.Binding
Help key.Binding
MainMenu key.Binding
Hint key.Binding
Pause key.Binding
ToggleNote key.Binding
Save key.Binding
Load key.Binding
}
func DefaultKeyMap() KeyMap {
return KeyMap{
Up: key.NewBinding(key.WithKeys("up", "k"), key.WithHelp("↑/k", "Up")),
Down: key.NewBinding(key.WithKeys("down", "j"), key.WithHelp("↓/j", "Down")),
Left: key.NewBinding(key.WithKeys("left", "h"), key.WithHelp("←/h", "Left")),
Right: key.NewBinding(key.WithKeys("right", "l"), key.WithHelp("→/l", "Right")),
Undo: key.NewBinding(key.WithKeys("ctrl+z", "u"), key.WithHelp("u/Ctrl+Z", "Undo")),
Redo: key.NewBinding(key.WithKeys("ctrl+y", "ctrl+r"), key.WithHelp("Ctrl+Y/R", "Redo")),
ToggleAuto: key.NewBinding(key.WithKeys("a"), key.WithHelp("a", "Auto-Check")),
ToggleTimer: key.NewBinding(key.WithKeys("t"), key.WithHelp("t", "Timer")),
Help: key.NewBinding(key.WithKeys("?"), key.WithHelp("?", "Help")),
MainMenu: key.NewBinding(key.WithKeys("m"), key.WithHelp("m", "Main Menu")),
Hint: key.NewBinding(key.WithKeys("ctrl+h"), key.WithHelp("Ctrl+H", "Hint")),
Pause: key.NewBinding(key.WithKeys("p"), key.WithHelp("p", "Pause")),
ToggleNote: key.NewBinding(key.WithKeys("n"), key.WithHelp("n", "Note Mode")),
Save: key.NewBinding(key.WithKeys("ctrl+s"), key.WithHelp("Ctrl+S", "Save")),
Load: key.NewBinding(key.WithKeys("ctrl+l"), key.WithHelp("Ctrl+L", "Load")),
}
}
func (km *KeyMap) ApplyBindings(bindings map[string][]string) {
if bindings == nil {
return
}
set := func(b *key.Binding, keys []string, help string) {
if len(keys) == 0 {
return
}
*b = key.NewBinding(key.WithKeys(keys...), key.WithHelp(strings.Join(keys, "/"), help))
}
if v, ok := bindings["up"]; ok {
set(&km.Up, v, "Up")
}
if v, ok := bindings["down"]; ok {
set(&km.Down, v, "Down")
}
if v, ok := bindings["left"]; ok {
set(&km.Left, v, "Left")
}
if v, ok := bindings["right"]; ok {
set(&km.Right, v, "Right")
}
if v, ok := bindings["undo"]; ok {
set(&km.Undo, v, "Undo")
}
if v, ok := bindings["redo"]; ok {
set(&km.Redo, v, "Redo")
}
if v, ok := bindings["auto"]; ok {
set(&km.ToggleAuto, v, "Auto-Check")
}
if v, ok := bindings["timer"]; ok {
set(&km.ToggleTimer, v, "Timer")
}
if v, ok := bindings["help"]; ok {
set(&km.Help, v, "Help")
}
if v, ok := bindings["main"]; ok {
set(&km.MainMenu, v, "Main Menu")
}
if v, ok := bindings["hint"]; ok {
set(&km.Hint, v, "Hint")
}
if v, ok := bindings["pause"]; ok {
set(&km.Pause, v, "Pause")
}
if v, ok := bindings["note"]; ok {
set(&km.ToggleNote, v, "Note Mode")
}
if v, ok := bindings["save"]; ok {
set(&km.Save, v, "Save")
}
if v, ok := bindings["load"]; ok {
set(&km.Load, v, "Load")
}
}