1use std::collections::HashMap;
2
3use self::state::KeyState;
4use crate::window::input::{key::Key, mouse::Mouse, state::ButtonState};
5
6pub mod key;
7pub mod mouse;
8pub mod state;
9
10#[derive(Debug)]
11pub struct InputState {}
12
13impl InputState {}
14
15#[derive(Debug)]
16pub struct Input {
17 mouse_buttons: HashMap<Mouse, ButtonState>,
18 keys: HashMap<Key, KeyState>,
19 shift: ButtonState,
20 ctrl: ButtonState,
21 alt: ButtonState,
22 win: ButtonState,
23}
24
25impl Input {
26 pub fn new() -> Self {
27 let mouse_buttons = HashMap::default();
28 let keys = HashMap::default();
29
30 Self {
31 mouse_buttons,
32 keys,
33 shift: Default::default(),
34 ctrl: Default::default(),
35 alt: Default::default(),
36 win: Default::default(),
37 }
38 }
39
40 pub fn update_key_state(&mut self, keycode: Key, new_state: KeyState) {
41 if let Some(old_state) = self.keys.get_mut(&keycode) {
42 *old_state = new_state;
43 }
44 }
45
46 pub fn update_mouse_button_state(&mut self, button: Mouse, new_state: ButtonState) {
47 if let Some(old_state) = self.mouse_buttons.get_mut(&button) {
48 *old_state = new_state;
49 }
50 }
51
52 pub fn update_modifiers_state(&mut self) {
53 let key = |keycode: Key| -> KeyState {
54 self
55 .keys
56 .get(&keycode)
57 .copied()
58 .unwrap_or(KeyState::Released)
59 };
60
61 self.shift = if key(Key::LeftShift).is_pressed() || key(Key::RightShift).is_pressed()
62 {
63 ButtonState::Pressed
64 } else {
65 ButtonState::Released
66 };
67
68 self.ctrl =
69 if key(Key::LeftControl).is_pressed() || key(Key::RightControl).is_pressed() {
70 ButtonState::Pressed
71 } else {
72 ButtonState::Released
73 };
74
75 self.alt = if key(Key::LeftAlt).is_pressed() || key(Key::RightAlt).is_pressed() {
76 ButtonState::Pressed
77 } else {
78 ButtonState::Released
79 };
80
81 self.win = if key(Key::LeftSuper).is_pressed() || key(Key::RightSuper).is_pressed() {
82 ButtonState::Pressed
83 } else {
84 ButtonState::Released
85 };
86 }
87
88 pub fn key(&self, keycode: Key) -> KeyState {
91 self
92 .keys
93 .get(&keycode)
94 .copied()
95 .unwrap_or(KeyState::Released)
96 }
97
98 pub fn mouse(&self, button: Mouse) -> ButtonState {
101 self
102 .mouse_buttons
103 .get(&button)
104 .copied()
105 .unwrap_or(ButtonState::Released)
106 }
107
108 pub fn shift(&self) -> ButtonState {
111 self.shift
112 }
113
114 pub fn ctrl(&self) -> ButtonState {
115 self.ctrl
116 }
117
118 pub fn alt(&self) -> ButtonState {
119 self.alt
120 }
121
122 pub fn win(&self) -> ButtonState {
123 self.win
124 }
125}
126
127impl Default for Input {
128 fn default() -> Self {
129 Self::new()
130 }
131}