Skip to content

Commit

Permalink
Implement Ctrl+t move to trash
Browse files Browse the repository at this point in the history
  • Loading branch information
FedericoStra committed Jun 27, 2021
1 parent 5534cd7 commit 00fae90
Show file tree
Hide file tree
Showing 5 changed files with 273 additions and 0 deletions.
199 changes: 199 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ num_cpus = "1.10.0"
filesize = "0.2.0"
anyhow = "1.0.31"
colored = "2.0.0"
trash = "2.0.1"

# 'tui' related
unicode-segmentation = { version = "1.3.0", optional = true }
Expand Down
59 changes: 59 additions & 0 deletions src/interactive/app/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use dua::traverse::{Traversal, TreeIndex};
use itertools::Itertools;
use petgraph::{visit::Bfs, Direction};
use std::{fs, io, path::PathBuf};
use trash;
use tui::backend::Backend;
use tui_react::Terminal;

Expand Down Expand Up @@ -229,6 +230,26 @@ impl AppState {
self.message = None;
res
}
Some(MarkMode::Trash) => {
self.message = Some("Trashing entries...".to_string());
let mut entries_trashed = 0;
let res = pane.iterate_deletable_items(|mut pane, entry_to_trash| {
window.mark_pane = Some(pane);
self.draw(window, traversal, display, terminal).ok();
pane = window.mark_pane.take().expect("option to be filled");
match self.trash_entry(entry_to_trash, traversal) {
Ok(ed) => {
entries_trashed += ed;
self.message =
Some(format!("Trashed {} entries...", entries_trashed));
Ok(pane)
}
Err(c) => Err((pane, c)),
}
});
self.message = None;
res
}
None => Some(pane),
},
None => None,
Expand Down Expand Up @@ -274,6 +295,44 @@ impl AppState {
Ok(entries_deleted)
}

pub fn trash_entry(
&mut self,
index: TreeIndex,
traversal: &mut Traversal,
) -> Result<usize, usize> {
let mut entries_trashed = 0;
if let Some(_entry) = traversal.tree.node_weight(index) {
let path_to_delete = path_of(&traversal.tree, index);
if let Err(_) = trash::delete(path_to_delete) {
return Err(1);
}
let parent_idx = traversal
.tree
.neighbors_directed(index, Direction::Incoming)
.next()
.expect("us being unable to delete the root index");
let mut bfs = Bfs::new(&traversal.tree, index);
while let Some(nx) = bfs.next(&traversal.tree) {
traversal.tree.remove_node(nx);
traversal.entries_traversed -= 1;
entries_trashed += 1;
}
self.entries = sorted_entries(&traversal.tree, self.root, self.sorting);
if traversal.tree.node_weight(self.root).is_none() {
self.set_root(traversal.root_index, traversal);
}
if self
.selected
.and_then(|selected| self.entries.iter().find(|e| e.index == selected))
.is_none()
{
self.selected = self.entries.get(0).map(|e| e.index);
}
self.recompute_sizes_recursively(parent_idx, traversal);
}
Ok(entries_trashed)
}

fn set_root(&mut self, root: TreeIndex, traversal: &Traversal) {
self.root = root;
self.entries = sorted_entries(&traversal.tree, root, self.sorting);
Expand Down
5 changes: 5 additions & 0 deletions src/interactive/widgets/help.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,11 @@ impl HelpPane {
"Permanently delete all marked entries without prompt!",
Some("This operation cannot be undone!"),
);
hotkey(
"Ctrl + t",
"Move all marked entries to the trash bin",
Some("The entries can be restored from the trash bin"),
);
spacer();
}
title("Keys for application control");
Expand Down
Loading

0 comments on commit 00fae90

Please sign in to comment.