Redraw occasionally when batching events

This commit is contained in:
Joscha 2022-07-21 20:28:06 +02:00
parent f1b7ef0b98
commit 38dd7ccede

View file

@ -6,7 +6,7 @@ mod util;
mod widgets; mod widgets;
use std::sync::{Arc, Weak}; use std::sync::{Arc, Weak};
use std::time::Duration; use std::time::{Duration, Instant};
use crossterm::event::{Event, KeyCode, KeyEvent, KeyModifiers, MouseEvent}; use crossterm::event::{Event, KeyCode, KeyEvent, KeyModifiers, MouseEvent};
use log::debug; use log::debug;
@ -23,6 +23,9 @@ use self::chat::ChatState;
use self::rooms::Rooms; use self::rooms::Rooms;
use self::widgets::BoxedWidget; use self::widgets::BoxedWidget;
/// Time to spend batch processing events before redrawing the screen.
const EVENT_PROCESSING_TIME: Duration = Duration::from_millis(1000 / 15); // 15 fps
#[derive(Debug)] #[derive(Debug)]
pub enum UiEvent { pub enum UiEvent {
Redraw, Redraw,
@ -139,6 +142,7 @@ impl Ui {
Some(event) => event, Some(event) => event,
None => return Ok(()), None => return Ok(()),
}; };
let end_time = Instant::now() + EVENT_PROCESSING_TIME;
loop { loop {
// Render in-between events so the next event is handled in an // Render in-between events so the next event is handled in an
// up-to-date state. The results of these intermediate renders // up-to-date state. The results of these intermediate renders
@ -159,6 +163,9 @@ impl Ui {
EventHandleResult::Continue => {} EventHandleResult::Continue => {}
EventHandleResult::Stop => return Ok(()), EventHandleResult::Stop => return Ok(()),
} }
if Instant::now() >= end_time {
break;
}
event = match event_rx.try_recv() { event = match event_rx.try_recv() {
Ok(event) => event, Ok(event) => event,
Err(TryRecvError::Empty) => break, Err(TryRecvError::Empty) => break,