on main help sign in
feat(ui): dialog: wrap navigation from last to first and vice versa
commit517a3613c12513d91d93b59c56aae5204c12b4e6 authorAyman Bagabas <ayman.bagabas@gmail.com> dateTue 16 Dec 2025, 16:51 (1 year ago) parentd54a5e7
3 files changed+36
internal/ui/dialog/commands.go+10 internal/ui/dialog/sessions.go+10 internal/ui/list/list.go+16
internal/ui/dialog/commands.go+10
@@ -133,10 +133,20 @@ func (c *Commands) Update(msg tea.Msg) tea.Msg {
133133 return CloseMsg{}
134134 case key.Matches(msg, c.keyMap.Previous):
135135 c.list.Focus()
136+ if c.list.IsSelectedFirst() {
137+ c.list.SelectLast()
138+ c.list.ScrollToBottom()
139+ break
140+ }
136141 c.list.SelectPrev()
137142 c.list.ScrollToSelected()
138143 case key.Matches(msg, c.keyMap.Next):
139144 c.list.Focus()
145+ if c.list.IsSelectedLast() {
146+ c.list.SelectFirst()
147+ c.list.ScrollToTop()
148+ break
149+ }
140150 c.list.SelectNext()
141151 c.list.ScrollToSelected()
142152 case key.Matches(msg, c.keyMap.Select):
internal/ui/dialog/sessions.go+10
@@ -89,10 +89,20 @@ func (s *Session) Update(msg tea.Msg) tea.Msg {
8989 return CloseMsg{}
9090 case key.Matches(msg, s.keyMap.Previous):
9191 s.list.Focus()
92+ if s.list.IsSelectedFirst() {
93+ s.list.SelectLast()
94+ s.list.ScrollToBottom()
95+ break
96+ }
9297 s.list.SelectPrev()
9398 s.list.ScrollToSelected()
9499 case key.Matches(msg, s.keyMap.Next):
95100 s.list.Focus()
101+ if s.list.IsSelectedLast() {
102+ s.list.SelectFirst()
103+ s.list.ScrollToTop()
104+ break
105+ }
96106 s.list.SelectNext()
97107 s.list.ScrollToSelected()
98108 case key.Matches(msg, s.keyMap.Select):
internal/ui/list/list.go+16
@@ -398,6 +398,22 @@ func (l *List) SetSelected(index int) {
398398 }
399399}
400400
401+// Selected returns the index of the currently selected item. It returns -1 if
402+// no item is selected.
403+func (l *List) Selected() int {
404+ return l.selectedIdx
405+}
406+
407+// IsSelectedFirst returns whether the first item is selected.
408+func (l *List) IsSelectedFirst() bool {
409+ return l.selectedIdx == 0
410+}
411+
412+// IsSelectedLast returns whether the last item is selected.
413+func (l *List) IsSelectedLast() bool {
414+ return l.selectedIdx == len(l.items)-1
415+}
416+
401417// SelectPrev selects the previous item in the list.
402418func (l *List) SelectPrev() {
403419 if l.selectedIdx > 0 {