booktyping_core/
handler.rs

1use crate::app::{App, AppResult, DEFAULT_TEXT_WIDTH_PERCENT, FULL_TEXT_WIDTH_PERCENT};
2use crate::config::AppConfig;
3#[derive(Debug, Copy, Clone)]
4pub struct KeyDown {
5	pub code: KeyCode,
6	pub mods: KeyModifiers,
7}
8#[derive(Debug, Copy, Clone)]
9pub enum KeyCode {
10	Char(char),
11	Up,
12	Down,
13	Left,
14	Right,
15	Esc,
16	Unimplemented,
17}
18#[derive(Debug, Copy, Clone)]
19pub enum KeyModifiers {
20	Ctrl,
21	Unimplemented,
22}
23
24impl App {
25	pub fn handle_key_events(&mut self, config: &AppConfig, key_press: KeyDown) -> AppResult<()> {
26		use KeyCode as C;
27		use KeyModifiers as M;
28		match (key_press.mods, key_press.code) {
29			(M::Ctrl, C::Char('c')) => self.quit()?,
30			(M::Ctrl, C::Char('f')) => {
31				self.full_text_width = !self.full_text_width;
32				self.text_width_percent = if self.full_text_width {
33					FULL_TEXT_WIDTH_PERCENT
34				} else {
35					DEFAULT_TEXT_WIDTH_PERCENT
36				};
37				self.generate_lines()
38			}
39			(_, C::Char(c)) => self.handle_char(config, c)?,
40			(M::Ctrl, C::Up) => {
41				self.display_line = self.display_line.checked_sub(10).unwrap_or_default();
42			}
43			(M::Ctrl, C::Down) => {
44				self.display_line += 10;
45			}
46			(_, C::Up) => {
47				self.display_line = self.display_line.checked_sub(1).unwrap_or_default();
48			}
49			(_, C::Down) => {
50				self.display_line += 1;
51			}
52			(_, C::Esc) => {
53				let &(cur_line, _) = self.line_index.get(self.sample_start_index + self.text.cur_char).unwrap();
54				self.display_line = cur_line
55			}
56			_ => {}
57		}
58		Ok(())
59	}
60}