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