Handle events in batches
This commit is contained in:
parent
d68ec217a8
commit
980f78f9a7
1 changed files with 22 additions and 12 deletions
|
|
@ -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(()),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue