Handle events in batches

This commit is contained in:
Joscha 2022-02-23 18:39:55 +01:00
parent d68ec217a8
commit 980f78f9a7

View file

@ -2,6 +2,7 @@ use std::io::Stdout;
use crossterm::event::{Event, EventStream, KeyCode, KeyEvent, MouseEvent, MouseEventKind}; use crossterm::event::{Event, EventStream, KeyCode, KeyEvent, MouseEvent, MouseEventKind};
use futures::StreamExt; use futures::StreamExt;
use tokio::sync::mpsc::error::TryRecvError;
use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender}; use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender};
use tui::backend::CrosstermBackend; use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout}; use tui::layout::{Constraint, Direction, Layout};
@ -78,19 +79,28 @@ impl Ui {
terminal.flush_backend()?; terminal.flush_backend()?;
terminal.swap_buffers(); terminal.swap_buffers();
// 2. Handle events // 2. Handle events (in batches)
let event = event_rx.recv().await; let mut event = match event_rx.recv().await {
self.log.push(format!("{event:?}")); Some(event) => event,
let result = match event { None => return Ok(()),
Some(UiEvent::Term(Event::Key(event))) => self.handle_key_event(event).await?,
Some(UiEvent::Term(Event::Mouse(event))) => self.handle_mouse_event(event).await?,
Some(UiEvent::Term(Event::Resize(_, _))) => EventHandleResult::Continue,
Some(UiEvent::Redraw) => EventHandleResult::Continue,
None => EventHandleResult::Stop,
}; };
match result { loop {
EventHandleResult::Continue => {} self.log.push(format!("{event:?}"));
EventHandleResult::Stop => break Ok(()), let result = match event {
UiEvent::Term(Event::Key(event)) => self.handle_key_event(event).await?,
UiEvent::Term(Event::Mouse(event)) => self.handle_mouse_event(event).await?,
UiEvent::Term(Event::Resize(_, _)) => EventHandleResult::Continue,
UiEvent::Redraw => EventHandleResult::Continue,
};
match result {
EventHandleResult::Continue => {}
EventHandleResult::Stop => return Ok(()),
}
event = match event_rx.try_recv() {
Ok(event) => event,
Err(TryRecvError::Empty) => break,
Err(TryRecvError::Disconnected) => return Ok(()),
};
} }
} }
} }