use std::io::{IsTerminal, Write as _};
use crossterm::{
event::{self, Event},
execute,
terminal::{BeginSynchronizedUpdate, EndSynchronizedUpdate},
};
use super::FullscreenPartyRenderer;
use crate::tui;
const POLL_TIME: std::time::Duration = std::time::Duration::from_millis(10);
pub fn run(mut parties: Vec<Box<dyn FullscreenPartyRenderer>>) -> anyhow::Result<()> {
if !std::io::stdout().is_terminal() {
return Ok(());
}
let _guard = tui::enter_tui()?;
parties.sort_by_key(|party| party.z_index());
let mut time = std::time::Instant::now();
loop {
if event::poll(POLL_TIME)? {
let event = event::read()?;
if matches!(event, Event::Key(_)) {
break;
}
}
let dt = time.elapsed();
time = std::time::Instant::now();
let mut all_done = true;
for party in &mut parties {
let still_going = party.update(dt);
all_done = all_done && !still_going;
}
let mut buf = String::new();
execute!(std::io::stdout(), BeginSynchronizedUpdate)?;
for party in &mut parties {
party.render(&mut buf);
}
execute!(std::io::stdout(), EndSynchronizedUpdate)?;
std::io::stdout().write_all(buf.as_bytes())?;
std::io::stdout().flush()?;
if all_done {
break;
}
}
Ok(())
}