Select the first contact when changing the filter in the contacts panel

Co-authored-by: Antonio Scandurra <me@as-cii.com>
This commit is contained in:
Max Brunsfeld 2022-05-12 09:56:32 -07:00
parent c7802af88b
commit 47ed9c76ed

View File

@ -92,7 +92,7 @@ impl ContactsPanel {
workspace: WeakViewHandle<Workspace>, workspace: WeakViewHandle<Workspace>,
cx: &mut ViewContext<Self>, cx: &mut ViewContext<Self>,
) -> Self { ) -> Self {
let user_query_editor = cx.add_view(|cx| { let filter_editor = cx.add_view(|cx| {
let mut editor = Editor::single_line( let mut editor = Editor::single_line(
Some(|theme| theme.contacts_panel.user_query_editor.clone()), Some(|theme| theme.contacts_panel.user_query_editor.clone()),
cx, cx,
@ -101,10 +101,19 @@ impl ContactsPanel {
editor editor
}); });
cx.subscribe(&user_query_editor, |this, _, event, cx| { cx.subscribe(&filter_editor, |this, _, event, cx| {
if let editor::Event::BufferEdited = event { if let editor::Event::BufferEdited = event {
let query = this.filter_editor.read(cx).text(cx);
if !query.is_empty() {
this.selection.take(); this.selection.take();
this.update_entries(cx) }
this.update_entries(cx);
if !query.is_empty() {
this.selection = this
.entries
.iter()
.position(|entry| !matches!(entry, ContactEntry::Header(_)));
}
} }
}) })
.detach(); .detach();
@ -194,7 +203,7 @@ impl ContactsPanel {
collapsed_sections: Default::default(), collapsed_sections: Default::default(),
entries: Default::default(), entries: Default::default(),
match_candidates: Default::default(), match_candidates: Default::default(),
filter_editor: user_query_editor, filter_editor,
_maintain_contacts: cx _maintain_contacts: cx
.observe(&app_state.user_store, |this, _, cx| this.update_entries(cx)), .observe(&app_state.user_store, |this, _, cx| this.update_entries(cx)),
user_store: app_state.user_store.clone(), 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() { for (ix, entry) in self.entries.iter().enumerate() {
if Some(entry) == prev_selected_entry.as_ref() { if *entry == prev_selected_entry {
*selection = ix; self.selection = Some(ix);
break; break;
} }
} }
@ -991,22 +1001,7 @@ mod tests {
&[ &[
"+", "+",
"v Online", "v Online",
" user_four", " user_four <=== selected",
" dir2",
"v Offline",
" user_five",
]
);
panel.update(cx, |panel, cx| {
panel.select_next(&Default::default(), cx);
});
assert_eq!(
render_to_strings(&panel, cx),
&[
"+",
"v Online <=== selected",
" user_four",
" dir2", " dir2",
"v Offline", "v Offline",
" user_five", " user_five",
@ -1021,12 +1016,27 @@ mod tests {
&[ &[
"+", "+",
"v Online", "v Online",
" user_four <=== selected", " user_four",
" dir2", " dir2 <=== selected",
"v Offline", "v Offline",
" user_five", " user_five",
] ]
); );
panel.update(cx, |panel, cx| {
panel.select_next(&Default::default(), cx);
});
assert_eq!(
render_to_strings(&panel, cx),
&[
"+",
"v Online",
" user_four",
" dir2",
"v Offline <=== selected",
" user_five",
]
);
} }
fn render_to_strings(panel: &ViewHandle<ContactsPanel>, cx: &TestAppContext) -> Vec<String> { fn render_to_strings(panel: &ViewHandle<ContactsPanel>, cx: &TestAppContext) -> Vec<String> {