use crate::geometry::{Point, Size};
pub(crate) const WHEEL_LINES_PER_DETENT: f32 = 3.0;
pub(crate) const SCROLL_PIXELS_PER_LINE: f32 = 16.0;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MouseButton {
Left,
Right,
Middle,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Key {
Named(NamedKey),
Char(char),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum NamedKey {
Enter,
Backspace,
Delete,
Tab,
Escape,
Space,
Left,
Right,
Up,
Down,
Home,
End,
PageUp,
PageDown,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct Modifiers {
pub shift: bool,
pub control: bool,
pub alt: bool,
pub alt_graph: bool,
pub logo: bool,
}
impl Modifiers {
pub fn has_command(&self) -> bool {
if self.alt_graph {
return false;
}
self.control || self.alt || self.logo
}
pub fn mnemonic_alt(&self) -> bool {
self.alt && !self.alt_graph
}
}
#[derive(Clone, Copy, Debug)]
pub enum Event {
PointerMove {
pos: Point,
},
PointerDown {
pos: Point,
button: MouseButton,
},
PointerUp {
pos: Point,
button: MouseButton,
},
PointerLeave,
Scroll {
pos: Point,
delta_x: f32,
delta_y: f32,
},
KeyDown {
key: Key,
modifiers: Modifiers,
},
KeyUp {
key: Key,
modifiers: Modifiers,
},
Char {
ch: char,
modifiers: Modifiers,
},
Tick,
}
impl Event {
pub fn position(&self) -> Option<Point> {
match self {
Event::PointerMove { pos }
| Event::PointerDown { pos, .. }
| Event::PointerUp { pos, .. }
| Event::Scroll { pos, .. } => Some(*pos),
_ => None,
}
}
pub fn is_keyboard(&self) -> bool {
matches!(
self,
Event::KeyDown { .. } | Event::KeyUp { .. } | Event::Char { .. }
)
}
}
pub struct EventCtx {
pub(crate) paint_requested: bool,
pub(crate) close_requested: bool,
pub(crate) focus_requested: bool,
pub(crate) focus_released: bool,
pub(crate) consumed: bool,
pub(crate) dismiss_requested: bool,
pub(crate) resize_request: Option<Size>,
}
impl EventCtx {
pub(crate) fn new() -> Self {
Self {
paint_requested: false,
close_requested: false,
focus_requested: false,
focus_released: false,
consumed: false,
dismiss_requested: false,
resize_request: None,
}
}
pub fn is_consumed(&self) -> bool {
self.consumed
}
pub fn consume_event(&mut self) {
self.consumed = true;
}
pub fn request_paint(&mut self) {
self.paint_requested = true;
}
pub fn close(&mut self) {
self.close_requested = true;
}
pub fn is_focus_requested(&self) -> bool {
self.focus_requested
}
pub fn is_focus_released(&self) -> bool {
self.focus_released
}
pub fn clear_focus_flags(&mut self) {
self.focus_requested = false;
self.focus_released = false;
}
pub fn request_focus(&mut self) {
self.focus_requested = true;
self.focus_released = false;
}
pub fn release_focus(&mut self) {
self.focus_released = true;
self.focus_requested = false;
}
pub fn request_dismiss(&mut self) {
self.dismiss_requested = true;
}
pub fn is_dismiss_requested(&self) -> bool {
self.dismiss_requested
}
pub fn request_window_size(&mut self, width: i32, height: i32) {
self.resize_request = Some(Size::new(width.max(1), height.max(1)));
}
}