From 676c0382db253bc417e2380c72b7d499b6942b8c Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 22 Jan 2026 10:20:50 -0500 Subject: [PATCH] fix(ui): models: ensure select loop breaks correctly and scroll to top on filter --- internal/ui/dialog/models.go | 4 +++- internal/ui/dialog/models_list.go | 22 +++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/internal/ui/dialog/models.go b/internal/ui/dialog/models.go index 31c0f0a886b72d409696f1a3a6c4305488ed9539..ed42d388fde959c41017217fc279fc175a9e0f49 100644 --- a/internal/ui/dialog/models.go +++ b/internal/ui/dialog/models.go @@ -206,8 +206,10 @@ func (m *Models) HandleMsg(msg tea.Msg) Action { var cmd tea.Cmd m.input, cmd = m.input.Update(msg) value := m.input.Value() + m.list.Focus() m.list.SetFilter(value) - m.list.ScrollToSelected() + m.list.SelectFirst() + m.list.ScrollToTop() return ActionCmd{cmd} } } diff --git a/internal/ui/dialog/models_list.go b/internal/ui/dialog/models_list.go index c0eaba437154a78df3865ab9cd0e96c5c9c57321..cd2f2a9570d8676ded81384a0720325c52e6e232 100644 --- a/internal/ui/dialog/models_list.go +++ b/internal/ui/dialog/models_list.go @@ -57,6 +57,7 @@ func (f *ModelsList) SetGroups(groups ...ModelGroup) { // SetFilter sets the filter query and updates the list items. func (f *ModelsList) SetFilter(q string) { f.query = q + f.SetItems(f.VisibleItems()...) } // SetSelected sets the selected item index. It overrides the base method to @@ -103,49 +104,56 @@ func (f *ModelsList) SetSelectedItem(itemID string) { // SelectNext selects the next model item, skipping any non-focusable items // like group headers and spacers. func (f *ModelsList) SelectNext() (v bool) { - for { - v = f.List.SelectNext() + v = f.List.SelectNext() + for v { selectedItem := f.SelectedItem() if _, ok := selectedItem.(*ModelItem); ok { return v } + v = f.List.SelectNext() } + return v } // SelectPrev selects the previous model item, skipping any non-focusable items // like group headers and spacers. func (f *ModelsList) SelectPrev() (v bool) { - for { - v = f.List.SelectPrev() + v = f.List.SelectPrev() + for v { selectedItem := f.SelectedItem() if _, ok := selectedItem.(*ModelItem); ok { return v } + v = f.List.SelectPrev() } + return v } // SelectFirst selects the first model item in the list. func (f *ModelsList) SelectFirst() (v bool) { v = f.List.SelectFirst() - for { + for v { selectedItem := f.SelectedItem() - if _, ok := selectedItem.(*ModelItem); ok { + _, ok := selectedItem.(*ModelItem) + if ok { return v } v = f.List.SelectNext() } + return v } // SelectLast selects the last model item in the list. func (f *ModelsList) SelectLast() (v bool) { v = f.List.SelectLast() - for { + for v { selectedItem := f.SelectedItem() if _, ok := selectedItem.(*ModelItem); ok { return v } v = f.List.SelectPrev() } + return v } // IsSelectedFirst checks if the selected item is the first model item.