1package filepicker
2
3import (
4 "github.com/charmbracelet/bubbles/v2/key"
5 "github.com/opencode-ai/opencode/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 InsertCWD,
16 Close key.Binding
17}
18
19func DefaultKeyMap() KeyMap {
20 return KeyMap{
21 Select: key.NewBinding(
22 key.WithKeys("enter"),
23 key.WithHelp("enter", "accept"),
24 ),
25 Down: key.NewBinding(
26 key.WithKeys("down", "j"),
27 key.WithHelp("down/j", "move down"),
28 ),
29 Up: key.NewBinding(
30 key.WithKeys("up", "k"),
31 key.WithHelp("up/k", "move up"),
32 ),
33 Forward: key.NewBinding(
34 key.WithKeys("right", "l"),
35 key.WithHelp("right/l", "move forward"),
36 ),
37 Backward: key.NewBinding(
38 key.WithKeys("left", "h"),
39 key.WithHelp("left/h", "move backward"),
40 ),
41 InsertCWD: key.NewBinding(
42 key.WithKeys("i"),
43 key.WithHelp("i", "manual path input"),
44 ),
45 Close: key.NewBinding(
46 key.WithKeys("esc"),
47 key.WithHelp("esc", "close/exit"),
48 ),
49 }
50}
51
52// FullHelp implements help.KeyMap.
53func (k KeyMap) FullHelp() [][]key.Binding {
54 m := [][]key.Binding{}
55 slice := layout.KeyMapToSlice(k)
56 for i := 0; i < len(slice); i += 4 {
57 end := min(i+4, len(slice))
58 m = append(m, slice[i:end])
59 }
60 return m
61}
62
63// ShortHelp implements help.KeyMap.
64func (k KeyMap) ShortHelp() []key.Binding {
65 return []key.Binding{
66 k.InsertCWD,
67 key.NewBinding(
68 key.WithHelp("↑↓←→", "navigate"),
69 ),
70 k.Select,
71 k.Close,
72 }
73}