oxygengine_input_device_desktop/
mouse.rs1use 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}