keys.go

 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}