summaryrefslogtreecommitdiffstats
path: root/src/interactive
diff options
context:
space:
mode:
authorPiotr Wach <pwach@bloomberg.net>2024-01-13 21:44:42 +0000
committerPiotr Wach <pwach@bloomberg.net>2024-01-14 15:01:17 +0000
commit969e64bbde872d0598b1ebf6278f5d55e152f7b1 (patch)
tree01192ffbb4158c01b150df7740c9316906a02c18 /src/interactive
parent226cbb8b2d6388ddd7a7e48fdac1a4db2ee75474 (diff)
Moved traversal stats to separate type
Diffstat (limited to 'src/interactive')
-rw-r--r--src/interactive/app/eventloop.rs29
-rw-r--r--src/interactive/app/state.rs4
-rw-r--r--src/interactive/app/terminal.rs22
-rw-r--r--src/interactive/app/tree_view.rs12
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);
}
}