Preserve selected file finder path when Worktree changes
This commit is contained in:
parent
55fcc586bc
commit
f29f1b073d
2 changed files with 33 additions and 18 deletions
|
@ -32,7 +32,7 @@ pub struct FileFinder {
|
||||||
latest_search_id: usize,
|
latest_search_id: usize,
|
||||||
matches: Vec<PathMatch>,
|
matches: Vec<PathMatch>,
|
||||||
include_root_name: bool,
|
include_root_name: bool,
|
||||||
selected: usize,
|
selected: Option<Arc<Path>>,
|
||||||
cancel_flag: Arc<AtomicBool>,
|
cancel_flag: Arc<AtomicBool>,
|
||||||
list_state: UniformListState,
|
list_state: UniformListState,
|
||||||
}
|
}
|
||||||
|
@ -224,12 +224,13 @@ impl FileFinder {
|
||||||
)
|
)
|
||||||
.with_uniform_padding(6.0);
|
.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 =
|
||||||
container.with_border(Border::bottom(1.0, ColorU::from_u32(0xdbdbdcff)));
|
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));
|
container = container.with_background_color(ColorU::from_u32(0xdbdbdcff));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,7 +295,7 @@ impl FileFinder {
|
||||||
latest_search_id: 0,
|
latest_search_id: 0,
|
||||||
matches: Vec::new(),
|
matches: Vec::new(),
|
||||||
include_root_name: false,
|
include_root_name: false,
|
||||||
selected: 0,
|
selected: None,
|
||||||
cancel_flag: Arc::new(AtomicBool::new(false)),
|
cancel_flag: Arc::new(AtomicBool::new(false)),
|
||||||
list_state: UniformListState::new(),
|
list_state: UniformListState::new(),
|
||||||
}
|
}
|
||||||
|
@ -327,19 +328,34 @@ impl FileFinder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn select_prev(&mut self, _: &(), ctx: &mut ViewContext<Self>) {
|
fn selected_index(&self) -> usize {
|
||||||
if self.selected > 0 {
|
if let Some(selected) = self.selected.as_ref() {
|
||||||
self.selected -= 1;
|
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<Self>) {
|
||||||
|
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();
|
ctx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn select_next(&mut self, _: &(), ctx: &mut ViewContext<Self>) {
|
fn select_next(&mut self, _: &(), ctx: &mut ViewContext<Self>) {
|
||||||
if self.selected + 1 < self.matches.len() {
|
let mut selected_index = self.selected_index();
|
||||||
self.selected += 1;
|
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();
|
ctx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -348,7 +364,7 @@ impl FileFinder {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn confirm(&mut self, _: &(), ctx: &mut ViewContext<Self>) {
|
fn confirm(&mut self, _: &(), ctx: &mut ViewContext<Self>) {
|
||||||
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()));
|
ctx.emit(Event::Selected(m.tree_id, m.path.clone()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -397,8 +413,7 @@ impl FileFinder {
|
||||||
self.latest_search_id = search_id;
|
self.latest_search_id = search_id;
|
||||||
self.matches = matches;
|
self.matches = matches;
|
||||||
self.include_root_name = include_root_name;
|
self.include_root_name = include_root_name;
|
||||||
self.selected = 0;
|
self.list_state.scroll_to(self.selected_index());
|
||||||
self.list_state.scroll_to(0);
|
|
||||||
ctx.notify();
|
ctx.notify();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,8 +187,8 @@ fn match_single_tree_paths<'a>(
|
||||||
.map(|c| c.to_ascii_lowercase())
|
.map(|c| c.to_ascii_lowercase())
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
for path_entry in path_entries {
|
for candidate in path_entries {
|
||||||
if !path_entry.char_bag.is_superset(query_chars) {
|
if !candidate.char_bag.is_superset(query_chars) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ fn match_single_tree_paths<'a>(
|
||||||
|
|
||||||
path_chars.clear();
|
path_chars.clear();
|
||||||
lowercase_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);
|
path_chars.push(c);
|
||||||
lowercase_path_chars.push(c.to_ascii_lowercase());
|
lowercase_path_chars.push(c.to_ascii_lowercase());
|
||||||
}
|
}
|
||||||
|
@ -236,7 +236,7 @@ fn match_single_tree_paths<'a>(
|
||||||
if score > 0.0 {
|
if score > 0.0 {
|
||||||
results.push(Reverse(PathMatch {
|
results.push(Reverse(PathMatch {
|
||||||
tree_id: snapshot.id,
|
tree_id: snapshot.id,
|
||||||
path: path_entry.path.clone(),
|
path: candidate.path.clone(),
|
||||||
score,
|
score,
|
||||||
positions: match_positions.clone(),
|
positions: match_positions.clone(),
|
||||||
}));
|
}));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue