@@ -55,6 +55,28 @@ func (f *ModelsList) SetFilter(q string) {
55 f.query = q
55 f.query = q
58+// SetSelected sets the selected item index. It overrides the base method to
59+// skip non-model items.
60+func (f *ModelsList) SetSelected(index int) {
61+ if index < 0 || index >= f.Len() {
62+ f.List.SetSelected(index)
66+ f.List.SetSelected(index)
68+ selectedItem := f.List.SelectedItem()
69+ if _, ok := selectedItem.(*ModelItem); ok {
72+ f.List.SetSelected(index + 1)
74+ if index >= f.Len() {
58// SetSelectedItem sets the selected item in the list by item ID.
80// SetSelectedItem sets the selected item in the list by item ID.
59func (f *ModelsList) SetSelectedItem(itemID string) {
81func (f *ModelsList) SetSelectedItem(itemID string) {
60 if itemID == "" {
82 if itemID == "" {
@@ -74,14 +96,63 @@ func (f *ModelsList) SetSelectedItem(itemID string) {
99+// SelectNext selects the next model item, skipping any non-focusable items
100+// like group headers and spacers.
101+func (f *ModelsList) SelectNext() (v bool) {
103+ v = f.List.SelectNext()
104+ selectedItem := f.List.SelectedItem()
105+ if _, ok := selectedItem.(*ModelItem); ok {
111+// SelectPrev selects the previous model item, skipping any non-focusable items
112+// like group headers and spacers.
113+func (f *ModelsList) SelectPrev() (v bool) {
115+ v = f.List.SelectPrev()
116+ selectedItem := f.List.SelectedItem()
117+ if _, ok := selectedItem.(*ModelItem); ok {
123+// SelectFirst selects the first model item in the list.
124+func (f *ModelsList) SelectFirst() (v bool) {
125+ v = f.List.SelectFirst()
127+ selectedItem := f.List.SelectedItem()
128+ if _, ok := selectedItem.(*ModelItem); ok {
131+ v = f.List.SelectNext()
135+// SelectLast selects the last model item in the list.
136+func (f *ModelsList) SelectLast() (v bool) {
137+ v = f.List.SelectLast()
139+ selectedItem := f.List.SelectedItem()
140+ if _, ok := selectedItem.(*ModelItem); ok {
143+ v = f.List.SelectPrev()
77// VisibleItems returns the visible items after filtering.
147// VisibleItems returns the visible items after filtering.
78func (f *ModelsList) VisibleItems() []list.Item {
148func (f *ModelsList) VisibleItems() []list.Item {
79− if len(f.query) == 0 {
149+ if f.query == "" {
80 // No filter, return all items with group headers
150 // No filter, return all items with group headers
81 items := []list.Item{}
151 items := []list.Item{}
82 for _, g := range f.groups {
152 for _, g := range f.groups {
83 items = append(items, &g)
153 items = append(items, &g)
84 for _, item := range g.Items {
154 for _, item := range g.Items {
155+ item.SetMatch(fuzzy.Match{})
85 items = append(items, item)
156 items = append(items, item)
87 // Add a space separator after each provider section
158 // Add a space separator after each provider section