#[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 kind: MouseEventKind,
pub col: u16,
pub row: u16,
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, Copy, Eq, PartialEq)]
pub enum MouseButton {
Left,
Right,
Middle,
Back,
Forward,
Unidentified,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum MouseEventKind {
Moved,
ButtonDown(MouseButton),
ButtonUp(MouseButton),
SingleClick(MouseButton),
DoubleClick(MouseButton),
Entered,
Exited,
Unidentified,
}
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,
}
}
}