Skip to main content

decay/core/
input.rs

1/// A keyboard key identifier.
2#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
3pub enum KeyCode {
4    Char(char),
5    Enter,
6    Escape,
7    Tab,
8    BackTab,
9    Up,
10    Down,
11    Left,
12    Right,
13    Backspace,
14}
15
16/// Mouse button type.
17#[derive(Clone, Copy, PartialEq, Eq, Debug)]
18pub enum MouseButton {
19    Left,
20    Right,
21    Middle,
22}
23
24/// Kind of mouse event.
25#[derive(Clone, Copy, PartialEq, Eq, Debug)]
26pub enum MouseKind {
27    Press(MouseButton),
28    Release(MouseButton),
29    Move,
30    ScrollUp,
31    ScrollDown,
32}
33
34/// A mouse event with position and kind.
35#[derive(Clone, Copy, Debug)]
36pub struct MouseEvent {
37    pub kind: MouseKind,
38    pub col: u16,
39    pub row: u16,
40}
41
42/// Tracks keys and mouse events during the current frame.
43pub struct Input {
44    pressed: Vec<KeyCode>,
45    mouse: Vec<MouseEvent>,
46}
47
48impl super::resource::Resource for Input {}
49
50impl Input {
51    pub fn new() -> Self {
52        Self { pressed: Vec::with_capacity(8), mouse: Vec::with_capacity(4) }
53    }
54
55    pub fn just_pressed(&self, key: KeyCode) -> bool {
56        self.pressed.contains(&key)
57    }
58
59    pub fn pressed_keys(&self) -> &[KeyCode] {
60        &self.pressed
61    }
62
63    pub fn mouse_events(&self) -> &[MouseEvent] {
64        &self.mouse
65    }
66
67    pub(crate) fn clear(&mut self) {
68        self.pressed.clear();
69        self.mouse.clear();
70    }
71
72    pub(crate) fn press(&mut self, key: KeyCode) {
73        self.pressed.push(key);
74    }
75
76    pub(crate) fn push_mouse(&mut self, event: MouseEvent) {
77        self.mouse.push(event);
78    }
79}