summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Thiel <sthiel@thoughtworks.com>2019-06-15 13:58:05 +0800
committerSebastian Thiel <sthiel@thoughtworks.com>2019-06-15 13:58:05 +0800
commitf8485c8d48fb231b113a6511ee4048712ccc27fc (patch)
treec619b6421be1cebca1819ac55c7a3283176772be
parent1ce57a29c45ee9896bfc529a13875dbc3859812f (diff)
First half-baked version of deletion within traversal tree
No size handling for now
-rw-r--r--src/interactive/app/handlers.rs26
-rw-r--r--src/interactive/widgets/help.rs2
-rw-r--r--src/interactive/widgets/mark.rs10
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,