use glutin::event::{
ElementState, KeyboardInput as InnerKeyboardInput, ModifiersState, MouseButton as InnerMouseButton, VirtualKeyCode,
};
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct KeyboardInput {
pub state: ButtonState,
pub scancode: u32,
pub keycode: Option<VirtualKey>,
}
impl From<InnerKeyboardInput> for KeyboardInput {
fn from(input: InnerKeyboardInput) -> Self {
KeyboardInput {
state: input.state.into(),
scancode: input.scancode,
keycode: VirtualKey::from_optional(input.virtual_keycode),
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct MouseInput {
pub state: ButtonState,
pub button: MouseButton,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub enum ButtonState {
Pressed,
Released,
}
impl From<bool> for ButtonState {
fn from(pressed: bool) -> Self {
if pressed {
ButtonState::Pressed
} else {
ButtonState::Released
}
}
}
impl From<ButtonState> for bool {
fn from(state: ButtonState) -> Self {
match state {
ButtonState::Pressed => true,
ButtonState::Released => false,
}
}
}
impl PartialEq<bool> for ButtonState {
fn eq(&self, other: &bool) -> bool {
bool::from(*self) == *other
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct ModifierKeys(ModifiersState);
impl ModifierKeys {
pub fn shift(self) -> ButtonState {
self.0.shift().into()
}
pub fn alt(self) -> ButtonState {
self.0.alt().into()
}
pub fn ctrl(self) -> ButtonState {
self.0.ctrl().into()
}
pub fn logo(self) -> ButtonState {
self.0.logo().into()
}
}
impl From<ModifiersState> for ModifierKeys {
fn from(state: ModifiersState) -> Self {
ModifierKeys(state)
}
}
impl From<ElementState> for ButtonState {
fn from(state: ElementState) -> Self {
match state {
ElementState::Pressed => ButtonState::Pressed,
ElementState::Released => ButtonState::Released,
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[repr(u32)]
pub enum VirtualKey {
Escape,
Backquote,
Tab,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
F13,
F14,
F15,
F16,
F17,
F18,
F19,
F20,
F21,
F22,
F23,
F24,
Key1,
Key2,
Key3,
Key4,
Key5,
Key6,
Key7,
Key8,
Key9,
Key0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
Minus,
Plus,
Equals,
LBracket,
RBracket,
Backslash,
Semicolon,
Colon,
Apostrophe,
Period,
Comma,
Slash,
Left,
Up,
Right,
Down,
Numpad0,
Numpad1,
Numpad2,
Numpad3,
Numpad4,
Numpad5,
Numpad6,
Numpad7,
Numpad8,
Numpad9,
Delete,
Insert,
Home,
End,
PageDown,
PageUp,
Backspace,
Enter,
}
impl VirtualKey {
fn from_key(key: VirtualKeyCode) -> Option<Self> {
match key {
VirtualKeyCode::Escape => Some(VirtualKey::Escape),
VirtualKeyCode::Grave => Some(VirtualKey::Backquote),
VirtualKeyCode::Tab => Some(VirtualKey::Tab),
VirtualKeyCode::F1 => Some(VirtualKey::F1),
VirtualKeyCode::F2 => Some(VirtualKey::F2),
VirtualKeyCode::F3 => Some(VirtualKey::F3),
VirtualKeyCode::F4 => Some(VirtualKey::F4),
VirtualKeyCode::F5 => Some(VirtualKey::F5),
VirtualKeyCode::F6 => Some(VirtualKey::F6),
VirtualKeyCode::F7 => Some(VirtualKey::F7),
VirtualKeyCode::F8 => Some(VirtualKey::F8),
VirtualKeyCode::F9 => Some(VirtualKey::F9),
VirtualKeyCode::F10 => Some(VirtualKey::F10),
VirtualKeyCode::F11 => Some(VirtualKey::F11),
VirtualKeyCode::F12 => Some(VirtualKey::F12),
VirtualKeyCode::F13 => Some(VirtualKey::F13),
VirtualKeyCode::F14 => Some(VirtualKey::F14),
VirtualKeyCode::F15 => Some(VirtualKey::F15),
VirtualKeyCode::F16 => Some(VirtualKey::F16),
VirtualKeyCode::F17 => Some(VirtualKey::F17),
VirtualKeyCode::F18 => Some(VirtualKey::F18),
VirtualKeyCode::F19 => Some(VirtualKey::F19),
VirtualKeyCode::F20 => Some(VirtualKey::F20),
VirtualKeyCode::F21 => Some(VirtualKey::F21),
VirtualKeyCode::F22 => Some(VirtualKey::F22),
VirtualKeyCode::F23 => Some(VirtualKey::F23),
VirtualKeyCode::F24 => Some(VirtualKey::F24),
VirtualKeyCode::Key1 => Some(VirtualKey::Key1),
VirtualKeyCode::Key2 => Some(VirtualKey::Key2),
VirtualKeyCode::Key3 => Some(VirtualKey::Key3),
VirtualKeyCode::Key4 => Some(VirtualKey::Key4),
VirtualKeyCode::Key5 => Some(VirtualKey::Key5),
VirtualKeyCode::Key6 => Some(VirtualKey::Key6),
VirtualKeyCode::Key7 => Some(VirtualKey::Key7),
VirtualKeyCode::Key8 => Some(VirtualKey::Key8),
VirtualKeyCode::Key9 => Some(VirtualKey::Key9),
VirtualKeyCode::Key0 => Some(VirtualKey::Key0),
VirtualKeyCode::A => Some(VirtualKey::A),
VirtualKeyCode::B => Some(VirtualKey::B),
VirtualKeyCode::C => Some(VirtualKey::C),
VirtualKeyCode::D => Some(VirtualKey::D),
VirtualKeyCode::E => Some(VirtualKey::E),
VirtualKeyCode::F => Some(VirtualKey::F),
VirtualKeyCode::G => Some(VirtualKey::G),
VirtualKeyCode::H => Some(VirtualKey::H),
VirtualKeyCode::I => Some(VirtualKey::I),
VirtualKeyCode::J => Some(VirtualKey::J),
VirtualKeyCode::K => Some(VirtualKey::K),
VirtualKeyCode::L => Some(VirtualKey::L),
VirtualKeyCode::M => Some(VirtualKey::M),
VirtualKeyCode::N => Some(VirtualKey::N),
VirtualKeyCode::O => Some(VirtualKey::O),
VirtualKeyCode::P => Some(VirtualKey::P),
VirtualKeyCode::Q => Some(VirtualKey::Q),
VirtualKeyCode::R => Some(VirtualKey::R),
VirtualKeyCode::S => Some(VirtualKey::S),
VirtualKeyCode::T => Some(VirtualKey::T),
VirtualKeyCode::U => Some(VirtualKey::U),
VirtualKeyCode::V => Some(VirtualKey::V),
VirtualKeyCode::W => Some(VirtualKey::W),
VirtualKeyCode::X => Some(VirtualKey::X),
VirtualKeyCode::Y => Some(VirtualKey::Y),
VirtualKeyCode::Z => Some(VirtualKey::Z),
VirtualKeyCode::Subtract => Some(VirtualKey::Minus),
VirtualKeyCode::Add => Some(VirtualKey::Plus),
VirtualKeyCode::Equals => Some(VirtualKey::Equals),
VirtualKeyCode::LBracket => Some(VirtualKey::LBracket),
VirtualKeyCode::RBracket => Some(VirtualKey::RBracket),
VirtualKeyCode::Backslash => Some(VirtualKey::Backslash),
VirtualKeyCode::Semicolon => Some(VirtualKey::Semicolon),
VirtualKeyCode::Colon => Some(VirtualKey::Colon),
VirtualKeyCode::Apostrophe => Some(VirtualKey::Apostrophe),
VirtualKeyCode::Period => Some(VirtualKey::Period),
VirtualKeyCode::Comma => Some(VirtualKey::Comma),
VirtualKeyCode::Slash => Some(VirtualKey::Slash),
VirtualKeyCode::Divide => Some(VirtualKey::Slash),
VirtualKeyCode::Left => Some(VirtualKey::Left),
VirtualKeyCode::Up => Some(VirtualKey::Up),
VirtualKeyCode::Right => Some(VirtualKey::Right),
VirtualKeyCode::Down => Some(VirtualKey::Down),
VirtualKeyCode::Numpad0 => Some(VirtualKey::Numpad0),
VirtualKeyCode::Numpad1 => Some(VirtualKey::Numpad1),
VirtualKeyCode::Numpad2 => Some(VirtualKey::Numpad2),
VirtualKeyCode::Numpad3 => Some(VirtualKey::Numpad3),
VirtualKeyCode::Numpad4 => Some(VirtualKey::Numpad4),
VirtualKeyCode::Numpad5 => Some(VirtualKey::Numpad5),
VirtualKeyCode::Numpad6 => Some(VirtualKey::Numpad6),
VirtualKeyCode::Numpad7 => Some(VirtualKey::Numpad7),
VirtualKeyCode::Numpad8 => Some(VirtualKey::Numpad8),
VirtualKeyCode::Numpad9 => Some(VirtualKey::Numpad9),
VirtualKeyCode::Insert => Some(VirtualKey::Insert),
VirtualKeyCode::Home => Some(VirtualKey::Home),
VirtualKeyCode::Delete => Some(VirtualKey::Delete),
VirtualKeyCode::End => Some(VirtualKey::End),
VirtualKeyCode::PageDown => Some(VirtualKey::PageDown),
VirtualKeyCode::PageUp => Some(VirtualKey::PageUp),
VirtualKeyCode::Back => Some(VirtualKey::Backspace),
VirtualKeyCode::Return => Some(VirtualKey::Enter),
_ => None,
}
}
fn from_optional(key: Option<VirtualKeyCode>) -> Option<Self> {
match key {
Some(key) => Self::from_key(key),
None => None,
}
}
}
impl PartialEq<Option<VirtualKey>> for VirtualKey {
fn eq(&self, other: &Option<VirtualKey>) -> bool {
match other {
Some(other) => *self == *other,
None => false,
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub enum MouseButton {
Left,
Right,
Middle,
Other(u8),
}
impl From<InnerMouseButton> for MouseButton {
fn from(state: InnerMouseButton) -> Self {
match state {
InnerMouseButton::Left => MouseButton::Left,
InnerMouseButton::Right => MouseButton::Right,
InnerMouseButton::Middle => MouseButton::Middle,
InnerMouseButton::Other(button) => MouseButton::Other(button),
}
}
}