pub(crate) struct InputEvent {
pub code: InputKeyCode,
pub ctrl: bool,
pub alt: bool,
pub shift: bool,
}
pub(crate) enum InputKeyCode {
Char(char),
Up,
Down,
Left,
Right,
Enter,
Esc,
Tab,
PageUp,
PageDown,
Home,
End,
Backspace,
Delete,
Other,
}
#[cfg(feature = "native")]
impl From<crossterm::event::KeyEvent> for InputEvent {
fn from(key: crossterm::event::KeyEvent) -> Self {
use crossterm::event::KeyCode;
use crossterm::event::KeyModifiers;
let code = match key.code {
KeyCode::Char(c) => InputKeyCode::Char(c),
KeyCode::Up => InputKeyCode::Up,
KeyCode::Down => InputKeyCode::Down,
KeyCode::Left => InputKeyCode::Left,
KeyCode::Right => InputKeyCode::Right,
KeyCode::Enter => InputKeyCode::Enter,
KeyCode::Esc => InputKeyCode::Esc,
KeyCode::Tab => InputKeyCode::Tab,
KeyCode::PageUp => InputKeyCode::PageUp,
KeyCode::PageDown => InputKeyCode::PageDown,
KeyCode::Home => InputKeyCode::Home,
KeyCode::End => InputKeyCode::End,
KeyCode::Backspace => InputKeyCode::Backspace,
KeyCode::Delete => InputKeyCode::Delete,
_ => InputKeyCode::Other,
};
InputEvent {
code,
ctrl: key.modifiers.contains(KeyModifiers::CONTROL),
alt: key.modifiers.contains(KeyModifiers::ALT),
shift: key.modifiers.contains(KeyModifiers::SHIFT),
}
}
}
#[cfg(target_arch = "wasm32")]
impl From<web_sys::KeyboardEvent> for InputEvent {
fn from(event: web_sys::KeyboardEvent) -> Self {
let key = event.key();
let code = if key.len() == 1 {
match key.chars().next() {
Some(c) => InputKeyCode::Char(c),
None => InputKeyCode::Other,
}
} else {
match key.as_str() {
"ArrowUp" => InputKeyCode::Up,
"ArrowDown" => InputKeyCode::Down,
"ArrowLeft" => InputKeyCode::Left,
"ArrowRight" => InputKeyCode::Right,
"Enter" => InputKeyCode::Enter,
"Escape" => InputKeyCode::Esc,
"Tab" => InputKeyCode::Tab,
"PageUp" => InputKeyCode::PageUp,
"PageDown" => InputKeyCode::PageDown,
"Home" => InputKeyCode::Home,
"End" => InputKeyCode::End,
"Backspace" => InputKeyCode::Backspace,
"Delete" => InputKeyCode::Delete,
_ => InputKeyCode::Other,
}
};
InputEvent {
code,
ctrl: event.ctrl_key(),
alt: event.alt_key(),
shift: event.shift_key(),
}
}
}