1package models
2
3import (
4 "github.com/charmbracelet/bubbles/v2/key"
5)
6
7type KeyMap struct {
8 Select,
9 Next,
10 Previous,
11 Tab,
12 Close key.Binding
13
14 isAPIKeyHelp bool
15 isAPIKeyValid bool
16}
17
18func DefaultKeyMap() KeyMap {
19 return KeyMap{
20 Select: key.NewBinding(
21 key.WithKeys("enter"),
22 key.WithHelp("enter", "confirm"),
23 ),
24 Next: key.NewBinding(
25 key.WithKeys("down"),
26 key.WithHelp("↓", "down"),
27 ),
28 Previous: key.NewBinding(
29 key.WithKeys("up"),
30 key.WithHelp("↑", "up"),
31 ),
32 Tab: key.NewBinding(
33 key.WithKeys("tab"),
34 key.WithHelp("tab", "toggle type"),
35 ),
36 Close: key.NewBinding(
37 key.WithKeys("esc"),
38 key.WithHelp("esc", "cancel"),
39 ),
40 }
41}
42
43// KeyBindings implements layout.KeyMapProvider
44func (k KeyMap) KeyBindings() []key.Binding {
45 return []key.Binding{
46 k.Select,
47 k.Next,
48 k.Previous,
49 k.Tab,
50 k.Close,
51 }
52}
53
54// FullHelp implements help.KeyMap.
55func (k KeyMap) FullHelp() [][]key.Binding {
56 m := [][]key.Binding{}
57 slice := k.KeyBindings()
58 for i := 0; i < len(slice); i += 4 {
59 end := min(i+4, len(slice))
60 m = append(m, slice[i:end])
61 }
62 return m
63}
64
65// ShortHelp implements help.KeyMap.
66func (k KeyMap) ShortHelp() []key.Binding {
67 if k.isAPIKeyHelp && !k.isAPIKeyValid {
68 return []key.Binding{
69 k.Close,
70 }
71 } else if k.isAPIKeyValid {
72 return []key.Binding{
73 k.Select,
74 }
75 }
76 return []key.Binding{
77 key.NewBinding(
78 key.WithKeys("down", "up"),
79 key.WithHelp("↑↓", "choose"),
80 ),
81 k.Tab,
82 k.Select,
83 k.Close,
84 }
85}