1package commands
2
3import (
4 "github.com/charmbracelet/bubbles/v2/key"
5 "github.com/opencode-ai/opencode/internal/tui/layout"
6)
7
8type CommandsDialogKeyMap struct {
9 Select key.Binding
10 Next key.Binding
11 Previous key.Binding
12 Tab key.Binding
13}
14
15func DefaultCommandsDialogKeyMap() CommandsDialogKeyMap {
16 return CommandsDialogKeyMap{
17 Select: key.NewBinding(
18 key.WithKeys("enter", "ctrl+y"),
19 key.WithHelp("enter", "confirm"),
20 ),
21 Next: key.NewBinding(
22 key.WithKeys("down", "ctrl+n"),
23 key.WithHelp("↓", "next item"),
24 ),
25 Previous: key.NewBinding(
26 key.WithKeys("up", "ctrl+p"),
27 key.WithHelp("↑", "previous item"),
28 ),
29 Tab: key.NewBinding(
30 key.WithKeys("tab"),
31 key.WithHelp("tab", "switch selection"),
32 ),
33 }
34}
35
36// FullHelp implements help.KeyMap.
37func (k CommandsDialogKeyMap) FullHelp() [][]key.Binding {
38 m := [][]key.Binding{}
39 slice := layout.KeyMapToSlice(k)
40 for i := 0; i < len(slice); i += 4 {
41 end := min(i+4, len(slice))
42 m = append(m, slice[i:end])
43 }
44 return m
45}
46
47// ShortHelp implements help.KeyMap.
48func (k CommandsDialogKeyMap) ShortHelp() []key.Binding {
49 return []key.Binding{
50 k.Tab,
51 key.NewBinding(
52 key.WithKeys("down", "up"),
53 key.WithHelp("↑↓", "choose"),
54 ),
55 k.Select,
56 key.NewBinding(
57 key.WithKeys("esc"),
58 key.WithHelp("esc", "cancel"),
59 ),
60 }
61}
62
63type ArgumentsDialogKeyMap struct {
64 Confirm key.Binding
65 Next key.Binding
66 Previous key.Binding
67}
68
69func DefaultArgumentsDialogKeyMap() ArgumentsDialogKeyMap {
70 return ArgumentsDialogKeyMap{
71 Confirm: key.NewBinding(
72 key.WithKeys("enter"),
73 key.WithHelp("enter", "confirm"),
74 ),
75
76 Next: key.NewBinding(
77 key.WithKeys("tab", "down"),
78 key.WithHelp("tab/↓", "next"),
79 ),
80 Previous: key.NewBinding(
81 key.WithKeys("shift+tab", "up"),
82 key.WithHelp("shift+tab/↑", "previous"),
83 ),
84 }
85}
86
87// FullHelp implements help.KeyMap.
88func (k ArgumentsDialogKeyMap) FullHelp() [][]key.Binding {
89 m := [][]key.Binding{}
90 slice := layout.KeyMapToSlice(k)
91 for i := 0; i < len(slice); i += 4 {
92 end := min(i+4, len(slice))
93 m = append(m, slice[i:end])
94 }
95 return m
96}
97
98// ShortHelp implements help.KeyMap.
99func (k ArgumentsDialogKeyMap) ShortHelp() []key.Binding {
100 return []key.Binding{
101 k.Confirm,
102 k.Next,
103 k.Previous,
104 }
105}