summaryrefslogtreecommitdiffstats
path: root/src/interactive
diff options
context:
space:
mode:
authorSebastian Thiel <sthiel@thoughtworks.com>2019-06-14 15:14:11 +0800
committerSebastian Thiel <sthiel@thoughtworks.com>2019-06-14 15:14:11 +0800
commit60ba3e7f5216030e7dd4a12355de6ac78999d8e1 (patch)
treeada171df8437817b60eff10a7e99e9c8570529b6 /src/interactive
parentc67abaec3c573dbfaf31be22693220a49a67b262 (diff)
first sketch of the delete-draw-loop
Diffstat (limited to 'src/interactive')
-rw-r--r--src/interactive/app/eventloop.rs4
-rw-r--r--src/interactive/app/handlers.rs32
-rw-r--r--src/interactive/app_test/journeys_with_writes.rs9
-rw-r--r--src/interactive/widgets/mark.rs21
4 files changed, 49 insertions, 17 deletions
diff --git a/src/interactive/app/eventloop.rs b/src/interactive/app/eventloop.rs
index 2d1edaa..9782da2 100644
--- a/src/interactive/app/eventloop.rs
+++ b/src/interactive/app/eventloop.rs
@@ -58,7 +58,7 @@ impl TerminalApp {
terminal.post_render()?;
Ok(())
}
- fn draw<B>(&mut self, terminal: &mut Terminal<B>) -> Result<(), Error>
+ pub fn draw<B>(&mut self, terminal: &mut Terminal<B>) -> Result<(), Error>
where
B: Backend,
{
@@ -101,7 +101,7 @@ impl TerminalApp {
}
match self.state.focussed {
- FocussedPane::Mark => self.dispatch_to_mark_pane(key),
+ FocussedPane::Mark => self.dispatch_to_mark_pane(key, terminal),
FocussedPane::Help => {
self.window.help_pane.as_mut().expect("help pane").key(key);
}
diff --git a/src/interactive/app/handlers.rs b/src/interactive/app/handlers.rs
index ff74e36..1300e42 100644
--- a/src/interactive/app/handlers.rs
+++ b/src/interactive/app/handlers.rs
@@ -1,3 +1,4 @@
+use crate::interactive::widgets::MarkMode;
use crate::interactive::{
app::{FocussedPane::*, TerminalApp},
sorted_entries,
@@ -7,6 +8,8 @@ use dua::path_of;
use itertools::Itertools;
use petgraph::Direction;
use termion::event::Key;
+use tui::backend::Backend;
+use tui_react::Terminal;
pub enum CursorDirection {
PageDown,
@@ -145,10 +148,29 @@ impl TerminalApp {
}
}
- pub fn dispatch_to_mark_pane(&mut self, key: Key) -> () {
- self.window.mark_pane = self.window.mark_pane.take().and_then(|p| p.key(key));
- if self.window.mark_pane.is_none() {
- self.state.focussed = Main;
- }
+ pub fn dispatch_to_mark_pane<B>(&mut self, key: Key, terminal: &mut Terminal<B>) -> ()
+ where
+ B: Backend,
+ {
+ let res = self.window.mark_pane.take().and_then(|p| p.key(key));
+ self.window.mark_pane = match res {
+ Some((mut pane, mode)) => match mode {
+ Some(MarkMode::Delete) => {
+ while let Some(entry_to_delete) = pane.next_entry_for_deletion() {
+ self.draw(terminal).ok();
+ match pane.delete_entry(entry_to_delete) {
+ Some(p) => pane = p,
+ None => break,
+ }
+ }
+ None
+ }
+ None => Some(pane),
+ },
+ None => {
+ self.state.focussed = Main;
+ None
+ }
+ };
}
}
diff --git a/src/interactive/app_test/journeys_with_writes.rs b/src/interactive/app_test/journeys_with_writes.rs
index 89e0924..e8cd6b5 100644
--- a/src/interactive/app_test/journeys_with_writes.rs
+++ b/src/interactive/app_test/journeys_with_writes.rs
@@ -41,14 +41,9 @@ fn basic_user_journey_with_deletion() -> Result<(), Error> {
true,
"the marker pane is gone as all entries have been removed"
);
+ assert_eq!(app.state.selected, None, "nothing is left to be selected");
assert_eq!(
- app.state.selected,
- None,
- "nothing is left to be selected"
- );
- assert_eq!(
- app.state.root,
- app.traversal.root_index,
+ app.state.root, app.traversal.root_index,
"the only root left is the top-level"
);
Ok(())
diff --git a/src/interactive/widgets/mark.rs b/src/interactive/widgets/mark.rs
index 47ae798..d78672b 100644
--- a/src/interactive/widgets/mark.rs
+++ b/src/interactive/widgets/mark.rs
@@ -24,6 +24,10 @@ use tui::{
use tui_react::{List, ListProps};
use unicode_segmentation::UnicodeSegmentation;
+pub enum MarkMode {
+ Delete,
+}
+
pub type EntryMarkMap = BTreeMap<TreeIndex, EntryMark>;
pub struct EntryMark {
pub size: u64,
@@ -84,18 +88,29 @@ impl MarkPane {
pub fn marked(&self) -> &EntryMarkMap {
&self.marked
}
- pub fn key(mut self, key: Key) -> Option<Self> {
+ pub fn key(mut self, key: Key) -> Option<(Self, Option<MarkMode>)> {
+ let action = None;
match key {
- Char('d') | Char(' ') => return self.remove_selected(),
+ 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),
Char('j') | Down => self.change_selection(CursorDirection::Down),
Ctrl('d') | PageDown => self.change_selection(CursorDirection::PageDown),
_ => {}
};
- Some(self)
+ Some((self, action))
}
+ pub(crate) fn next_entry_for_deletion(&mut self) -> Option<usize> {
+ None
+ }
+ pub(crate) fn delete_entry(self, _index: usize) -> Option<Self> {
+ Some(self)
+ }
+ fn prepare_deletion(self) -> Option<(Self, Option<MarkMode>)> {
+ Some((self, Some(MarkMode::Delete)))
+ }
fn remove_selected(mut self) -> Option<Self> {
if let Some(mut selected) = self.selected {
let (idx, se_len) = {