summaryrefslogtreecommitdiffstats
path: root/src/interactive/app/eventloop.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/interactive/app/eventloop.rs')
-rw-r--r--src/interactive/app/eventloop.rs58
1 files changed, 40 insertions, 18 deletions
diff --git a/src/interactive/app/eventloop.rs b/src/interactive/app/eventloop.rs
index 4ff3c05..002f953 100644
--- a/src/interactive/app/eventloop.rs
+++ b/src/interactive/app/eventloop.rs
@@ -64,10 +64,15 @@ impl AppState {
}
pub fn traverse(&mut self, traversal: &Traversal, input: Vec<PathBuf>) -> Result<()> {
- let background_traversal =
- BackgroundTraversal::start(traversal.root_index, &self.walk_options, input, false)?;
+ let background_traversal = BackgroundTraversal::start(
+ traversal.root_index,
+ &self.walk_options,
+ input,
+ false,
+ true,
+ )?;
self.navigation_mut().view_root = traversal.root_index;
- self.active_traversal = Some(background_traversal);
+ self.active_traversal = Some((background_traversal, None));
Ok(())
}
@@ -125,7 +130,7 @@ impl AppState {
where
B: Backend,
{
- if let Some(active_traversal) = &mut self.active_traversal {
+ if let Some((active_traversal, selected_name)) = &mut self.active_traversal {
crossbeam::select! {
recv(events) -> event => {
let Ok(event) = event else {
@@ -148,12 +153,13 @@ impl AppState {
if let Some(is_finished) = active_traversal.integrate_traversal_event(traversal, event) {
self.stats = active_traversal.stats;
+ let selected_name = selected_name.clone();
if is_finished {
let root_index = active_traversal.root_idx;
self.recompute_sizes_recursively(traversal, root_index);
self.active_traversal = None;
}
- self.update_state(traversal);
+ self.update_state_during_traversal(traversal, selected_name.as_ref(), is_finished);
self.refresh_screen(window, traversal, display, terminal)?;
};
}
@@ -173,16 +179,23 @@ impl AppState {
Ok(None)
}
- fn update_state(&mut self, traversal: &mut Traversal) {
+ fn update_state_during_traversal(
+ &mut self,
+ traversal: &mut Traversal,
+ selected_name: Option<&PathBuf>,
+ is_finished: bool,
+ ) {
let tree_view = self.tree_view(traversal);
- if !tree_view.exists(self.navigation().view_root) {
- self.go_to_root(&tree_view);
- } else {
- self.entries = tree_view.sorted_entries(self.navigation().view_root, self.sorting);
- }
+ self.entries = tree_view.sorted_entries(self.navigation().view_root, self.sorting);
if !self.received_events {
- self.navigation_mut().selected = self.entries.first().map(|b| b.index);
+ let selected_entry = selected_name
+ .and_then(|selected_name| self.entries.iter().find(|e| e.name == *selected_name));
+ if let Some(selected_entry) = selected_entry {
+ self.navigation_mut().selected = Some(selected_entry.index);
+ } else if is_finished {
+ self.navigation_mut().selected = self.entries.first().map(|b| b.index);
+ }
}
self.reset_message(); // force "scanning" to appear
}
@@ -354,6 +367,11 @@ impl AppState {
),
};
+ let selected_name = self
+ .navigation()
+ .selected
+ .and_then(|w| tree.tree().node_weight(w).map(|w| w.name.clone()));
+
let mut path = tree.path_of(index);
if path.to_str() == Some("") {
path = PathBuf::from(".");
@@ -364,12 +382,16 @@ impl AppState {
self.entries = tree.sorted_entries(self.navigation().view_root, self.sorting);
self.navigation_mut().selected = self.entries.first().map(|e| e.index);
- self.active_traversal = Some(BackgroundTraversal::start(
- parent_index,
- &self.walk_options,
- vec![path],
- skip_root,
- )?);
+ self.active_traversal = Some((
+ BackgroundTraversal::start(
+ parent_index,
+ &self.walk_options,
+ vec![path],
+ skip_root,
+ false,
+ )?,
+ selected_name,
+ ));
self.received_events = false;
Ok(())