ezwin/window/
input.rs

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  // KEYBOARD
89
90  pub fn key(&self, keycode: Key) -> KeyState {
91    self
92      .keys
93      .get(&keycode)
94      .copied()
95      .unwrap_or(KeyState::Released)
96  }
97
98  // MOUSE
99
100  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  // MODS
109
110  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}