From 7de075df49faca5018b1051b7ef15d75bdafa2b9 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Thu, 16 May 2019 00:58:40 +0300 Subject: [PATCH] ui: add Home/End movements --- ui/src/components/mail/listing/compact.rs | 21 ++++++++++--- ui/src/components/mail/listing/plain.rs | 38 +++++++++++++++++++++++ ui/src/components/mail/listing/thread.rs | 18 +++++++++++ ui/src/components/utilities.rs | 8 +++++ 4 files changed, 80 insertions(+), 5 deletions(-) diff --git a/ui/src/components/mail/listing/compact.rs b/ui/src/components/mail/listing/compact.rs index 242283a7d..923c43b99 100644 --- a/ui/src/components/mail/listing/compact.rs +++ b/ui/src/components/mail/listing/compact.rs @@ -443,15 +443,18 @@ impl MailboxView { self.new_cursor_pos.2 = self.new_cursor_pos.2.saturating_sub(rows); } PageMovement::PageDown => { - /* This might "overflow" beyond the max_cursor_pos boundary if it's not yet - * set. TODO: Rework the page up/down stuff - */ - if self.new_cursor_pos.2 + 2 * rows + 1 < self.length { + if self.new_cursor_pos.2 + rows + 1 < self.length { self.new_cursor_pos.2 += rows; } else { - self.new_cursor_pos.2 = self.length.saturating_sub(rows).saturating_sub(1); + self.new_cursor_pos.2 = (self.length / rows) * rows; } } + PageMovement::Home => { + self.new_cursor_pos.2 = 0; + } + PageMovement::End => { + self.new_cursor_pos.2 = (self.length / rows) * rows; + } } } @@ -597,6 +600,14 @@ impl Component for MailboxView { self.movement = Some(PageMovement::PageDown); self.set_dirty(); } + UIEvent::Input(ref key) if *key == Key::Home => { + self.movement = Some(PageMovement::Home); + self.set_dirty(); + } + UIEvent::Input(ref key) if *key == Key::End => { + self.movement = Some(PageMovement::End); + self.set_dirty(); + } UIEvent::Input(ref k) if self.unfocused && *k == shortcuts["exit_thread"] => { self.unfocused = false; self.dirty = true; diff --git a/ui/src/components/mail/listing/plain.rs b/ui/src/components/mail/listing/plain.rs index 8daeba3ec..b1245594a 100644 --- a/ui/src/components/mail/listing/plain.rs +++ b/ui/src/components/mail/listing/plain.rs @@ -41,6 +41,7 @@ pub struct PlainListing { /// If `self.view` exists or not. unfocused: bool, view: Option, + movement: Option, id: ComponentId, } @@ -90,6 +91,7 @@ impl PlainListing { dirty: true, unfocused: false, view: None, + movement: None, id: ComponentId::new_v4(), } } @@ -265,6 +267,26 @@ impl PlainListing { return; } let rows = get_y(bottom_right) - get_y(upper_left) + 1; + if let Some(mvm) = self.movement.take() { + match mvm { + PageMovement::PageUp => { + self.new_cursor_pos.2 = self.new_cursor_pos.2.saturating_sub(rows); + } + PageMovement::PageDown => { + if self.new_cursor_pos.2 + rows + 1 < self.length { + self.new_cursor_pos.2 += rows; + } else { + self.new_cursor_pos.2 = (self.length / rows) * rows; + } + } + PageMovement::Home => { + self.new_cursor_pos.2 = 0; + } + PageMovement::End => { + self.new_cursor_pos.2 = (self.length / rows) * rows; + } + } + } let prev_page_no = (self.cursor_pos.2).wrapping_div(rows); let page_no = (self.new_cursor_pos.2).wrapping_div(rows); @@ -429,6 +451,22 @@ impl Component for PlainListing { } return true; } + UIEvent::Input(ref key) if *key == Key::PageUp => { + self.movement = Some(PageMovement::PageUp); + self.set_dirty(); + } + UIEvent::Input(ref key) if *key == Key::PageDown => { + self.movement = Some(PageMovement::PageDown); + self.set_dirty(); + } + UIEvent::Input(ref key) if *key == Key::Home => { + self.movement = Some(PageMovement::Home); + self.set_dirty(); + } + UIEvent::Input(ref key) if *key == Key::End => { + self.movement = Some(PageMovement::End); + self.set_dirty(); + } UIEvent::Input(Key::Char('\n')) if !self.unfocused => { self.unfocused = true; self.dirty = true; diff --git a/ui/src/components/mail/listing/thread.rs b/ui/src/components/mail/listing/thread.rs index 0501751fb..268480105 100644 --- a/ui/src/components/mail/listing/thread.rs +++ b/ui/src/components/mail/listing/thread.rs @@ -44,6 +44,7 @@ pub struct ThreadListing { unfocused: bool, initialised: bool, view: Option, + movement: Option, id: ComponentId, } @@ -87,6 +88,7 @@ impl ThreadListing { unfocused: false, view: None, initialised: false, + movement: None, id: ComponentId::new_v4(), } } @@ -570,6 +572,22 @@ impl Component for ThreadListing { } return true; } + UIEvent::Input(ref key) if *key == Key::PageUp => { + self.movement = Some(PageMovement::PageUp); + self.set_dirty(); + } + UIEvent::Input(ref key) if *key == Key::PageDown => { + self.movement = Some(PageMovement::PageDown); + self.set_dirty(); + } + UIEvent::Input(ref key) if *key == Key::Home => { + self.movement = Some(PageMovement::Home); + self.set_dirty(); + } + UIEvent::Input(ref key) if *key == Key::End => { + self.movement = Some(PageMovement::End); + self.set_dirty(); + } UIEvent::Input(Key::Char('\n')) if !self.unfocused => { self.unfocused = true; self.dirty = true; diff --git a/ui/src/components/utilities.rs b/ui/src/components/utilities.rs index ea7c208bd..326910153 100644 --- a/ui/src/components/utilities.rs +++ b/ui/src/components/utilities.rs @@ -264,8 +264,10 @@ impl Component for VSplit { #[derive(Debug)] pub enum PageMovement { + Home, PageUp, PageDown, + End, } /// A pager for text. @@ -450,6 +452,12 @@ impl Component for Pager { self.cursor_pos += height; } } + PageMovement::Home => { + self.cursor_pos = 0; + } + PageMovement::End => { + self.cursor_pos = (self.height / height) * height; + } } }