1#[derive(Debug, Clone, Eq, PartialEq)]
3pub struct KeyEvent {
4 pub code: KeyCode,
6 pub ctrl: bool,
8 pub alt: bool,
10 pub shift: bool,
12}
13
14#[derive(Debug, Clone, Eq, PartialEq)]
16pub struct MouseEvent {
17 pub button: MouseButton,
19 pub event: MouseEventKind,
21 pub x: u32,
23 pub y: u32,
25 pub ctrl: bool,
27 pub alt: bool,
29 pub shift: bool,
31}
32
33impl From<web_sys::KeyboardEvent> for KeyEvent {
35 fn from(event: web_sys::KeyboardEvent) -> Self {
36 let ctrl = event.ctrl_key();
37 let alt = event.alt_key();
38 let shift = event.shift_key();
39 KeyEvent {
40 code: event.into(),
41 ctrl,
42 alt,
43 shift,
44 }
45 }
46}
47
48#[derive(Debug, Clone, Eq, PartialEq)]
50pub enum KeyCode {
51 Char(char),
53 F(u8),
55 Backspace,
57 Enter,
59 Left,
61 Right,
63 Up,
65 Down,
67 Tab,
69 Delete,
71 Home,
73 End,
75 PageUp,
77 PageDown,
79 Esc,
81 Unidentified,
83}
84
85impl From<web_sys::KeyboardEvent> for KeyCode {
87 fn from(event: web_sys::KeyboardEvent) -> Self {
88 let key = event.key();
89 if key.len() == 1 {
90 let char = key.chars().next();
91 if let Some(char) = char {
92 return KeyCode::Char(char);
93 } else {
94 return KeyCode::Unidentified;
95 }
96 }
97 match key.as_str() {
98 "F1" => KeyCode::F(1),
99 "F2" => KeyCode::F(2),
100 "F3" => KeyCode::F(3),
101 "F4" => KeyCode::F(4),
102 "F5" => KeyCode::F(5),
103 "F6" => KeyCode::F(6),
104 "F7" => KeyCode::F(7),
105 "F8" => KeyCode::F(8),
106 "F9" => KeyCode::F(9),
107 "F10" => KeyCode::F(10),
108 "F11" => KeyCode::F(11),
109 "F12" => KeyCode::F(12),
110 "Backspace" => KeyCode::Backspace,
111 "Enter" => KeyCode::Enter,
112 "ArrowLeft" => KeyCode::Left,
113 "ArrowRight" => KeyCode::Right,
114 "ArrowUp" => KeyCode::Up,
115 "ArrowDown" => KeyCode::Down,
116 "Tab" => KeyCode::Tab,
117 "Delete" => KeyCode::Delete,
118 "Home" => KeyCode::Home,
119 "End" => KeyCode::End,
120 "PageUp" => KeyCode::PageUp,
121 "PageDown" => KeyCode::PageDown,
122 "Escape" => KeyCode::Esc,
123 _ => KeyCode::Unidentified,
124 }
125 }
126}
127
128#[derive(Debug, Clone, Eq, PartialEq)]
130pub enum MouseButton {
131 Left,
133 Right,
135 Middle,
137 Back,
139 Forward,
141 Unidentified,
143}
144
145#[derive(Debug, Clone, Eq, PartialEq)]
147pub enum MouseEventKind {
148 Moved,
150 Pressed,
152 Released,
154 Unidentified,
156}
157
158impl From<web_sys::MouseEvent> for MouseEvent {
160 fn from(event: web_sys::MouseEvent) -> Self {
161 let ctrl = event.ctrl_key();
162 let alt = event.alt_key();
163 let shift = event.shift_key();
164 let event_type = event.type_().into();
165 MouseEvent {
166 button: if event_type == MouseEventKind::Moved {
168 MouseButton::Unidentified
169 } else {
170 event.button().into()
171 },
172 event: event_type,
173 x: event.client_x() as u32,
174 y: event.client_y() as u32,
175 ctrl,
176 alt,
177 shift,
178 }
179 }
180}
181
182impl From<i16> for MouseButton {
184 fn from(button: i16) -> Self {
185 match button {
186 0 => MouseButton::Left,
187 1 => MouseButton::Middle,
188 2 => MouseButton::Right,
189 3 => MouseButton::Back,
190 4 => MouseButton::Forward,
191 _ => MouseButton::Unidentified,
192 }
193 }
194}
195
196impl From<String> for MouseEventKind {
198 fn from(event: String) -> Self {
199 let event = event.as_str();
200 match event {
201 "mousemove" => MouseEventKind::Moved,
202 "mousedown" => MouseEventKind::Pressed,
203 "mouseup" => MouseEventKind::Released,
204 _ => MouseEventKind::Unidentified,
205 }
206 }
207}