summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2019-05-16 00:58:40 +0300
committerManos Pitsidianakis <el13635@mail.ntua.gr>2019-06-10 19:40:49 +0300
commit7de075df49faca5018b1051b7ef15d75bdafa2b9 (patch)
tree1cbaa5e81c45f345d933b8335b11e3a0c70e80d4
parent6504a141f33a37b8eeb004ad5f031023eb493d7d (diff)
ui: add Home/End movements
-rw-r--r--ui/src/components/mail/listing/compact.rs21
-rw-r--r--ui/src/components/mail/listing/plain.rs38
-rw-r--r--ui/src/components/mail/listing/thread.rs18
-rw-r--r--ui/src/components/utilities.rs8
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 242283a7..923c43b9 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 8daeba3e..b1245594 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<MailView>,
+ movement: Option<PageMovement>,
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 0501751f..26848010 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<MailView>,
+ movement: Option<PageMovement>,
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 ea7c208b..32691015 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;
+ }
}
}