@@ -47,7 +47,7 @@ var keymapEntries = []keymapEntry{
4747 {"p" , "Playlist manager" },
4848 {"i" , "Track info / metadata" },
4949 {"Ctrl+S" , "Save/download track to ~/Music" },
50- {"x " , "Expand/collapse playlist" },
50+ {"Ctrl+X " , "Expand/collapse playlist" },
5151 {"/" , "Search playlist" },
5252 {"f" , "Find on YouTube (queue play next)" },
5353 {"Ctrl+F" , "Find on SoundCloud (queue play next)" },
@@ -61,56 +61,86 @@ var keymapEntries = []keymapEntry{
6161 {"q" , "Quit" },
6262}
6363
64+ func (m Model ) keymapCount () int {
65+ if m .keymap .search != "" {
66+ return len (m .keymap .filtered )
67+ }
68+ return len (keymapEntries )
69+ }
70+
6471// handleKeymapKey processes key presses while the keymap overlay is open.
6572func (m * Model ) handleKeymapKey (msg tea.KeyPressMsg ) tea.Cmd {
66- switch msg .Code {
67- case tea .KeyEscape :
73+ key := msg .String ()
74+
75+ switch {
76+ case key == "ctrl+c" :
77+ m .keymap .visible = false
78+ return m .quit ()
79+
80+ case msg .Code == tea .KeyEscape :
6881 m .keymap .visible = false
6982 m .keymap .search = ""
7083 m .keymap .filtered = nil
7184 m .keymap .cursor = 0
72- case tea .KeyUp :
85+
86+ case msg .Code == tea .KeyUp :
87+ count := m .keymapCount ()
7388 if m .keymap .cursor > 0 {
7489 m .keymap .cursor --
75- } else {
76- count := len (keymapEntries )
77- if m .keymap .search != "" {
78- count = len (m .keymap .filtered )
79- }
80- if count > 0 {
81- m .keymap .cursor = count - 1
82- }
83- }
84- case tea .KeyDown :
85- count := len (keymapEntries )
86- if m .keymap .search != "" {
87- count = len (m .keymap .filtered )
90+ } else if count > 0 {
91+ m .keymap .cursor = count - 1
8892 }
93+
94+ case msg .Code == tea .KeyDown :
95+ count := m .keymapCount ()
8996 if m .keymap .cursor < count - 1 {
9097 m .keymap .cursor ++
9198 } else if count > 0 {
9299 m .keymap .cursor = 0
93100 }
94- case tea .KeyBackspace :
101+
102+ case key == "ctrl+x" :
103+ m .toggleExpandPlaylist ()
104+
105+ case key == "pgup" || key == "ctrl+u" :
106+ if m .keymap .cursor > 0 {
107+ step := max (1 , m .keymapVisibleRows ())
108+ m .keymap .cursor -= min (m .keymap .cursor , step )
109+ }
110+
111+ case key == "pgdown" || key == "ctrl+d" :
112+ count := m .keymapCount ()
113+ if m .keymap .cursor < count - 1 {
114+ step := max (1 , m .keymapVisibleRows ())
115+ m .keymap .cursor = min (count - 1 , m .keymap .cursor + step )
116+ }
117+
118+ case msg .Code == tea .KeyHome :
119+ m .keymap .cursor = 0
120+
121+ case msg .Code == tea .KeyEnd :
122+ count := m .keymapCount ()
123+ if count > 0 {
124+ m .keymap .cursor = count - 1
125+ }
126+
127+ case msg .Code == tea .KeyBackspace :
95128 if m .keymap .search != "" {
96129 m .keymap .search = removeLastRune (m .keymap .search )
97130 m .updateKeymapFilter ()
98131 }
99- case tea .KeySpace :
132+
133+ case msg .Code == tea .KeySpace :
100134 m .keymap .search += " "
101135 m .updateKeymapFilter ()
136+
102137 default :
103- switch msg .String () {
104- case "ctrl+c" :
105- m .keymap .visible = false
106- return m .quit ()
107- default :
108- if len (msg .Text ) > 0 {
109- m .keymap .search += msg .Text
110- m .updateKeymapFilter ()
111- }
138+ if len (msg .Text ) > 0 {
139+ m .keymap .search += msg .Text
140+ m .updateKeymapFilter ()
112141 }
113142 }
143+
114144 return nil
115145}
116146
0 commit comments