use std::collections::VecDeque;
use std::time::Duration;
use crossterm::event::KeyCode;
use super::events::Event;
#[derive(Clone, Debug, Default)]
pub struct EventQueue {
events: VecDeque<Event>,
}
impl EventQueue {
pub fn new() -> Self {
Self::default()
}
pub fn with_events(events: impl IntoIterator<Item = Event>) -> Self {
Self {
events: events.into_iter().collect(),
}
}
pub fn len(&self) -> usize {
self.events.len()
}
pub fn is_empty(&self) -> bool {
self.events.is_empty()
}
pub fn clear(&mut self) {
self.events.clear();
}
pub fn push(&mut self, event: Event) {
self.events.push_back(event);
}
pub fn push_front(&mut self, event: Event) {
self.events.push_front(event);
}
pub fn pop(&mut self) -> Option<Event> {
self.events.pop_front()
}
pub fn peek(&self) -> Option<&Event> {
self.events.front()
}
pub fn key(&mut self, code: KeyCode) {
self.push(Event::key(code));
}
pub fn char(&mut self, c: char) {
self.push(Event::char(c));
}
pub fn type_str(&mut self, s: &str) {
for c in s.chars() {
self.push(Event::char(c));
}
}
pub fn ctrl(&mut self, c: char) {
self.push(Event::ctrl(c));
}
pub fn alt(&mut self, c: char) {
self.push(Event::alt(c));
}
pub fn enter(&mut self) {
self.key(KeyCode::Enter);
}
pub fn escape(&mut self) {
self.key(KeyCode::Esc);
}
pub fn tab(&mut self) {
self.key(KeyCode::Tab);
}
pub fn backspace(&mut self) {
self.key(KeyCode::Backspace);
}
pub fn delete(&mut self) {
self.key(KeyCode::Delete);
}
pub fn up(&mut self) {
self.key(KeyCode::Up);
}
pub fn down(&mut self) {
self.key(KeyCode::Down);
}
pub fn left(&mut self) {
self.key(KeyCode::Left);
}
pub fn right(&mut self) {
self.key(KeyCode::Right);
}
pub fn home(&mut self) {
self.key(KeyCode::Home);
}
pub fn end(&mut self) {
self.key(KeyCode::End);
}
pub fn page_up(&mut self) {
self.key(KeyCode::PageUp);
}
pub fn page_down(&mut self) {
self.key(KeyCode::PageDown);
}
pub fn function(&mut self, n: u8) {
self.key(KeyCode::F(n));
}
pub fn click(&mut self, x: u16, y: u16) {
self.push(Event::click(x, y));
}
pub fn double_click(&mut self, x: u16, y: u16) {
self.push(Event::click(x, y));
self.push(Event::mouse_up(x, y));
self.push(Event::click(x, y));
self.push(Event::mouse_up(x, y));
}
pub fn drag(&mut self, from: (u16, u16), to: (u16, u16)) {
self.push(Event::click(from.0, from.1));
self.push(Event::mouse_drag(
to.0,
to.1,
crossterm::event::MouseButton::Left,
));
self.push(Event::mouse_up(to.0, to.1));
}
pub fn scroll_up(&mut self, x: u16, y: u16) {
self.push(Event::scroll_up(x, y));
}
pub fn scroll_down(&mut self, x: u16, y: u16) {
self.push(Event::scroll_down(x, y));
}
pub fn resize(&mut self, width: u16, height: u16) {
self.push(Event::Resize(width, height));
}
pub fn paste(&mut self, content: impl Into<String>) {
self.push(Event::Paste(content.into()));
}
pub fn iter(&self) -> impl Iterator<Item = &Event> {
self.events.iter()
}
pub fn drain(&mut self) -> impl Iterator<Item = Event> + '_ {
self.events.drain(..)
}
pub fn poll(&mut self, _timeout: Duration) -> Option<Event> {
self.pop()
}
pub fn extend(&mut self, events: impl IntoIterator<Item = Event>) {
self.events.extend(events);
}
}
impl FromIterator<Event> for EventQueue {
fn from_iter<T: IntoIterator<Item = Event>>(iter: T) -> Self {
Self {
events: iter.into_iter().collect(),
}
}
}
impl Extend<Event> for EventQueue {
fn extend<T: IntoIterator<Item = Event>>(&mut self, iter: T) {
self.events.extend(iter);
}
}
#[cfg(test)]
mod tests;