on main help sign in
feat(ui): dialog: wrap navigation from last to first and vice versa
517a361Ayman Bagabas
internal/ui/dialog/commands.go+10
@@ -133,10 +133,20 @@ func (c *Commands) Update(msg tea.Msg) tea.Msg {
133 return CloseMsg{}
133 return CloseMsg{}
134 case key.Matches(msg, c.keyMap.Previous):
134 case key.Matches(msg, c.keyMap.Previous):
135 c.list.Focus()
135 c.list.Focus()
136+ if c.list.IsSelectedFirst() {
137+ c.list.SelectLast()
138+ c.list.ScrollToBottom()
139+ break
140+ }
136 c.list.SelectPrev()
141 c.list.SelectPrev()
137 c.list.ScrollToSelected()
142 c.list.ScrollToSelected()
138 case key.Matches(msg, c.keyMap.Next):
143 case key.Matches(msg, c.keyMap.Next):
139 c.list.Focus()
144 c.list.Focus()
145+ if c.list.IsSelectedLast() {
146+ c.list.SelectFirst()
147+ c.list.ScrollToTop()
148+ break
149+ }
140 c.list.SelectNext()
150 c.list.SelectNext()
141 c.list.ScrollToSelected()
151 c.list.ScrollToSelected()
142 case key.Matches(msg, c.keyMap.Select):
152 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 {
89 return CloseMsg{}
89 return CloseMsg{}
90 case key.Matches(msg, s.keyMap.Previous):
90 case key.Matches(msg, s.keyMap.Previous):
91 s.list.Focus()
91 s.list.Focus()
92+ if s.list.IsSelectedFirst() {
93+ s.list.SelectLast()
94+ s.list.ScrollToBottom()
95+ break
96+ }
92 s.list.SelectPrev()
97 s.list.SelectPrev()
93 s.list.ScrollToSelected()
98 s.list.ScrollToSelected()
94 case key.Matches(msg, s.keyMap.Next):
99 case key.Matches(msg, s.keyMap.Next):
95 s.list.Focus()
100 s.list.Focus()
101+ if s.list.IsSelectedLast() {
102+ s.list.SelectFirst()
103+ s.list.ScrollToTop()
104+ break
105+ }
96 s.list.SelectNext()
106 s.list.SelectNext()
97 s.list.ScrollToSelected()
107 s.list.ScrollToSelected()
98 case key.Matches(msg, s.keyMap.Select):
108 case key.Matches(msg, s.keyMap.Select):
internal/ui/list/list.go+16
@@ -398,6 +398,22 @@ func (l *List) SetSelected(index int) {
398 }
398 }
399}
399}
400
400
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+
401// SelectPrev selects the previous item in the list.
417// SelectPrev selects the previous item in the list.
402func (l *List) SelectPrev() {
418func (l *List) SelectPrev() {
403 if l.selectedIdx > 0 {
419 if l.selectedIdx > 0 {