From 517a3613c12513d91d93b59c56aae5204c12b4e6 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Tue, 16 Dec 2025 16:51:39 -0500 Subject: [PATCH] feat(ui): dialog: wrap navigation from last to first and vice versa --- internal/ui/dialog/commands.go | 10 ++++++++++ internal/ui/dialog/sessions.go | 10 ++++++++++ internal/ui/list/list.go | 16 ++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/internal/ui/dialog/commands.go b/internal/ui/dialog/commands.go index 3e275081691acec9a7538f80da8eeea87a662fd7..763e20969df1c62849a4ee4907c95132f9c01ddb 100644 --- a/internal/ui/dialog/commands.go +++ b/internal/ui/dialog/commands.go @@ -133,10 +133,20 @@ func (c *Commands) Update(msg tea.Msg) tea.Msg { return CloseMsg{} case key.Matches(msg, c.keyMap.Previous): c.list.Focus() + if c.list.IsSelectedFirst() { + c.list.SelectLast() + c.list.ScrollToBottom() + break + } c.list.SelectPrev() c.list.ScrollToSelected() case key.Matches(msg, c.keyMap.Next): c.list.Focus() + if c.list.IsSelectedLast() { + c.list.SelectFirst() + c.list.ScrollToTop() + break + } c.list.SelectNext() c.list.ScrollToSelected() case key.Matches(msg, c.keyMap.Select): diff --git a/internal/ui/dialog/sessions.go b/internal/ui/dialog/sessions.go index 016bd1a8f79373296ecbec7acf2e36b97dae8ff5..933547c5665b292f9cb7a125424803f219bbf706 100644 --- a/internal/ui/dialog/sessions.go +++ b/internal/ui/dialog/sessions.go @@ -89,10 +89,20 @@ func (s *Session) Update(msg tea.Msg) tea.Msg { return CloseMsg{} case key.Matches(msg, s.keyMap.Previous): s.list.Focus() + if s.list.IsSelectedFirst() { + s.list.SelectLast() + s.list.ScrollToBottom() + break + } s.list.SelectPrev() s.list.ScrollToSelected() case key.Matches(msg, s.keyMap.Next): s.list.Focus() + if s.list.IsSelectedLast() { + s.list.SelectFirst() + s.list.ScrollToTop() + break + } s.list.SelectNext() s.list.ScrollToSelected() case key.Matches(msg, s.keyMap.Select): diff --git a/internal/ui/list/list.go b/internal/ui/list/list.go index 07414882400795eaa1e08fbab19c22d37d98ffa5..17766cd52506132322c051fffaf33de613332315 100644 --- a/internal/ui/list/list.go +++ b/internal/ui/list/list.go @@ -398,6 +398,22 @@ func (l *List) SetSelected(index int) { } } +// Selected returns the index of the currently selected item. It returns -1 if +// no item is selected. +func (l *List) Selected() int { + return l.selectedIdx +} + +// IsSelectedFirst returns whether the first item is selected. +func (l *List) IsSelectedFirst() bool { + return l.selectedIdx == 0 +} + +// IsSelectedLast returns whether the last item is selected. +func (l *List) IsSelectedLast() bool { + return l.selectedIdx == len(l.items)-1 +} + // SelectPrev selects the previous item in the list. func (l *List) SelectPrev() { if l.selectedIdx > 0 {