oxygengine_input_device_desktop/
mouse.rs

1use backend::resource::DesktopAppEvents;
2use core::{ecs::Universe, Scalar};
3use glutin::event::{ElementState, MouseButton, WindowEvent};
4use input::device::InputDevice;
5use std::any::Any;
6
7#[derive(Default)]
8pub struct DesktopMouseInputDevice {
9    position: (Scalar, Scalar),
10    left_button: bool,
11    right_button: bool,
12    middle_button: bool,
13}
14
15impl InputDevice for DesktopMouseInputDevice {
16    fn name(&self) -> &str {
17        "mouse"
18    }
19
20    fn on_register(&mut self) {}
21
22    fn on_unregister(&mut self) {}
23
24    fn process(&mut self, universe: &mut Universe) {
25        let events = universe.query_resources::<&DesktopAppEvents>();
26        for event in events.iter() {
27            match event {
28                WindowEvent::MouseInput { state, button, .. } => {
29                    let state = match state {
30                        ElementState::Pressed => true,
31                        ElementState::Released => false,
32                    };
33                    match button {
34                        MouseButton::Left => {
35                            self.left_button = state;
36                        }
37                        MouseButton::Right => {
38                            self.right_button = state;
39                        }
40                        MouseButton::Middle => {
41                            self.middle_button = state;
42                        }
43                        _ => {}
44                    }
45                }
46                WindowEvent::CursorMoved { position, .. } => {
47                    self.position.0 = position.x as Scalar;
48                    self.position.1 = position.y as Scalar;
49                }
50                _ => {}
51            }
52        }
53    }
54
55    fn query_axis(&self, name: &str) -> Option<Scalar> {
56        match name {
57            "x" => Some(self.position.0),
58            "y" => Some(self.position.1),
59            _ => None,
60        }
61    }
62
63    fn query_trigger(&self, name: &str) -> Option<bool> {
64        match name {
65            "left" => Some(self.left_button),
66            "right" => Some(self.right_button),
67            "middle" => Some(self.middle_button),
68            _ => None,
69        }
70    }
71
72    fn query_text(&self) -> Option<String> {
73        None
74    }
75
76    fn as_any(&self) -> &dyn Any {
77        self
78    }
79}