1use crossterm::KeyEvent;
2
3use crate::geo::prelude::*;
4use crate::settings::SettingsInput;
5
6pub mod prelude {
7 pub use super::InputKey;
8 pub use super::InputManager;
9}
10
11pub struct InputManager {
12 settings: SettingsInput,
13 pressed: Vec<InputKey>,
14}
15
16impl InputManager {
17 pub fn new(settings: SettingsInput) -> Self {
18 Self {
19 settings,
20 pressed: Vec::new(),
21 }
22 }
23
24 pub fn is_pressed(&self, key: InputKey) -> bool {
25 self.pressed.contains(&key)
26 }
27
28 pub fn clear(&mut self) {
29 self.pressed.clear();
30 }
31
32 pub fn input(&mut self, key_event: KeyEvent) {
33 let key_string = key_event_to_string(key_event);
34
35 if self.settings.quit.contains(&key_string) {
37 self.insert_pressed(InputKey::Quit);
38 }
39 if self.settings.paddle_left.up.contains(&key_string) {
41 self.insert_pressed(InputKey::PaddleUp(Side::Left));
42 }
43 if self.settings.paddle_left.down.contains(&key_string) {
44 self.insert_pressed(InputKey::PaddleDown(Side::Left));
45 }
46 if self.settings.paddle_right.up.contains(&key_string) {
48 self.insert_pressed(InputKey::PaddleUp(Side::Right));
49 }
50 if self.settings.paddle_right.down.contains(&key_string) {
51 self.insert_pressed(InputKey::PaddleDown(Side::Right));
52 }
53 }
54
55 fn insert_pressed(&mut self, key: InputKey) {
56 if !self.pressed.contains(&key) {
57 self.pressed.push(key);
58 }
59 }
60}
61
62#[derive(PartialEq)]
63pub enum InputKey {
64 Quit,
65 PaddleUp(Side),
66 PaddleDown(Side),
67}
68
69#[rustfmt::skip]
70fn key_event_to_string(key_event: KeyEvent) -> String {
71 match key_event {
72 KeyEvent::Backspace => "Backspace".to_string(),
73 KeyEvent::Enter => "Enter".to_string(),
74 KeyEvent::Left => "Left".to_string(),
75 KeyEvent::Right => "Right".to_string(),
76 KeyEvent::Up => "Up".to_string(),
77 KeyEvent::Down => "Down".to_string(),
78 KeyEvent::Home => "Home".to_string(),
79 KeyEvent::End => "End".to_string(),
80 KeyEvent::PageUp => "PageUp".to_string(),
81 KeyEvent::PageDown => "PageDown".to_string(),
82 KeyEvent::Tab => "Tab".to_string(),
83 KeyEvent::BackTab => "BackTab".to_string(),
84 KeyEvent::Delete => "Delete".to_string(),
85 KeyEvent::Insert => "Insert".to_string(),
86 KeyEvent::F(n) => format!("F{}", n),
87 KeyEvent::Char(c) => c.to_lowercase().to_string(),
88 KeyEvent::Alt(c) => format!("Alt+{}", c),
89 KeyEvent::Ctrl(c) => format!("Ctrl+{}", c),
90 KeyEvent::Null => "Null".to_string(),
91 KeyEvent::Esc => "Esc".to_string(),
92 KeyEvent::CtrlUp => "CtrlUp".to_string(),
93 KeyEvent::CtrlDown => "CtrlDown".to_string(),
94 KeyEvent::CtrlRight => "CtrlRight".to_string(),
95 KeyEvent::CtrlLeft => "CtrlLeft".to_string(),
96 KeyEvent::ShiftUp => "ShiftUp".to_string(),
97 KeyEvent::ShiftDown => "ShiftDown".to_string(),
98 KeyEvent::ShiftRight => "ShiftRight".to_string(),
99 KeyEvent::ShiftLeft => "ShiftLeft".to_string(),
100 }
101}