diff --git a/zed/src/file_finder.rs b/zed/src/file_finder.rs index 71abeb5ae4..d6ec299593 100644 --- a/zed/src/file_finder.rs +++ b/zed/src/file_finder.rs @@ -32,7 +32,7 @@ pub struct FileFinder { latest_search_id: usize, matches: Vec, include_root_name: bool, - selected: usize, + selected: Option>, cancel_flag: Arc, list_state: UniformListState, } @@ -224,12 +224,13 @@ impl FileFinder { ) .with_uniform_padding(6.0); - if index == self.selected || index < self.matches.len() - 1 { + let selected_index = self.selected_index(); + if index == selected_index || index < self.matches.len() - 1 { container = container.with_border(Border::bottom(1.0, ColorU::from_u32(0xdbdbdcff))); } - if index == self.selected { + if index == selected_index { container = container.with_background_color(ColorU::from_u32(0xdbdbdcff)); } @@ -294,7 +295,7 @@ impl FileFinder { latest_search_id: 0, matches: Vec::new(), include_root_name: false, - selected: 0, + selected: None, cancel_flag: Arc::new(AtomicBool::new(false)), list_state: UniformListState::new(), } @@ -327,19 +328,34 @@ impl FileFinder { } } - fn select_prev(&mut self, _: &(), ctx: &mut ViewContext) { - if self.selected > 0 { - self.selected -= 1; + fn selected_index(&self) -> usize { + if let Some(selected) = self.selected.as_ref() { + for (ix, path_match) in self.matches.iter().enumerate() { + if path_match.path.as_ref() == selected.as_ref() { + return ix; + } + } } - self.list_state.scroll_to(self.selected); + 0 + } + + fn select_prev(&mut self, _: &(), ctx: &mut ViewContext) { + let mut selected_index = self.selected_index(); + if selected_index > 0 { + selected_index -= 1; + self.selected = Some(self.matches[selected_index].path.clone()); + } + self.list_state.scroll_to(selected_index); ctx.notify(); } fn select_next(&mut self, _: &(), ctx: &mut ViewContext) { - if self.selected + 1 < self.matches.len() { - self.selected += 1; + let mut selected_index = self.selected_index(); + if selected_index + 1 < self.matches.len() { + selected_index += 1; + self.selected = Some(self.matches[selected_index].path.clone()); } - self.list_state.scroll_to(self.selected); + self.list_state.scroll_to(selected_index); ctx.notify(); } @@ -348,7 +364,7 @@ impl FileFinder { } fn confirm(&mut self, _: &(), ctx: &mut ViewContext) { - if let Some(m) = self.matches.get(self.selected) { + if let Some(m) = self.matches.get(self.selected_index()) { ctx.emit(Event::Selected(m.tree_id, m.path.clone())); } } @@ -397,8 +413,7 @@ impl FileFinder { self.latest_search_id = search_id; self.matches = matches; self.include_root_name = include_root_name; - self.selected = 0; - self.list_state.scroll_to(0); + self.list_state.scroll_to(self.selected_index()); ctx.notify(); } } diff --git a/zed/src/worktree/fuzzy.rs b/zed/src/worktree/fuzzy.rs index 0097a44268..10a1cace31 100644 --- a/zed/src/worktree/fuzzy.rs +++ b/zed/src/worktree/fuzzy.rs @@ -187,8 +187,8 @@ fn match_single_tree_paths<'a>( .map(|c| c.to_ascii_lowercase()) .collect::>(); - for path_entry in path_entries { - if !path_entry.char_bag.is_superset(query_chars) { + for candidate in path_entries { + if !candidate.char_bag.is_superset(query_chars) { continue; } @@ -198,7 +198,7 @@ fn match_single_tree_paths<'a>( path_chars.clear(); lowercase_path_chars.clear(); - for c in path_entry.path.to_string_lossy().chars() { + for c in candidate.path.to_string_lossy().chars() { path_chars.push(c); lowercase_path_chars.push(c.to_ascii_lowercase()); } @@ -236,7 +236,7 @@ fn match_single_tree_paths<'a>( if score > 0.0 { results.push(Reverse(PathMatch { tree_id: snapshot.id, - path: path_entry.path.clone(), + path: candidate.path.clone(), score, positions: match_positions.clone(), }));