From bb511b538c7d75b02d598d495b307a83a11f53c0 Mon Sep 17 00:00:00 2001 From: Piotr Wach Date: Sun, 7 Jan 2024 20:02:45 +0000 Subject: Update entries --- src/interactive/app/app_state.rs | 6 +++++- src/interactive/app/eventloop.rs | 34 ++++++++++++++++++++++++++++------ src/interactive/app/terminal_app.rs | 35 +---------------------------------- 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/src/interactive/app/app_state.rs b/src/interactive/app/app_state.rs index 8986f09..f4a8d20 100644 --- a/src/interactive/app/app_state.rs +++ b/src/interactive/app/app_state.rs @@ -1,4 +1,6 @@ -use dua::{WalkResult, traverse::{TreeIndex, Tree}, inodefilter::InodeFilter}; +use std::time::Duration; + +use dua::{WalkResult, traverse::{TreeIndex, Tree}, inodefilter::InodeFilter, Throttle}; use petgraph::Direction; use super::{navigation::Navigation, EntryDataBundle, SortMode}; @@ -40,6 +42,7 @@ pub struct TraversalState { pub current_directory_at_depth: EntryInfo, pub previous_depth: usize, pub inodes: InodeFilter, + pub throttle: Option } impl TraversalState { @@ -51,6 +54,7 @@ impl TraversalState { current_directory_at_depth: EntryInfo::default(), previous_depth: 0, inodes: InodeFilter::default(), + throttle: Some(Throttle::new(Duration::from_millis(250), None)), } } } diff --git a/src/interactive/app/eventloop.rs b/src/interactive/app/eventloop.rs index 014ce36..0cc38e9 100644 --- a/src/interactive/app/eventloop.rs +++ b/src/interactive/app/eventloop.rs @@ -116,7 +116,7 @@ impl AppState { // })) } - // TODO: + // TODO: do we need this? // default(Duration::from_millis(250)) => { // // No events or new entries received, but we still need // // to keep updating the status message regularly. @@ -239,12 +239,16 @@ impl AppState { } } - // TODO: - // if throttle.can_update() && update(&mut t, None)? { - // return Ok(None); - // } + if let Some(throttle) = &self.traversal_state.throttle { + if throttle.can_update() { + self.update_state(t); + } + } }, TraversalEvent::Finished(io_errors) => { + t.io_errors += io_errors; + + self.traversal_state.throttle = None; self.traversal_state.directory_info_per_depth_level.push(self.traversal_state.current_directory_at_depth); self.traversal_state.current_directory_at_depth = EntryInfo::default(); for _ in 0..self.traversal_state.previous_depth { @@ -266,11 +270,29 @@ impl AppState { ); t.total_bytes = Some(root_size); t.elapsed = Some(t.start.elapsed()); - // Ok(Some(t)) + + self.update_state(t); } } } + fn update_state<'a>(&mut self, traversal: &'a Traversal) { + let mut received_events = false; + if !received_events { + self.navigation_mut().view_root = traversal.root_index; + } + self.entries = sorted_entries( + &traversal.tree, + self.navigation().view_root, + self.sorting, + self.glob_root(), + ); + if !received_events { + self.navigation_mut().selected = self.entries.first().map(|b| b.index); + } + self.reset_message(); // force "scanning" to appear + } + fn process_event(&mut self, window: &mut MainWindow, traversal: &mut Traversal, diff --git a/src/interactive/app/terminal_app.rs b/src/interactive/app/terminal_app.rs index 01398df..21ee66f 100644 --- a/src/interactive/app/terminal_app.rs +++ b/src/interactive/app/terminal_app.rs @@ -125,40 +125,7 @@ impl TerminalApp { // let mut received_events = false; // let traversal = // Traversal::from_walk(options, input_paths, |traversal, event| { - // if !received_events { - // state.navigation_mut().view_root = traversal.root_index; - // } - // state.entries = sorted_entries( - // &traversal.tree, - // state.navigation().view_root, - // state.sorting, - // state.glob_root(), - // ); - // if !received_events { - // state.navigation_mut().selected = state.entries.first().map(|b| b.index); - // } - // state.reset_message(); // force "scanning" to appear - - // let mut events = fetch_buffered_key_events(&keys_rx); - // if let Some(event) = event { - // // This update is triggered by a user event, insert it - // // before any events fetched later. - // events.insert(0, event); - // } - // received_events |= !events.is_empty(); - - // let should_exit = match state.process_events( - // &mut window, - // traversal, - // &mut display, - // terminal, - // events.into_iter(), - // )? { - // ProcessingResult::ExitRequested(_) => true, - // ProcessingResult::Finished(_) => false, - // }; - - // Ok(should_exit) + // })?; // let traversal = match traversal { -- cgit v1.2.3