diff options
author | Tim Oram <dev@mitmaro.ca> | 2021-04-02 10:44:33 -0230 |
---|---|---|
committer | Tim Oram <dev@mitmaro.ca> | 2021-06-12 11:06:54 -0230 |
commit | e976c5ee61c8c8640eabdb4c596c097dbff35720 (patch) | |
tree | 14609623a1620c64ad6d72fe76d05f6998810e04 | |
parent | f85ceaed20340307225ce0ad70de72a99714e6b4 (diff) |
Move input handling out of Display
-rw-r--r-- | src/display/mod.rs | 138 | ||||
-rw-r--r-- | src/main.rs | 7 | ||||
-rw-r--r-- | src/process/testutil.rs | 4 | ||||
-rw-r--r-- | src/view/mod.rs | 28 |
4 files changed, 42 insertions, 135 deletions
diff --git a/src/display/mod.rs b/src/display/mod.rs index 962ac26..736503d 100644 --- a/src/display/mod.rs +++ b/src/display/mod.rs @@ -21,15 +21,10 @@ use self::crossterm as ct; use crate::{ config::theme::Theme, display::{display_color::DisplayColor, size::Size, utils::register_selectable_color_pairs}, - input::{ - input_handler::{InputHandler, InputMode}, - Input, - }, }; pub struct Display<'d> { crossterm: &'d mut CrossTerm, - input_handler: InputHandler<'d>, action_break: (Colors, Colors), action_drop: (Colors, Colors), action_edit: (Colors, Colors), @@ -51,7 +46,7 @@ pub struct Display<'d> { } impl<'d> Display<'d> { - pub(crate) fn new(input_handler: InputHandler<'d>, crossterm: &'d mut CrossTerm, theme: &'d Theme) -> Self { + pub(crate) fn new(crossterm: &'d mut CrossTerm, theme: &'d Theme) -> Self { let color_mode = crossterm.get_color_mode(); let normal = register_selectable_color_pairs( color_mode, @@ -164,7 +159,6 @@ impl<'d> Display<'d> { Self { crossterm, - input_handler, normal, indicator, action_break, @@ -271,16 +265,6 @@ impl<'d> Display<'d> { self.crossterm.get_size() } - pub(crate) fn get_input(&self, mode: InputMode) -> Input { - // TODO remove ignore hack - loop { - let input = CrossTerm::read_event().map_or(Input::Other, |input| self.input_handler.get_input(mode, input)); - if input != Input::Ignore { - return input; - } - } - } - pub(crate) fn ensure_at_line_start(&mut self) -> Result<()> { self.crossterm.move_to_column(1) } @@ -307,27 +291,19 @@ impl<'d> Display<'d> { #[cfg(test)] mod tests { - use crossterm::event::MouseEvent; use rstest::rstest; use super::*; - use crate::{ - create_key_event, - display::{ - mockcrossterm::State, - testutil::{display_module_test, TestContext}, - }, + use crate::display::{ + mockcrossterm::State, + testutil::{display_module_test, TestContext}, }; #[test] #[serial_test::serial] fn draw_str() { display_module_test(|mut test_context: TestContext<'_>| { - let mut display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); + let mut display = Display::new(&mut test_context.crossterm, &test_context.config.theme); display.draw_str("Test String").unwrap(); let output = CrossTerm::get_output(); assert_eq!(output, vec!["Test String"]); @@ -342,11 +318,7 @@ mod tests { test_context.crossterm.set_dim(true).unwrap(); test_context.crossterm.set_reverse(true).unwrap(); test_context.crossterm.set_underline(true).unwrap(); - let mut display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); + let mut display = Display::new(&mut test_context.crossterm, &test_context.config.theme); display.clear().unwrap(); assert!(CrossTerm::get_output().is_empty()); assert!(CrossTerm::get_output().is_empty()); @@ -360,11 +332,7 @@ mod tests { #[serial_test::serial] fn refresh() { display_module_test(|mut test_context: TestContext<'_>| { - let mut display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); + let mut display = Display::new(&mut test_context.crossterm, &test_context.config.theme); display.refresh().unwrap(); assert!(!test_context.crossterm.is_dirty()); }); @@ -510,11 +478,7 @@ mod tests { expected_background: CrosstermColor, ) { display_module_test(|mut test_context: TestContext<'_>| { - let mut display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); + let mut display = Display::new(&mut test_context.crossterm, &test_context.config.theme); display.color(display_color, selected).unwrap(); assert!(test_context .crossterm @@ -538,11 +502,7 @@ mod tests { #[serial_test::serial()] fn style(dim: bool, underline: bool, reverse: bool) { display_module_test(|mut test_context: TestContext<'_>| { - let mut display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); + let mut display = Display::new(&mut test_context.crossterm, &test_context.config.theme); display.set_style(dim, underline, reverse).unwrap(); assert_eq!(test_context.crossterm.is_dimmed(), dim); assert_eq!(test_context.crossterm.is_underline(), underline); @@ -552,64 +512,10 @@ mod tests { #[test] #[serial_test::serial] - fn get_input_success() { - display_module_test(|mut test_context: TestContext<'_>| { - CrossTerm::set_inputs(vec![create_key_event!('z')]); - let display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); - assert_eq!(display.get_input(InputMode::Default), Input::Character('z')); - }); - } - - #[test] - #[serial_test::serial] - fn get_input_fail() { - display_module_test(|mut test_context: TestContext<'_>| { - CrossTerm::set_inputs(vec![]); - let display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); - assert_eq!(display.get_input(InputMode::Default), Input::Other); - }); - } - - #[test] - #[serial_test::serial] - fn get_input_ignore_hack() { - display_module_test(|mut test_context: TestContext<'_>| { - CrossTerm::set_inputs(vec![ - Event::Mouse(MouseEvent { - kind: MouseEventKind::Moved, - column: 0, - row: 0, - modifiers: KeyModifiers::NONE, - }), - create_key_event!('z'), - ]); - let display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); - assert_eq!(display.get_input(InputMode::Default), Input::Character('z')); - }); - } - - #[test] - #[serial_test::serial] fn get_window_size() { display_module_test(|mut test_context: TestContext<'_>| { test_context.crossterm.set_size(Size::new(12, 10)); - let display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); + let display = Display::new(&mut test_context.crossterm, &test_context.config.theme); assert_eq!(display.get_window_size(), Size::new(12, 10)); }); } @@ -618,11 +524,7 @@ mod tests { #[serial_test::serial] fn ensure_at_line_start() { display_module_test(|mut test_context: TestContext<'_>| { - let mut display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); + let mut display = Display::new(&mut test_context.crossterm, &test_context.config.theme); display.ensure_at_line_start().unwrap(); assert_eq!(test_context.crossterm.get_position(), (1, 0)); }); @@ -633,11 +535,7 @@ mod tests { fn move_from_end_of_line() { display_module_test(|mut test_context: TestContext<'_>| { test_context.crossterm.set_size(Size::new(20, 10)); - let mut display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); + let mut display = Display::new(&mut test_context.crossterm, &test_context.config.theme); display.move_from_end_of_line(5).unwrap(); // character after the 15th character (16th) assert_eq!(test_context.crossterm.get_position(), (16, 0)); @@ -648,11 +546,7 @@ mod tests { #[serial_test::serial] fn start() { display_module_test(|mut test_context: TestContext<'_>| { - let mut display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); + let mut display = Display::new(&mut test_context.crossterm, &test_context.config.theme); display.start().unwrap(); assert_eq!(test_context.crossterm.get_state(), State::Normal); }); @@ -662,11 +556,7 @@ mod tests { #[serial_test::serial] fn end() { display_module_test(|mut test_context: TestContext<'_>| { - let mut display = Display::new( - test_context.input_handler, - &mut test_context.crossterm, - &test_context.config.theme, - ); + let mut display = Display::new(&mut test_context.crossterm, &test_context.config.theme); display.end().unwrap(); assert_eq!(test_context.crossterm.get_state(), State::Ended); }); diff --git a/src/main.rs b/src/main.rs index 9298833..6ecf0e7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -168,9 +168,12 @@ fn try_main(filepath: &str) -> Result<ExitStatus, Exit> { } let mut crossterm = CrossTerm::new(); - let display = Display::new(InputHandler::new(&config.key_bindings), &mut crossterm, &config.theme); + let display = Display::new(&mut crossterm, &config.theme); let modules = Modules::new(&config); - let mut process = Process::new(todo_file, View::new(display, &config)); + let mut process = Process::new( + todo_file, + View::new(InputHandler::new(&config.key_bindings), display, &config), + ); let result = process.run(modules); result diff --git a/src/process/testutil.rs b/src/process/testutil.rs index 25563fa..6335a04 100644 --- a/src/process/testutil.rs +++ b/src/process/testutil.rs @@ -376,8 +376,8 @@ where C: for<'p> FnOnce(TestContext<'p>) { .collect(), ); let input_handler = InputHandler::new(&config.key_bindings); - let display = Display::new(input_handler, &mut crossterm, &config.theme); - let view = View::new(display, &config); + let display = Display::new(&mut crossterm, &config.theme); + let view = View::new(input_handler, display, &config); let todo_file = Builder::new() .prefix("git-rebase-todo-scratch") .suffix("") diff --git a/src/view/mod.rs b/src/view/mod.rs index 75c269c..0be27d5 100644 --- a/src/view/mod.rs +++ b/src/view/mod.rs @@ -9,8 +9,11 @@ pub mod view_line; use anyhow::Result; use crate::{ - display::{display_color::DisplayColor, Display}, - input::{input_handler::InputMode, Input}, + display::{display_color::DisplayColor, CrossTerm, Display}, + input::{ + input_handler::{InputHandler, InputMode}, + Input, + }, view::{render_context::RenderContext, view_data::ViewData, view_line::ViewLine}, Config, }; @@ -22,11 +25,16 @@ const TITLE_HELP_INDICATOR_LABEL: &str = "Help: "; pub struct View<'v> { config: &'v Config, display: Display<'v>, + input_handler: InputHandler<'v>, } impl<'v> View<'v> { - pub(crate) const fn new(display: Display<'v>, config: &'v Config) -> Self { - Self { display, config } + pub(crate) const fn new(input_handler: InputHandler<'v>, display: Display<'v>, config: &'v Config) -> Self { + Self { + config, + display, + input_handler, + } } pub(crate) fn start(&mut self) -> Result<()> { @@ -38,7 +46,13 @@ impl<'v> View<'v> { } pub(crate) fn get_input(&self, mode: InputMode) -> Input { - self.display.get_input(mode) + // TODO remove ignore hack + loop { + let input = CrossTerm::read_event().map_or(Input::Other, |input| self.input_handler.get_input(mode, input)); + if input != Input::Ignore { + return input; + } + } } pub(crate) fn get_render_context(&self) -> RenderContext { @@ -211,8 +225,8 @@ mod tests { let mut crossterm = CrossTerm::new(); crossterm.set_size(size); let input_handler = InputHandler::new(&config.key_bindings); - let display = Display::new(input_handler, &mut crossterm, &config.theme); - let view = View::new(display, &config); + let display = Display::new(&mut crossterm, &config.theme); + let view = View::new(input_handler, display, &config); callback(TestContext { view }); } |