diff options
author | Sebastian Thiel <sthiel@thoughtworks.com> | 2019-06-15 13:58:05 +0800 |
---|---|---|
committer | Sebastian Thiel <sthiel@thoughtworks.com> | 2019-06-15 13:58:05 +0800 |
commit | f8485c8d48fb231b113a6511ee4048712ccc27fc (patch) | |
tree | c619b6421be1cebca1819ac55c7a3283176772be | |
parent | 1ce57a29c45ee9896bfc529a13875dbc3859812f (diff) |
First half-baked version of deletion within traversal tree
No size handling for now
-rw-r--r-- | src/interactive/app/handlers.rs | 26 | ||||
-rw-r--r-- | src/interactive/widgets/help.rs | 2 | ||||
-rw-r--r-- | src/interactive/widgets/mark.rs | 10 |
3 files changed, 33 insertions, 5 deletions
diff --git a/src/interactive/app/handlers.rs b/src/interactive/app/handlers.rs index e9054aa..aed749f 100644 --- a/src/interactive/app/handlers.rs +++ b/src/interactive/app/handlers.rs @@ -6,6 +6,7 @@ use crate::interactive::{ }; use dua::traverse::TreeIndex; use itertools::Itertools; +use petgraph::visit::Bfs; use petgraph::Direction; use termion::event::Key; use tui::backend::Backend; @@ -148,7 +149,30 @@ impl TerminalApp { } } - pub fn delete_entry(&mut self, _index: TreeIndex) -> Result<(), usize> { + fn set_root(&mut self, root: TreeIndex) { + self.state.root = root; + self.state.entries = sorted_entries(&self.traversal.tree, root, self.state.sorting); + } + + pub fn delete_entry(&mut self, index: TreeIndex) -> Result<(), usize> { + if let Some(_entry) = self.traversal.tree.node_weight(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.state.entries = + sorted_entries(&self.traversal.tree, self.state.root, self.state.sorting); + if let None = self.traversal.tree.node_weight(self.state.root) { + self.set_root(self.traversal.root_index); + } + if let None = self + .state + .selected + .and_then(|selected| self.state.entries.iter().find(|e| e.index == selected)) + { + self.state.selected = self.state.entries.get(0).map(|e| e.index); + } + } Ok(()) } diff --git a/src/interactive/widgets/help.rs b/src/interactive/widgets/help.rs index 26d659b..2b855ec 100644 --- a/src/interactive/widgets/help.rs +++ b/src/interactive/widgets/help.rs @@ -146,7 +146,7 @@ impl HelpPane { { hotkey("d/<space>", "remove the selected entry from the list", None); hotkey( - "Ctrl + R", + "Ctrl + r", "Permanently delete all marked entries without prompt!", Some("This operation cannot be undone!"), ); diff --git a/src/interactive/widgets/mark.rs b/src/interactive/widgets/mark.rs index 688a48a..611dec0 100644 --- a/src/interactive/widgets/mark.rs +++ b/src/interactive/widgets/mark.rs @@ -92,7 +92,7 @@ impl MarkPane { pub fn key(mut self, key: Key) -> Option<(Self, Option<MarkMode>)> { let action = None; match key { - Ctrl('R') => return self.prepare_deletion(), + Ctrl('r') => return self.prepare_deletion(), Char('d') | Char(' ') => return self.remove_selected().map(|s| (s, action)), Ctrl('u') | PageUp => self.change_selection(CursorDirection::PageUp), Char('k') | Up => self.change_selection(CursorDirection::Up), @@ -134,7 +134,11 @@ impl MarkPane { d.num_errors_during_deletion = num_errors; } } - fn prepare_deletion(self) -> Option<(Self, Option<MarkMode>)> { + fn prepare_deletion(mut self) -> Option<(Self, Option<MarkMode>)> { + for entry in self.marked.values_mut() { + entry.num_errors_during_deletion = 0; + } + self.selected = Some(0); Some((self, Some(MarkMode::Delete))) } fn remove_selected(mut self) -> Option<Self> { @@ -314,7 +318,7 @@ impl MarkPane { Paragraph::new( [ Text::Styled( - " Ctrl + Shift + r".into(), + " Ctrl + r".into(), Style { fg: Color::LightRed, modifier: default_style.modifier | Modifier::RAPID_BLINK, |