ui: add Home/End movements

embed
Manos Pitsidianakis 2019-05-16 00:58:40 +03:00
parent 6504a141f3
commit 7de075df49
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
4 changed files with 80 additions and 5 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
}
}