diff options
author | Sebastian Thiel <sthiel@thoughtworks.com> | 2019-06-16 11:30:06 +0800 |
---|---|---|
committer | Sebastian Thiel <sthiel@thoughtworks.com> | 2019-06-16 11:30:06 +0800 |
commit | 52f40caf557c4dfdae169b39984dd6fda1f77474 (patch) | |
tree | ee945e61180d786ebfe2a8d52bbfedb2c96e10e5 | |
parent | 251ea53bbd5072a7e7315c610cbb59540f93c7a9 (diff) |
Auto-restore previously selected entries; quality of life!
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | src/interactive/app/eventloop.rs | 2 | ||||
-rw-r--r-- | src/interactive/app/handlers.rs | 38 |
3 files changed, 35 insertions, 6 deletions
@@ -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) { |