diff options
author | Piotr Wach <pwach@bloomberg.net> | 2024-01-13 21:44:42 +0000 |
---|---|---|
committer | Piotr Wach <pwach@bloomberg.net> | 2024-01-14 15:01:17 +0000 |
commit | 969e64bbde872d0598b1ebf6278f5d55e152f7b1 (patch) | |
tree | 01192ffbb4158c01b150df7740c9316906a02c18 /src/interactive | |
parent | 226cbb8b2d6388ddd7a7e48fdac1a4db2ee75474 (diff) |
Moved traversal stats to separate type
Diffstat (limited to 'src/interactive')
-rw-r--r-- | src/interactive/app/eventloop.rs | 29 | ||||
-rw-r--r-- | src/interactive/app/state.rs | 4 | ||||
-rw-r--r-- | src/interactive/app/terminal.rs | 22 | ||||
-rw-r--r-- | src/interactive/app/tree_view.rs | 12 |
4 files changed, 36 insertions, 31 deletions
diff --git a/src/interactive/app/eventloop.rs b/src/interactive/app/eventloop.rs index 5ce8cd6..561b8f7 100644 --- a/src/interactive/app/eventloop.rs +++ b/src/interactive/app/eventloop.rs @@ -10,7 +10,7 @@ use crossbeam::channel::Receiver; use crosstermion::crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers}; use crosstermion::input::Event; use dua::{ - traverse::{BackgroundTraversal, EntryData, Traversal}, + traverse::{BackgroundTraversal, EntryData, Traversal, TreeIndex}, WalkResult, }; use std::path::PathBuf; @@ -43,10 +43,10 @@ impl AppState { { let props = MainWindowProps { current_path: tree_view.current_path(self.navigation().view_root), - entries_traversed: tree_view.traversal.entries_traversed, - total_bytes: tree_view.traversal.total_bytes, - start: tree_view.traversal.start, - elapsed: tree_view.traversal.elapsed, + entries_traversed: self.stats.entries_traversed, + total_bytes: self.stats.total_bytes, + start: self.stats.start, + elapsed: self.stats.elapsed, display, state: self, }; @@ -72,6 +72,15 @@ impl AppState { Ok(()) } + fn recompute_sizes_recursively( + &mut self, + traversal: &mut Traversal, + node_index: TreeIndex) + { + let mut tree_view = self.tree_view(traversal); + tree_view.recompute_sizes_recursively(node_index); + } + fn refresh_screen<B>( &mut self, window: &mut MainWindow, @@ -125,7 +134,7 @@ impl AppState { crossbeam::select! { recv(events) -> event => { let Ok(event) = event else { - return Ok(Some(WalkResult { num_errors: traversal.io_errors })); + return Ok(Some(WalkResult { num_errors: self.stats.io_errors })); }; let res = self.process_terminal_event( window, @@ -144,6 +153,8 @@ impl AppState { if let Some(is_finished) = active_traversal.integrate_traversal_event(traversal, event) { 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); @@ -153,7 +164,7 @@ impl AppState { } } else { let Ok(event) = events.recv() else { - return Ok(Some(WalkResult { num_errors: traversal.io_errors })); + return Ok(Some(WalkResult { num_errors: self.stats.io_errors })); }; let result = self.process_terminal_event(window, traversal, display, terminal, event)?; @@ -222,7 +233,7 @@ impl AppState { Char('?') if !glob_focussed => self.toggle_help_pane(window), Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) && !glob_focussed => { return Ok(Some(WalkResult { - num_errors: tree_view.traversal.io_errors, + num_errors: self.stats.io_errors, })) } Char('q') if !glob_focussed => { @@ -402,7 +413,7 @@ impl AppState { self.handle_glob_quit(tree_view, window); } else { return Some(Ok(WalkResult { - num_errors: tree_view.traversal.io_errors, + num_errors: self.stats.io_errors, })); } } diff --git a/src/interactive/app/state.rs b/src/interactive/app/state.rs index 5dcdbff..e242a71 100644 --- a/src/interactive/app/state.rs +++ b/src/interactive/app/state.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use dua::traverse::BackgroundTraversal; +use dua::traverse::{BackgroundTraversal, TraversalStats}; use dua::WalkOptions; use crate::interactive::widgets::Column; @@ -33,6 +33,7 @@ pub struct AppState { pub focussed: FocussedPane, pub received_events: bool, pub active_traversal: Option<BackgroundTraversal>, + pub stats: TraversalStats, pub walk_options: WalkOptions, } @@ -48,6 +49,7 @@ impl AppState { focussed: Default::default(), received_events: false, active_traversal: None, + stats: TraversalStats::default(), walk_options, } } diff --git a/src/interactive/app/terminal.rs b/src/interactive/app/terminal.rs index 6672188..8b62386 100644 --- a/src/interactive/app/terminal.rs +++ b/src/interactive/app/terminal.rs @@ -4,7 +4,7 @@ use anyhow::Result; use crossbeam::channel::Receiver; use crosstermion::input::Event; use dua::{ - traverse::{EntryData, Traversal, Tree}, + traverse::{EntryData, Traversal, Tree, TraversalStats}, ByteFormat, WalkOptions, WalkResult, }; use tui::prelude::Backend; @@ -17,6 +17,7 @@ use super::{sorted_entries, state::AppState, DisplayOptions}; /// State and methods representing the interactive disk usage analyser for the terminal pub struct TerminalApp { pub traversal: Traversal, + pub stats: TraversalStats, pub display: DisplayOptions, pub state: AppState, pub window: MainWindow, @@ -38,20 +39,8 @@ impl TerminalApp { let window = MainWindow::default(); let mut state = AppState::new(walk_options); - - let traversal = { - let mut tree = Tree::new(); - let root_index = tree.add_node(EntryData::default()); - Traversal { - tree, - root_index, - entries_traversed: 0, - start: std::time::Instant::now(), - elapsed: None, - io_errors: 0, - total_bytes: None, - } - }; + let traversal = Traversal::new(); + let stats = TraversalStats::default(); state.navigation_mut().view_root = traversal.root_index; state.entries = sorted_entries( @@ -66,6 +55,7 @@ impl TerminalApp { state, display, traversal, + stats, window, }; Ok(app) @@ -120,7 +110,7 @@ mod tests { return Ok(res); } } - Ok(WalkResult { num_errors: self.traversal.io_errors }) + Ok(WalkResult { num_errors: self.stats.io_errors }) } } } diff --git a/src/interactive/app/tree_view.rs b/src/interactive/app/tree_view.rs index 2126206..558c022 100644 --- a/src/interactive/app/tree_view.rs +++ b/src/interactive/app/tree_view.rs @@ -68,7 +68,8 @@ impl TreeView<'_> { continue; } self.tree_mut().remove_node(nx); - self.traversal.entries_traversed -= 1; + // TODO: don't need this right? + // self.traversal.entries_traversed -= 1; entries_deleted += 1; } entries_deleted @@ -96,10 +97,11 @@ impl TreeView<'_> { Some(parent) => index = parent, } } - self.traversal.total_bytes = self - .tree() - .node_weight(self.traversal.root_index) - .map(|w| w.size); + // TODO: don't need this right? + // self.traversal.total_bytes = self + // .tree() + // .node_weight(self.traversal.root_index) + // .map(|w| w.size); } } |