booktyping_core/
handler.rs1use 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}