pong_cli/input/
mod.rs

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        // Check Quit
36        if self.settings.quit.contains(&key_string) {
37            self.insert_pressed(InputKey::Quit);
38        }
39        // Check left paddle's binds
40        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        // Check right paddle's binds
47        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}