use std::collections::VecDeque;
#[cfg(feature = "drop_files")]
use std::path::PathBuf;
use crate::keyboard::KeyCode;
use crate::mouse::MouseButton;
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Event {
Exit,
WindowMove { x: i32, y: i32 },
WindowResize { width: u32, height: u32 },
ScreenAspectChange { ratio: f64 },
MouseMove { x: i32, y: i32 },
MouseDown { button: MouseButton, x: i32, y: i32 },
MouseUp { button: MouseButton, x: i32, y: i32 },
MouseWheel { delta_x: f32, delta_y: f32 },
MouseEnter { x: i32, y: i32 },
MouseLeft { x: i32, y: i32 },
MouseMotion { delta: (f64, f64) },
KeyDown { key: KeyCode },
KeyUp { key: KeyCode },
TouchStart { id: u64, x: f32, y: f32 },
TouchMove { id: u64, x: f32, y: f32 },
TouchEnd { id: u64, x: f32, y: f32 },
TouchCancel { id: u64, x: f32, y: f32 },
ReceivedCharacter(char),
#[cfg(feature = "drop_files")]
DragEnter {
path: Option<PathBuf>,
name: Option<String>,
mime: String,
},
#[cfg(feature = "drop_files")]
DragLeft,
#[cfg(feature = "drop_files")]
Drop(DroppedFile),
Copy,
Cut,
Paste(String),
}
#[cfg(feature = "drop_files")]
#[derive(Default, Debug, PartialEq, Eq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DroppedFile {
pub path: Option<PathBuf>,
pub name: String,
pub mime: String,
#[cfg(target_arch = "wasm32")]
#[cfg_attr(feature = "serde", serde(skip))]
pub file: Option<web_sys::File>,
}
#[derive(Debug, Clone, Default)]
pub struct EventIterator(VecDeque<Event>);
impl EventIterator {
pub fn new() -> Self {
Default::default()
}
pub fn pop_front(&mut self) -> Option<Event> {
self.0.pop_front()
}
pub fn push(&mut self, evt: Event) {
self.0.push_back(evt);
}
pub fn push_front(&mut self, evt: Event) {
self.0.push_front(evt);
}
pub fn take_events(&mut self) -> EventIterator {
EventIterator(std::mem::take(&mut self.0))
}
}
impl Iterator for EventIterator {
type Item = Event;
fn next(&mut self) -> Option<Self::Item> {
self.pop_front()
}
}