use std::time::Duration;
use crossterm::event::{self, Event as CrosstermEvent, KeyEvent, MouseEvent};
use tokio::sync::mpsc;
use crate::tui::app::Message;
#[derive(Debug)]
pub enum Event {
Key(KeyEvent),
Mouse(MouseEvent),
Tick,
Message(Message),
}
pub struct EventHandler {
rx: mpsc::UnboundedReceiver<Event>,
tx: mpsc::UnboundedSender<Event>,
}
impl EventHandler {
pub fn new(tick_rate: Duration) -> Self {
let (tx, rx) = mpsc::unbounded_channel();
let tx_clone = tx.clone();
tokio::spawn(async move {
loop {
if event::poll(tick_rate).unwrap_or(false) {
if let Ok(evt) = event::read() {
match evt {
CrosstermEvent::Key(key)
if tx_clone.send(Event::Key(key)).is_err() => {
break;
}
CrosstermEvent::Mouse(mouse)
if tx_clone.send(Event::Mouse(mouse)).is_err() => {
break;
}
CrosstermEvent::Resize(_, _)
if tx_clone.send(Event::Tick).is_err() => {
break;
}
_ => {}
}
}
} else {
if tx_clone.send(Event::Tick).is_err() {
break;
}
}
}
});
Self { rx, tx }
}
pub fn message_tx(&self) -> mpsc::UnboundedSender<Event> {
self.tx.clone()
}
pub async fn next(&mut self) -> Option<Event> {
self.rx.recv().await
}
}