#[derive(Debug, Clone, Eq, PartialEq)]
pub struct KeyEvent {
pub code: KeyCode,
pub ctrl: bool,
pub alt: bool,
pub shift: bool,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct MouseEvent {
pub button: MouseButton,
pub event: MouseEventKind,
pub x: u32,
pub y: u32,
pub ctrl: bool,
pub alt: bool,
pub shift: bool,
}
impl From<web_sys::KeyboardEvent> for KeyEvent {
fn from(event: web_sys::KeyboardEvent) -> Self {
let ctrl = event.ctrl_key();
let alt = event.alt_key();
let shift = event.shift_key();
KeyEvent {
code: event.into(),
ctrl,
alt,
shift,
}
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum KeyCode {
Char(char),
F(u8),
Backspace,
Enter,
Left,
Right,
Up,
Down,
Tab,
Delete,
Home,
End,
PageUp,
PageDown,
Esc,
Unidentified,
}
impl From<web_sys::KeyboardEvent> for KeyCode {
fn from(event: web_sys::KeyboardEvent) -> Self {
let key = event.key();
if key.len() == 1 {
let char = key.chars().next();
if let Some(char) = char {
return KeyCode::Char(char);
} else {
return KeyCode::Unidentified;
}
}
match key.as_str() {
"F1" => KeyCode::F(1),
"F2" => KeyCode::F(2),
"F3" => KeyCode::F(3),
"F4" => KeyCode::F(4),
"F5" => KeyCode::F(5),
"F6" => KeyCode::F(6),
"F7" => KeyCode::F(7),
"F8" => KeyCode::F(8),
"F9" => KeyCode::F(9),
"F10" => KeyCode::F(10),
"F11" => KeyCode::F(11),
"F12" => KeyCode::F(12),
"Backspace" => KeyCode::Backspace,
"Enter" => KeyCode::Enter,
"ArrowLeft" => KeyCode::Left,
"ArrowRight" => KeyCode::Right,
"ArrowUp" => KeyCode::Up,
"ArrowDown" => KeyCode::Down,
"Tab" => KeyCode::Tab,
"Delete" => KeyCode::Delete,
"Home" => KeyCode::Home,
"End" => KeyCode::End,
"PageUp" => KeyCode::PageUp,
"PageDown" => KeyCode::PageDown,
"Escape" => KeyCode::Esc,
_ => KeyCode::Unidentified,
}
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum MouseButton {
Left,
Right,
Middle,
Back,
Forward,
Unidentified,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum MouseEventKind {
Moved,
Pressed,
Released,
Unidentified,
}
impl From<web_sys::MouseEvent> for MouseEvent {
fn from(event: web_sys::MouseEvent) -> Self {
let ctrl = event.ctrl_key();
let alt = event.alt_key();
let shift = event.shift_key();
let event_type = event.type_().into();
MouseEvent {
button: if event_type == MouseEventKind::Moved {
MouseButton::Unidentified
} else {
event.button().into()
},
event: event_type,
x: event.client_x() as u32,
y: event.client_y() as u32,
ctrl,
alt,
shift,
}
}
}
impl From<i16> for MouseButton {
fn from(button: i16) -> Self {
match button {
0 => MouseButton::Left,
1 => MouseButton::Middle,
2 => MouseButton::Right,
3 => MouseButton::Back,
4 => MouseButton::Forward,
_ => MouseButton::Unidentified,
}
}
}
impl From<String> for MouseEventKind {
fn from(event: String) -> Self {
let event = event.as_str();
match event {
"mousemove" => MouseEventKind::Moved,
"mousedown" => MouseEventKind::Pressed,
"mouseup" => MouseEventKind::Released,
_ => MouseEventKind::Unidentified,
}
}
}