1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#![allow(dead_code)]

use cgmath::Point2;
use std::collections::HashSet;

use miniquad::MouseButton as QuadMouseButton;

#[derive(Hash, Debug, Eq, PartialEq, Clone, Copy)]
pub enum MouseButton {
    Left,
    Middle,
    Right,
    Button4,
    Button5,
}

impl From<QuadMouseButton> for MouseButton {
    fn from(button: QuadMouseButton) -> MouseButton {
        match button {
            QuadMouseButton::Left => MouseButton::Left,
            QuadMouseButton::Right => MouseButton::Right,
            QuadMouseButton::Middle => MouseButton::Middle,
            QuadMouseButton::Unknown => MouseButton::Button4,
        }
    }
}

pub struct InputHandler {
    pub keys: HashSet<String>,
    pub frame_keys: HashSet<String>,
    pub mouse_position: Point2<f32>,
    pub mouse_keys: HashSet<MouseButton>,
    pub wheel: f32,
}

impl InputHandler {
    pub fn new() -> InputHandler {
        InputHandler {
            keys: HashSet::new(),
            frame_keys: HashSet::new(),
            mouse_position: Point2::new(0., 0.),
            mouse_keys: HashSet::new(),
            wheel: 0.,
        }
    }

    pub fn handle_mouse_move(&mut self, mouse_x: f32, mouse_y: f32) {
        self.mouse_position = Point2::new(mouse_x, mouse_y);
    }

    pub fn handle_mouse_down(&mut self, button: miniquad::MouseButton) {
        self.mouse_keys.insert(MouseButton::from(button));
    }

    pub fn handle_mouse_up(&mut self, button: miniquad::MouseButton) {
        self.mouse_keys.remove(&MouseButton::from(button));
    }

    pub fn handle_key_down(&mut self, key: String) {
        self.keys.insert(key.clone());
        self.frame_keys.insert(key);
    }

    pub fn handle_end_frame(&mut self) {
        self.frame_keys.clear();
        self.wheel = 0.;
    }

    pub fn handle_key_up(&mut self, key: String) {
        self.keys.remove(&key);
    }

    pub fn handle_mouse_wheel(&mut self, delta_y: f64) {
        self.wheel = delta_y as f32;
    }

    pub fn is_key_pressed(&self, key: &str) -> bool {
        self.keys.contains(key)
    }

    pub fn is_key_down(&self, key: &str) -> bool {
        self.frame_keys.contains(key)
    }

    pub fn is_mouse_key_down(&self, key: &MouseButton) -> bool {
        self.mouse_keys.contains(key)
    }
}