diff --git a/crates/contacts_panel/src/contacts_panel.rs b/crates/contacts_panel/src/contacts_panel.rs index 6af6da6f23f3a2a70a4f664772af8fa3b8a0596f..03968d5aaaf740552423b4331026a38150d233f1 100644 --- a/crates/contacts_panel/src/contacts_panel.rs +++ b/crates/contacts_panel/src/contacts_panel.rs @@ -92,7 +92,7 @@ impl ContactsPanel { workspace: WeakViewHandle, cx: &mut ViewContext, ) -> Self { - let user_query_editor = cx.add_view(|cx| { + let filter_editor = cx.add_view(|cx| { let mut editor = Editor::single_line( Some(|theme| theme.contacts_panel.user_query_editor.clone()), cx, @@ -101,10 +101,19 @@ impl ContactsPanel { editor }); - cx.subscribe(&user_query_editor, |this, _, event, cx| { + cx.subscribe(&filter_editor, |this, _, event, cx| { if let editor::Event::BufferEdited = event { - this.selection.take(); - this.update_entries(cx) + let query = this.filter_editor.read(cx).text(cx); + if !query.is_empty() { + this.selection.take(); + } + this.update_entries(cx); + if !query.is_empty() { + this.selection = this + .entries + .iter() + .position(|entry| !matches!(entry, ContactEntry::Header(_))); + } } }) .detach(); @@ -194,7 +203,7 @@ impl ContactsPanel { collapsed_sections: Default::default(), entries: Default::default(), match_candidates: Default::default(), - filter_editor: user_query_editor, + filter_editor, _maintain_contacts: cx .observe(&app_state.user_store, |this, _, cx| this.update_entries(cx)), user_store: app_state.user_store.clone(), @@ -659,10 +668,11 @@ impl ContactsPanel { } } - if let Some(selection) = &mut self.selection { + if let Some(prev_selected_entry) = prev_selected_entry { + self.selection.take(); for (ix, entry) in self.entries.iter().enumerate() { - if Some(entry) == prev_selected_entry.as_ref() { - *selection = ix; + if *entry == prev_selected_entry { + self.selection = Some(ix); break; } } @@ -991,7 +1001,7 @@ mod tests { &[ "+", "v Online", - " user_four", + " user_four <=== selected", " dir2", "v Offline", " user_five", @@ -1005,9 +1015,9 @@ mod tests { render_to_strings(&panel, cx), &[ "+", - "v Online <=== selected", + "v Online", " user_four", - " dir2", + " dir2 <=== selected", "v Offline", " user_five", ] @@ -1021,9 +1031,9 @@ mod tests { &[ "+", "v Online", - " user_four <=== selected", + " user_four", " dir2", - "v Offline", + "v Offline <=== selected", " user_five", ] );