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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
pub mod types { pub const MOUSE_EVENT: u8 = 0b00000001; pub const KEYBOARD_EVENT: u8 = 0b00000010; pub const SIZE_EVENT: u8 = 0b00000100; pub const FOCUS_EVENT: u8 = 0b00001000; pub const JOYSTICK_EVENT: u8 = 0b00010000; } use super::mouse::*; use super::keyboard::*; use super::joystick::*; #[derive(Debug)] pub enum Event { MouseEvent(MouseEvent), KeyboardEvent(KeyboardEvent), SizeEvent(usize, usize), FocusEvent(bool), JoystickEvent(JoystickEvent) } use std::rc::Rc; use web_sys; use std::collections::VecDeque; use std::cell::RefCell; use wasm_bindgen::{prelude::*, JsCast}; use web_sys::{window, Window as WebSysWindow}; use crate::system::log; pub struct EventManager { window: WebSysWindow, events: Rc<RefCell<VecDeque<Event>>> } impl EventManager { pub fn new() -> Self { EventManager { window: window().unwrap(), events: Rc::new(RefCell::new(VecDeque::new())) } } pub fn start_recording_mouse_events(&mut self) { use crate::inputs::mouse::*; let events2 = Rc::clone(&self.events); let click = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { events2.borrow_mut().push_back(Event::MouseEvent(MouseEvent::Click(event.client_x() as u32, event.client_y() as u32))) }) as Box<dyn FnMut(web_sys::MouseEvent)>); self.window .add_event_listener_with_callback("click", click.as_ref().unchecked_ref()) .unwrap(); click.forget(); let events2 = Rc::clone(&self.events); let event = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { events2.borrow_mut().push_back(Event::MouseEvent(MouseEvent::DoubleClick(event.client_x() as u32, event.client_y() as u32))); }) as Box<dyn FnMut(web_sys::MouseEvent)>); self.window .add_event_listener_with_callback("dblclick", event.as_ref().unchecked_ref()) .unwrap(); event.forget(); let events2 = Rc::clone(&self.events); let event = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { events2.borrow_mut().push_back(Event::MouseEvent(MouseEvent::Down(event.client_x() as u32, event.client_y() as u32))); }) as Box<dyn FnMut(web_sys::MouseEvent)>); self.window .add_event_listener_with_callback("mousedown", event.as_ref().unchecked_ref()) .unwrap(); event.forget(); let events2 = Rc::clone(&self.events); let event = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { events2.borrow_mut().push_back(Event::MouseEvent(MouseEvent::Up(event.client_x() as u32, event.client_y() as u32))); }) as Box<dyn FnMut(web_sys::MouseEvent)>); self.window .add_event_listener_with_callback("mouseup", event.as_ref().unchecked_ref()) .unwrap(); event.forget(); let events2 = Rc::clone(&self.events); let event = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { events2.borrow_mut().push_back(Event::MouseEvent(MouseEvent::Enter(event.client_x() as u32, event.client_y() as u32))); }) as Box<dyn FnMut(web_sys::MouseEvent)>); self.window .add_event_listener_with_callback("mouseenter", event.as_ref().unchecked_ref()) .unwrap(); event.forget(); let events2 = Rc::clone(&self.events); let event = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { events2.borrow_mut().push_back(Event::MouseEvent(MouseEvent::Leave(event.client_x() as u32, event.client_y() as u32))); }) as Box<dyn FnMut(web_sys::MouseEvent)>); self.window .add_event_listener_with_callback("mouseleave", event.as_ref().unchecked_ref()) .unwrap(); event.forget(); log("ok"); let events2 = Rc::clone(&self.events); let event = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { events2.borrow_mut().push_back(Event::MouseEvent(MouseEvent::Move(event.client_x() as u32, event.client_y() as u32))); }) as Box<dyn FnMut(web_sys::MouseEvent)>); self.window .add_event_listener_with_callback("mousemove", event.as_ref().unchecked_ref()) .unwrap(); event.forget(); let events2 = Rc::clone(&self.events); let event = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { events2.borrow_mut().push_back(Event::MouseEvent(MouseEvent::RightClick(event.client_x() as u32, event.client_y() as u32))); log("test"); }) as Box<dyn FnMut(web_sys::MouseEvent)>); self.window .add_event_listener_with_callback("contextmenu", event.as_ref().unchecked_ref()) .unwrap(); event.forget(); } pub fn start_recording_keyboard_events(&mut self) { use crate::inputs::keyboard::*; let events2 = Rc::clone(&self.events); let click = Closure::wrap(Box::new(move |event: web_sys::KeyboardEvent| { events2.borrow_mut().push_back(Event::KeyboardEvent(KeyboardEvent::Up(Key::from(event.key_code())))) }) as Box<dyn FnMut(web_sys::KeyboardEvent)>); self.window .add_event_listener_with_callback("keyup", click.as_ref().unchecked_ref()) .unwrap(); click.forget(); let events2 = Rc::clone(&self.events); let event = Closure::wrap(Box::new(move |event: web_sys::KeyboardEvent| { events2.borrow_mut().push_back(Event::KeyboardEvent(KeyboardEvent::Down(Key::from(event.key_code())))); }) as Box<dyn FnMut(web_sys::KeyboardEvent)>); self.window .add_event_listener_with_callback("keydown", event.as_ref().unchecked_ref()) .unwrap(); event.forget(); } } impl Iterator for EventManager { type Item = Event; fn next(&mut self) -> Option<Self::Item> { self.events.borrow_mut().pop_front() } }