diff options
Diffstat (limited to 'src/bin/ttyplay/event.rs')
-rw-r--r-- | src/bin/ttyplay/event.rs | 47 |
1 files changed, 44 insertions, 3 deletions
diff --git a/src/bin/ttyplay/event.rs b/src/bin/ttyplay/event.rs index 8b47a5a..260c523 100644 --- a/src/bin/ttyplay/event.rs +++ b/src/bin/ttyplay/event.rs @@ -16,13 +16,13 @@ pub enum TimerAction { Quit, } -pub struct Reader { +struct Reader { pending: async_std::sync::Mutex<Pending>, cvar: async_std::sync::Condvar, } impl Reader { - pub fn new( + fn new( input: async_std::channel::Receiver<Event>, ) -> async_std::sync::Arc<Self> { let this = Self { @@ -42,7 +42,7 @@ impl Reader { this } - pub async fn read(&self) -> Option<Event> { + async fn read(&self) -> Option<Event> { let mut pending = self .cvar .wait_until(self.pending.lock().await, |pending| { @@ -135,3 +135,44 @@ impl Pending { } } } + +pub async fn handle_events( + event_r: async_std::channel::Receiver<Event>, + timer_w: async_std::channel::Sender<TimerAction>, + mut output: textmode::Output, +) -> anyhow::Result<()> { + let mut display = crate::display::Display::new(); + let mut current_screen = vt100::Parser::default().screen().clone(); + let events = Reader::new(event_r); + while let Some(event) = events.read().await { + match event { + Event::TimerAction(action) => { + timer_w.send(action).await?; + continue; + } + Event::FrameTransition((idx, screen)) => { + current_screen = screen; + display.current_frame(idx); + } + Event::FrameLoaded(n) => { + if let Some(n) = n { + display.total_frames(n); + } else { + display.done_loading(); + } + } + Event::Paused(paused) => { + display.paused(paused); + } + Event::ToggleUi => { + display.toggle_ui(); + } + Event::Quit => { + break; + } + } + display.render(¤t_screen, &mut output).await?; + } + + Ok(()) +} |