#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
pub enum ScrollPhase {
Started,
#[default]
Moved,
Ended,
MomentumEnded,
}
#[derive(Clone, Debug)]
pub enum InputEvent {
Mouse(MouseEvent),
Keyboard(KeyboardEvent),
Touch(TouchEvent),
Scroll {
delta_x: f32,
delta_y: f32,
phase: ScrollPhase,
},
ScrollEnd,
Pinch {
scale: f32,
phase: ScrollPhase,
},
Rotation {
angle: f32,
phase: ScrollPhase,
},
}
#[derive(Clone, Debug)]
pub enum MouseEvent {
Moved {
x: f32,
y: f32,
},
ButtonPressed {
button: MouseButton,
x: f32,
y: f32,
},
ButtonReleased {
button: MouseButton,
x: f32,
y: f32,
},
Entered,
Left,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum MouseButton {
Left,
Right,
Middle,
Back,
Forward,
Other(u16),
}
#[derive(Clone, Debug)]
pub struct KeyboardEvent {
pub key: Key,
pub state: KeyState,
pub modifiers: Modifiers,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum KeyState {
Pressed,
Released,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct Modifiers {
pub shift: bool,
pub ctrl: bool,
pub alt: bool,
pub meta: bool,
}
impl Modifiers {
pub fn is_empty(&self) -> bool {
!self.shift && !self.ctrl && !self.alt && !self.meta
}
pub fn shift_only(&self) -> bool {
self.shift && !self.ctrl && !self.alt && !self.meta
}
pub fn ctrl_only(&self) -> bool {
!self.shift && self.ctrl && !self.alt && !self.meta
}
pub fn alt_only(&self) -> bool {
!self.shift && !self.ctrl && self.alt && !self.meta
}
pub fn meta_only(&self) -> bool {
!self.shift && !self.ctrl && !self.alt && self.meta
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum Key {
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,
Num0,
Num1,
Num2,
Num3,
Num4,
Num5,
Num6,
Num7,
Num8,
Num9,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
Space,
Enter,
Escape,
Backspace,
Tab,
Delete,
Insert,
Home,
End,
PageUp,
PageDown,
Left,
Right,
Up,
Down,
Shift,
Ctrl,
Alt,
Meta,
Minus,
Equals,
LeftBracket,
RightBracket,
Backslash,
Semicolon,
Quote,
Comma,
Period,
Slash,
Grave,
Char(char),
Back,
Menu,
Unknown,
}
#[derive(Clone, Debug)]
pub enum TouchEvent {
Started {
id: u64,
x: f32,
y: f32,
pressure: f32,
},
Moved {
id: u64,
x: f32,
y: f32,
pressure: f32,
},
Ended {
id: u64,
x: f32,
y: f32,
},
Cancelled {
id: u64,
},
}
impl TouchEvent {
pub fn id(&self) -> u64 {
match self {
TouchEvent::Started { id, .. } => *id,
TouchEvent::Moved { id, .. } => *id,
TouchEvent::Ended { id, .. } => *id,
TouchEvent::Cancelled { id } => *id,
}
}
pub fn position(&self) -> Option<(f32, f32)> {
match self {
TouchEvent::Started { x, y, .. } => Some((*x, *y)),
TouchEvent::Moved { x, y, .. } => Some((*x, *y)),
TouchEvent::Ended { x, y, .. } => Some((*x, *y)),
TouchEvent::Cancelled { .. } => None,
}
}
}