pub mod click;
pub mod custom;
pub mod drag;
mod focus;
pub mod gesture;
mod handler;
pub mod ime;
mod keymap;
mod reader;
pub use click::{ClickDetector, ClickType};
pub use custom::{
AppEvent, CustomEvent, CustomEventBus, CustomHandlerId, DispatchPhase, DispatchResult,
ErrorEvent, EventDispatcher, EventEnvelope, EventId, EventMeta, EventPriority, EventRecord,
EventResponse, HandlerOptions, NavigateEvent, StateChangeEvent,
};
pub use drag::{
cancel_drag, drag_context, end_drag, is_dragging, start_drag, update_drag_position,
DragContext, DragData, DragId, DragState, DropResult, DropTarget,
};
pub use focus::{Direction, FocusManager, FocusTrap, FocusTrapConfig, WidgetId};
pub use gesture::{
DragGesture, Gesture, GestureConfig, GestureRecognizer, GestureState, LongPressGesture,
PinchDirection, PinchGesture, SwipeDirection, SwipeGesture, TapGesture,
};
pub use handler::{EventContext, EventHandler, EventPhase, HandlerId};
pub use ime::{
Candidate, CompositionEvent, CompositionState, CompositionStyle, ImeConfig, ImeState,
PreeditSegment, PreeditString,
};
pub use keymap::{Key, KeyBinding, KeyMap};
pub use reader::EventReader;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MouseButton {
Left,
Right,
Middle,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MouseEventKind {
Down(MouseButton),
Up(MouseButton),
Drag(MouseButton),
Move,
ScrollDown,
ScrollUp,
ScrollLeft,
ScrollRight,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MouseEvent {
pub x: u16,
pub y: u16,
pub kind: MouseEventKind,
pub ctrl: bool,
pub alt: bool,
pub shift: bool,
}
impl MouseEvent {
pub fn new(x: u16, y: u16, kind: MouseEventKind) -> Self {
Self {
x,
y,
kind,
ctrl: false,
alt: false,
shift: false,
}
}
pub fn is_left_click(&self) -> bool {
matches!(self.kind, MouseEventKind::Down(MouseButton::Left))
}
pub fn is_right_click(&self) -> bool {
matches!(self.kind, MouseEventKind::Down(MouseButton::Right))
}
pub fn is_scroll(&self) -> bool {
matches!(
self.kind,
MouseEventKind::ScrollDown
| MouseEventKind::ScrollUp
| MouseEventKind::ScrollLeft
| MouseEventKind::ScrollRight
)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Event {
Key(KeyEvent),
Mouse(MouseEvent),
Resize(u16, u16),
Tick,
FocusGained,
FocusLost,
Paste(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct KeyEvent {
pub key: Key,
pub ctrl: bool,
pub alt: bool,
pub shift: bool,
}
impl KeyEvent {
pub fn new(key: Key) -> Self {
Self {
key,
ctrl: false,
alt: false,
shift: false,
}
}
pub fn ctrl(key: Key) -> Self {
Self {
key,
ctrl: true,
alt: false,
shift: false,
}
}
pub fn alt(key: Key) -> Self {
Self {
key,
ctrl: false,
alt: true,
shift: false,
}
}
pub fn is_ctrl_c(&self) -> bool {
self.ctrl && self.key == Key::Char('c')
}
pub fn is_escape(&self) -> bool {
self.key == Key::Escape
}
pub fn is_enter(&self) -> bool {
self.key == Key::Enter
}
pub fn is_tab(&self) -> bool {
self.key == Key::Tab && !self.shift
}
pub fn is_shift_tab(&self) -> bool {
self.key == Key::Tab && self.shift
}
pub fn to_binding(&self) -> KeyBinding {
KeyBinding {
key: self.key,
ctrl: self.ctrl,
alt: self.alt,
shift: self.shift,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_mouse_event_new() {
let event = MouseEvent::new(10, 20, MouseEventKind::Down(MouseButton::Left));
assert_eq!(event.x, 10);
assert_eq!(event.y, 20);
assert!(!event.ctrl);
assert!(!event.alt);
assert!(!event.shift);
}
#[test]
fn test_mouse_event_is_left_click() {
let event = MouseEvent::new(0, 0, MouseEventKind::Down(MouseButton::Left));
assert!(event.is_left_click());
let event = MouseEvent::new(0, 0, MouseEventKind::Down(MouseButton::Right));
assert!(!event.is_left_click());
let event = MouseEvent::new(0, 0, MouseEventKind::Up(MouseButton::Left));
assert!(!event.is_left_click());
}
#[test]
fn test_mouse_event_is_right_click() {
let event = MouseEvent::new(0, 0, MouseEventKind::Down(MouseButton::Right));
assert!(event.is_right_click());
let event = MouseEvent::new(0, 0, MouseEventKind::Down(MouseButton::Left));
assert!(!event.is_right_click());
}
#[test]
fn test_mouse_event_is_scroll() {
assert!(MouseEvent::new(0, 0, MouseEventKind::ScrollUp).is_scroll());
assert!(MouseEvent::new(0, 0, MouseEventKind::ScrollDown).is_scroll());
assert!(MouseEvent::new(0, 0, MouseEventKind::ScrollLeft).is_scroll());
assert!(MouseEvent::new(0, 0, MouseEventKind::ScrollRight).is_scroll());
assert!(!MouseEvent::new(0, 0, MouseEventKind::Move).is_scroll());
}
#[test]
fn test_key_event_new() {
let event = KeyEvent::new(Key::Char('a'));
assert_eq!(event.key, Key::Char('a'));
assert!(!event.ctrl);
assert!(!event.alt);
assert!(!event.shift);
}
#[test]
fn test_key_event_ctrl() {
let event = KeyEvent::ctrl(Key::Char('c'));
assert!(event.ctrl);
assert!(!event.alt);
assert!(!event.shift);
}
#[test]
fn test_key_event_alt() {
let event = KeyEvent::alt(Key::Char('x'));
assert!(!event.ctrl);
assert!(event.alt);
assert!(!event.shift);
}
#[test]
fn test_key_event_is_ctrl_c() {
let event = KeyEvent::ctrl(Key::Char('c'));
assert!(event.is_ctrl_c());
let event = KeyEvent::new(Key::Char('c'));
assert!(!event.is_ctrl_c());
}
#[test]
fn test_key_event_is_escape() {
let event = KeyEvent::new(Key::Escape);
assert!(event.is_escape());
let event = KeyEvent::new(Key::Enter);
assert!(!event.is_escape());
}
#[test]
fn test_key_event_is_enter() {
let event = KeyEvent::new(Key::Enter);
assert!(event.is_enter());
let event = KeyEvent::new(Key::Tab);
assert!(!event.is_enter());
}
#[test]
fn test_key_event_is_tab() {
let event = KeyEvent::new(Key::Tab);
assert!(event.is_tab());
let event = KeyEvent {
key: Key::Tab,
ctrl: false,
alt: false,
shift: true,
};
assert!(!event.is_tab());
}
#[test]
fn test_key_event_is_shift_tab() {
let event = KeyEvent {
key: Key::Tab,
ctrl: false,
alt: false,
shift: true,
};
assert!(event.is_shift_tab());
let event = KeyEvent::new(Key::Tab);
assert!(!event.is_shift_tab());
}
#[test]
fn test_key_event_to_binding() {
let event = KeyEvent {
key: Key::Char('a'),
ctrl: true,
alt: false,
shift: true,
};
let binding = event.to_binding();
assert_eq!(binding.key, Key::Char('a'));
assert!(binding.ctrl);
assert!(!binding.alt);
assert!(binding.shift);
}
#[test]
fn test_event_enum_variants() {
let key_event = Event::Key(KeyEvent::new(Key::Char('a')));
let mouse_event = Event::Mouse(MouseEvent::new(0, 0, MouseEventKind::Move));
let resize_event = Event::Resize(80, 24);
let tick_event = Event::Tick;
let focus_gained = Event::FocusGained;
let focus_lost = Event::FocusLost;
let paste_event = Event::Paste("test".to_string());
match key_event {
Event::Key(_) => {}
_ => panic!("Expected Key event"),
}
match mouse_event {
Event::Mouse(_) => {}
_ => panic!("Expected Mouse event"),
}
match resize_event {
Event::Resize(_, _) => {}
_ => panic!("Expected Resize event"),
}
match tick_event {
Event::Tick => {}
_ => panic!("Expected Tick event"),
}
match focus_gained {
Event::FocusGained => {}
_ => panic!("Expected FocusGained event"),
}
match focus_lost {
Event::FocusLost => {}
_ => panic!("Expected FocusLost event"),
}
match paste_event {
Event::Paste(_) => {}
_ => panic!("Expected Paste event"),
}
}
#[test]
fn test_mouse_button_variants() {
let _left = MouseButton::Left;
let _right = MouseButton::Right;
let _middle = MouseButton::Middle;
}
#[test]
fn test_mouse_event_kind_variants() {
let _down = MouseEventKind::Down(MouseButton::Left);
let _up = MouseEventKind::Up(MouseButton::Right);
let _drag = MouseEventKind::Drag(MouseButton::Middle);
let _move = MouseEventKind::Move;
let _scroll_down = MouseEventKind::ScrollDown;
let _scroll_up = MouseEventKind::ScrollUp;
let _scroll_left = MouseEventKind::ScrollLeft;
let _scroll_right = MouseEventKind::ScrollRight;
}
#[test]
fn test_mouse_event_with_modifiers() {
let event = MouseEvent {
x: 10,
y: 20,
kind: MouseEventKind::Down(MouseButton::Left),
ctrl: true,
alt: false,
shift: true,
};
assert!(event.ctrl);
assert!(event.shift);
assert!(!event.alt);
}
}