summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Thiel <sthiel@thoughtworks.com>2019-06-16 11:30:06 +0800
committerSebastian Thiel <sthiel@thoughtworks.com>2019-06-16 11:30:06 +0800
commit52f40caf557c4dfdae169b39984dd6fda1f77474 (patch)
treeee945e61180d786ebfe2a8d52bbfedb2c96e10e5
parent251ea53bbd5072a7e7315c610cbb59540f93c7a9 (diff)
Auto-restore previously selected entries; quality of life!
-rw-r--r--README.md1
-rw-r--r--src/interactive/app/eventloop.rs2
-rw-r--r--src/interactive/app/handlers.rs38
3 files changed, 35 insertions, 6 deletions
diff --git a/README.md b/README.md
index a8a3997..bc41e8e 100644
--- a/README.md
+++ b/README.md
@@ -47,6 +47,7 @@ dua interactive
* windows support
* additional key-bindings
+* auto-restore previous selection in each visited directory
#### ✅ v2.0.1- bug fixes and improvements
diff --git a/src/interactive/app/eventloop.rs b/src/interactive/app/eventloop.rs
index 3522720..a85ad1e 100644
--- a/src/interactive/app/eventloop.rs
+++ b/src/interactive/app/eventloop.rs
@@ -8,6 +8,7 @@ use dua::{
WalkOptions, WalkResult,
};
use failure::Error;
+use std::collections::BTreeMap;
use std::{io, path::PathBuf};
use termion::event::Key;
use tui::backend::Backend;
@@ -34,6 +35,7 @@ pub struct AppState {
pub sorting: SortMode,
pub message: Option<String>,
pub focussed: FocussedPane,
+ pub bookmarks: BTreeMap<TreeIndex, TreeIndex>,
}
/// State and methods representing the interactive disk usage analyser for the terminal
diff --git a/src/interactive/app/handlers.rs b/src/interactive/app/handlers.rs
index 41aa963..d65dab8 100644
--- a/src/interactive/app/handlers.rs
+++ b/src/interactive/app/handlers.rs
@@ -90,18 +90,41 @@ impl TerminalApp {
self.state.root = parent_idx;
self.state.entries =
sorted_entries(&self.traversal.tree, parent_idx, self.state.sorting);
- self.state.selected = self.state.entries.get(0).map(|b| b.index);
+ self.state.selected = self
+ .state
+ .bookmarks
+ .get(&parent_idx)
+ .map(|v| *v)
+ .or_else(|| self.state.entries.get(0).map(|b| b.index));
}
None => self.state.message = Some("Top level reached".into()),
}
}
pub fn enter_node(&mut self) {
- if let Some(new_root) = self.state.selected {
- let new_entries = sorted_entries(&self.traversal.tree, new_root, self.state.sorting);
- match new_entries.get(0) {
+ if let Some(previously_selected) = self.state.selected {
+ let new_entries = sorted_entries(
+ &self.traversal.tree,
+ previously_selected,
+ self.state.sorting,
+ );
+ match new_entries.get(
+ self.state
+ .bookmarks
+ .get(&previously_selected)
+ .and_then(|selected| {
+ new_entries
+ .iter()
+ .find_position(|b| b.index == *selected)
+ .map(|(pos, _)| pos)
+ })
+ .unwrap_or(0),
+ ) {
Some(b) => {
- self.state.root = new_root;
+ self.state
+ .bookmarks
+ .insert(self.state.root, previously_selected);
+ self.state.root = previously_selected;
self.state.selected = Some(b.index);
self.state.entries = new_entries;
}
@@ -124,7 +147,10 @@ impl TerminalApp {
.get(next_selected_pos)
.or_else(|| entries.last())
.map(|b| b.index)
- .or(self.state.selected)
+ .or(self.state.selected);
+ if let Some(selected) = self.state.selected {
+ self.state.bookmarks.insert(self.state.root, selected);
+ }
}
pub fn cycle_sorting(&mut self) {