Skip to content

Commit cb6d882

Browse files
authored
fix(filter): fix selection while filtering (#147)
1 parent 101ba38 commit cb6d882

File tree

2 files changed

+45
-12
lines changed

2 files changed

+45
-12
lines changed

app_model.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -275,25 +275,38 @@ func (m *AppModel) handleSpaceKey() (tea.Model, tea.Cmd) {
275275
logging.DebugLogger.Printf("Toggling selection for model: %s (before: %v)\n", item.Name, item.Selected)
276276
item.Selected = !item.Selected
277277

278-
// Update the item in the list's items
279-
items := m.list.Items()
280-
for i, listItem := range items {
278+
// Update both the filtered and unfiltered lists
279+
filteredItems := m.list.Items()
280+
for i, listItem := range filteredItems {
281281
if model, ok := listItem.(Model); ok && model.Name == item.Name {
282-
items[i] = item
283-
break
282+
filteredItems[i] = item
284283
}
285284
}
286285

287-
m.list.SetItems(items)
288-
289-
// Find the index of the actual item in the full list and update it
286+
// Always update the main model list
290287
for i, model := range m.models {
291288
if model.Name == item.Name {
292289
m.models[i] = item
293-
break
294290
}
295291
}
296292

293+
// Update the items in the list
294+
m.list.SetItems(filteredItems)
295+
296+
// If filtering is active, force a refresh of the view
297+
if m.list.FilterState() == list.Filtering || m.list.FilterState() == list.FilterApplied {
298+
// Store current cursor position
299+
currentIndex := m.list.Index()
300+
301+
// Force a view refresh by temporarily clearing and reapplying items
302+
tempItems := m.list.Items()
303+
m.list.SetItems(nil)
304+
m.list.SetItems(tempItems)
305+
306+
// Restore cursor position
307+
m.list.Select(currentIndex)
308+
}
309+
297310
logging.DebugLogger.Printf("Toggled selection for model: %s (after: %v)\n", item.Name, item.Selected)
298311
}
299312
return m, nil

item_delegate.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,17 @@ func (d itemDelegate) Update(msg tea.Msg, m *list.Model) tea.Cmd {
3434
if ok {
3535
logging.DebugLogger.Printf("Delegate toggling selection for model: %s (before: %v)\n", i.Name, i.Selected)
3636
i.Selected = !i.Selected
37+
38+
// Update the item in the filtered list
3739
m.SetItem(m.Index(), i)
38-
// Update the main model list
39-
d.appModel.models[m.Index()] = i
40+
41+
// Update the main model list by name match
42+
for idx, model := range d.appModel.models {
43+
if model.Name == i.Name {
44+
d.appModel.models[idx] = i
45+
break
46+
}
47+
}
4048
logging.DebugLogger.Printf("Updated main model list for model: %s (after: %v)\n", i.Name, i.Selected)
4149
}
4250
return nil
@@ -79,7 +87,19 @@ func (d itemDelegate) Render(w io.Writer, m list.Model, index int, item list.Ite
7987
idStyle = idStyle.Foreground(lipgloss.Color("225")).BorderLeft(true).PaddingLeft(-2).PaddingRight(-2)
8088
}
8189

82-
if model.Selected {
90+
// Check if the model is selected in both filtered and unfiltered states
91+
isSelected := model.Selected
92+
if d.appModel.list.FilterState() == list.Filtering || d.appModel.list.FilterState() == list.FilterApplied {
93+
// When filtering, also check the main models list to ensure selection state is accurate
94+
for _, m := range d.appModel.models {
95+
if m.Name == model.Name && m.Selected {
96+
isSelected = true
97+
break
98+
}
99+
}
100+
}
101+
102+
if isSelected {
83103
// de-indent to allow for selection border
84104
selectedStyle := lipgloss.NewStyle().Background(lipgloss.Color("92")).Bold(true).Italic(true)
85105
nameStyle = nameStyle.Inherit(selectedStyle)

0 commit comments

Comments
 (0)