1package filepicker
2
3import (
4 "github.com/charmbracelet/bubbles/v2/key"
5)
6
7// KeyMap defines keyboard bindings for dialog management.
8type KeyMap struct {
9 Select,
10 Down,
11 Up,
12 Forward,
13 Backward,
14 Close key.Binding
15}
16
17func DefaultKeyMap() KeyMap {
18 return KeyMap{
19 Select: key.NewBinding(
20 key.WithKeys("enter"),
21 key.WithHelp("enter", "accept"),
22 ),
23 Down: key.NewBinding(
24 key.WithKeys("down", "j"),
25 key.WithHelp("down/j", "move down"),
26 ),
27 Up: key.NewBinding(
28 key.WithKeys("up", "k"),
29 key.WithHelp("up/k", "move up"),
30 ),
31 Forward: key.NewBinding(
32 key.WithKeys("right", "l"),
33 key.WithHelp("right/l", "move forward"),
34 ),
35 Backward: key.NewBinding(
36 key.WithKeys("left", "h"),
37 key.WithHelp("left/h", "move backward"),
38 ),
39
40 Close: key.NewBinding(
41 key.WithKeys("esc", "alt+esc"),
42 key.WithHelp("esc", "close/exit"),
43 ),
44 }
45}
46
47// KeyBindings implements layout.KeyMapProvider
48func (k KeyMap) KeyBindings() []key.Binding {
49 return []key.Binding{
50 k.Select,
51 k.Down,
52 k.Up,
53 k.Forward,
54 k.Backward,
55 k.Close,
56 }
57}
58
59// FullHelp implements help.KeyMap.
60func (k KeyMap) FullHelp() [][]key.Binding {
61 m := [][]key.Binding{}
62 slice := k.KeyBindings()
63 for i := 0; i < len(slice); i += 4 {
64 end := min(i+4, len(slice))
65 m = append(m, slice[i:end])
66 }
67 return m
68}
69
70// ShortHelp implements help.KeyMap.
71func (k KeyMap) ShortHelp() []key.Binding {
72 return []key.Binding{
73 key.NewBinding(
74 key.WithKeys("right", "l", "left", "h", "up", "k", "down", "j"),
75 key.WithHelp("↑↓←→", "navigate"),
76 ),
77 k.Select,
78 k.Close,
79 }
80}