summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Thiel <sthiel@thoughtworks.com>2019-06-15 15:00:21 +0800
committerSebastian Thiel <sthiel@thoughtworks.com>2019-06-15 15:00:21 +0800
commit48813ae0a1c9316b4a7ad1669de2c44389026769 (patch)
tree03dc395075173ba99646894388ef6b7ae131d290
parenta3627c8d04b2a755a1e466745c84591ae8e9033b (diff)
Update num entries and bytes total
-rw-r--r--src/interactive/app/handlers.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/interactive/app/handlers.rs b/src/interactive/app/handlers.rs
index a1a7358..261866c 100644
--- a/src/interactive/app/handlers.rs
+++ b/src/interactive/app/handlers.rs
@@ -156,9 +156,16 @@ impl TerminalApp {
pub fn delete_entry(&mut self, index: TreeIndex) -> Result<(), usize> {
if let Some(_entry) = self.traversal.tree.node_weight(index) {
+ let parent_idx = self
+ .traversal
+ .tree
+ .neighbors_directed(index, Direction::Incoming)
+ .next()
+ .expect("us being unable to delete the root index");
let mut bfs = Bfs::new(&self.traversal.tree, index);
while let Some(nx) = bfs.next(&self.traversal.tree) {
self.traversal.tree.remove_node(nx);
+ self.traversal.entries_traversed -= 1;
}
self.state.entries =
sorted_entries(&self.traversal.tree, self.state.root, self.state.sorting);
@@ -172,10 +179,40 @@ impl TerminalApp {
{
self.state.selected = self.state.entries.get(0).map(|e| e.index);
}
+ self.recompute_sizes_recursively(parent_idx);
}
Ok(())
}
+ fn recompute_sizes_recursively(&mut self, mut index: TreeIndex) {
+ loop {
+ self.traversal
+ .tree
+ .node_weight_mut(index)
+ .expect("valid index")
+ .size = self
+ .traversal
+ .tree
+ .neighbors_directed(index, Direction::Outgoing)
+ .filter_map(|idx| self.traversal.tree.node_weight(idx).map(|w| w.size))
+ .sum();
+ match self
+ .traversal
+ .tree
+ .neighbors_directed(index, Direction::Incoming)
+ .next()
+ {
+ None => break,
+ Some(parent) => index = parent,
+ }
+ }
+ self.traversal.total_bytes = self
+ .traversal
+ .tree
+ .node_weight(self.traversal.root_index)
+ .map(|w| w.size);
+ }
+
pub fn dispatch_to_mark_pane<B>(&mut self, key: Key, terminal: &mut Terminal<B>)
where
B: Backend,