summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Oram <dev@mitmaro.ca>2021-04-02 10:44:33 -0230
committerTim Oram <dev@mitmaro.ca>2021-06-12 11:06:54 -0230
commite976c5ee61c8c8640eabdb4c596c097dbff35720 (patch)
tree14609623a1620c64ad6d72fe76d05f6998810e04
parentf85ceaed20340307225ce0ad70de72a99714e6b4 (diff)
Move input handling out of Display
-rw-r--r--src/display/mod.rs138
-rw-r--r--src/main.rs7
-rw-r--r--src/process/testutil.rs4
-rw-r--r--src/view/mod.rs28
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 });
}