From 061ad37dce3592c1a24b6a2db35a8b5728f9cfdc Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Sun, 10 May 2020 22:14:02 +0200 Subject: [PATCH] support end button in file tree (#43) --- src/components/changes.rs | 3 +++ src/components/diff.rs | 2 -- src/components/statustree.rs | 23 +++++++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/components/changes.rs b/src/components/changes.rs index b460d8fc..7e9b74e1 100644 --- a/src/components/changes.rs +++ b/src/components/changes.rs @@ -361,6 +361,9 @@ impl Component for ChangesComponent { keys::HOME | keys::SHIFT_UP => { self.move_selection(MoveSelection::Home) } + keys::END | keys::SHIFT_DOWN => { + self.move_selection(MoveSelection::End) + } keys::MOVE_LEFT => { self.move_selection(MoveSelection::Left) } diff --git a/src/components/diff.rs b/src/components/diff.rs index 8349244d..7ae3374f 100644 --- a/src/components/diff.rs +++ b/src/components/diff.rs @@ -99,11 +99,9 @@ impl DiffComponent { self.scroll.saturating_add(1), ); } - ScrollType::Up => { self.scroll = self.scroll.saturating_sub(1); } - ScrollType::Home => self.scroll = 0, ScrollType::End => self.scroll = scroll_max, } diff --git a/src/components/statustree.rs b/src/components/statustree.rs index 47976bdc..c2fe65a6 100644 --- a/src/components/statustree.rs +++ b/src/components/statustree.rs @@ -19,6 +19,7 @@ pub enum MoveSelection { Left, Right, Home, + End, } #[derive(Copy, Clone, Debug)] @@ -73,6 +74,7 @@ impl StatusTree { self.selection_right(selection) } MoveSelection::Home => SelectionChange::new(0, false), + MoveSelection::End => self.selection_end(), }; let changed_index = @@ -162,6 +164,27 @@ impl StatusTree { SelectionChange::new(new_index, false) } + fn selection_end(&self) -> SelectionChange { + let items_max = self.tree.len().saturating_sub(1); + + let mut new_index = items_max; + + loop { + if self.is_visible_index(new_index) { + break; + } + + if new_index == 0 { + break; + } + + new_index = new_index.saturating_sub(1); + new_index = cmp::min(new_index, items_max); + } + + SelectionChange::new(new_index, false) + } + fn is_visible_index(&self, idx: usize) -> bool { self.tree[idx].info.visible }