use crate::geometry::Point;
pub type WidgetId = u64;
#[derive(Debug, Clone)]
pub enum Event {
Window(WindowEvent),
Mouse(MouseEvent),
Key(KeyEvent),
Focus(FocusEvent),
}
#[derive(Debug, Clone)]
pub enum WindowEvent {
Resized { width: u32, height: u32 },
Moved { x: i32, y: i32 },
CloseRequested,
Focused,
Unfocused,
ScaleFactorChanged { scale_factor: f64 },
ThemeChanged { dark: bool },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MouseButton {
Left,
Right,
Middle,
Back,
Forward,
Other(u16),
}
#[derive(Debug, Clone)]
pub struct MouseEvent {
pub kind: MouseEventKind,
pub position: Point,
pub button: Option<MouseButton>,
pub modifiers: Modifiers,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MouseEventKind {
Down,
Up,
Move,
Enter,
Leave,
Scroll { delta_x: i32, delta_y: i32 },
}
impl MouseEvent {
pub fn new(kind: MouseEventKind, position: Point) -> Self {
Self {
kind,
position,
button: None,
modifiers: Modifiers::empty(),
}
}
pub fn with_button(mut self, button: MouseButton) -> Self {
self.button = Some(button);
self
}
pub fn with_modifiers(mut self, modifiers: Modifiers) -> Self {
self.modifiers = modifiers;
self
}
}
#[derive(Debug, Clone)]
pub struct KeyEvent {
pub kind: KeyEventKind,
pub key: Key,
pub physical_key: Option<PhysicalKey>,
pub text: Option<String>,
pub modifiers: Modifiers,
pub is_repeat: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum KeyEventKind {
Down,
Up,
}
#[derive(Debug, Clone, 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,
Up, Down, Left, Right,
Home, End, PageUp, PageDown,
Backspace, Delete, Insert,
Enter, Tab,
Shift, Control, Alt, Super,
Escape, Space,
CapsLock, NumLock, ScrollLock,
PrintScreen, Pause,
Minus, Equal, BracketLeft, BracketRight,
Backslash, Semicolon, Quote, Grave,
Comma, Period, Slash,
Numpad0, Numpad1, Numpad2, Numpad3, Numpad4,
Numpad5, Numpad6, Numpad7, Numpad8, Numpad9,
NumpadAdd, NumpadSubtract, NumpadMultiply, NumpadDivide,
NumpadEnter, NumpadDecimal,
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct PhysicalKey(pub u32);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct Modifiers {
pub shift: bool,
pub control: bool,
pub alt: bool,
pub super_key: bool,
}
impl Modifiers {
pub const fn empty() -> Self {
Self {
shift: false,
control: false,
alt: false,
super_key: false,
}
}
pub fn is_empty(&self) -> bool {
!self.shift && !self.control && !self.alt && !self.super_key
}
pub fn command(&self) -> bool {
#[cfg(target_os = "macos")]
{ self.super_key }
#[cfg(not(target_os = "macos"))]
{ self.control }
}
}
#[derive(Debug, Clone)]
pub enum FocusEvent {
FocusIn { widget_id: WidgetId },
FocusOut { widget_id: WidgetId },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EventResult {
Handled,
Ignored,
}
impl EventResult {
pub fn is_handled(&self) -> bool {
matches!(self, EventResult::Handled)
}
}
pub type EventHandler<T> = Box<dyn Fn(&T) -> EventResult + Send + Sync>;
#[derive(Debug, Clone)]
pub struct ClickEvent {
pub position: Point,
pub button: MouseButton,
pub modifiers: Modifiers,
pub click_count: u32,
}
#[derive(Debug, Clone)]
pub struct ChangeEvent<T> {
pub value: T,
}