on main help sign in
fix(ui): models: ensure select loop breaks correctly and scroll to top on filter
commit676c0382db253bc417e2380c72b7d499b6942b8c authorAyman Bagabas <ayman.bagabas@gmail.com> dateThu 22 Jan 2026, 10:20 (9 months ago) parent8ebe914
2 files changed+18−8
internal/ui/dialog/models.go+3−1 internal/ui/dialog/models_list.go+15−7
internal/ui/dialog/models.go+3−1
@@ -206,8 +206,10 @@ func (m *Models) HandleMsg(msg tea.Msg) Action {
206206 var cmd tea.Cmd
207207 m.input, cmd = m.input.Update(msg)
208208 value := m.input.Value()
209+ m.list.Focus()
209210 m.list.SetFilter(value)
210− m.list.ScrollToSelected()
211+ m.list.SelectFirst()
212+ m.list.ScrollToTop()
211213 return ActionCmd{cmd}
212214 }
213215 }
internal/ui/dialog/models_list.go+15−7
@@ -57,6 +57,7 @@ func (f *ModelsList) SetGroups(groups ...ModelGroup) {
5757// SetFilter sets the filter query and updates the list items.
5858func (f *ModelsList) SetFilter(q string) {
5959 f.query = q
60+ f.SetItems(f.VisibleItems()...)
6061}
6162
6263// SetSelected sets the selected item index. It overrides the base method to
@@ -103,49 +104,56 @@ func (f *ModelsList) SetSelectedItem(itemID string) {
103104// SelectNext selects the next model item, skipping any non-focusable items
104105// like group headers and spacers.
105106func (f *ModelsList) SelectNext() (v bool) {
106− for {
107− v = f.List.SelectNext()
107+ v = f.List.SelectNext()
108+ for v {
108109 selectedItem := f.SelectedItem()
109110 if _, ok := selectedItem.(*ModelItem); ok {
110111 return v
111112 }
113+ v = f.List.SelectNext()
112114 }
115+ return v
113116}
114117
115118// SelectPrev selects the previous model item, skipping any non-focusable items
116119// like group headers and spacers.
117120func (f *ModelsList) SelectPrev() (v bool) {
118− for {
119− v = f.List.SelectPrev()
121+ v = f.List.SelectPrev()
122+ for v {
120123 selectedItem := f.SelectedItem()
121124 if _, ok := selectedItem.(*ModelItem); ok {
122125 return v
123126 }
127+ v = f.List.SelectPrev()
124128 }
129+ return v
125130}
126131
127132// SelectFirst selects the first model item in the list.
128133func (f *ModelsList) SelectFirst() (v bool) {
129134 v = f.List.SelectFirst()
130− for {
135+ for v {
131136 selectedItem := f.SelectedItem()
132− if _, ok := selectedItem.(*ModelItem); ok {
137+ _, ok := selectedItem.(*ModelItem)
138+ if ok {
133139 return v
134140 }
135141 v = f.List.SelectNext()
136142 }
143+ return v
137144}
138145
139146// SelectLast selects the last model item in the list.
140147func (f *ModelsList) SelectLast() (v bool) {
141148 v = f.List.SelectLast()
142− for {
149+ for v {
143150 selectedItem := f.SelectedItem()
144151 if _, ok := selectedItem.(*ModelItem); ok {
145152 return v
146153 }
147154 v = f.List.SelectPrev()
148155 }
156+ return v
149157}
150158
151159// IsSelectedFirst checks if the selected item is the first model item.