theater_cli/tui/
events.rs

1use crossterm::event::{self, Event, KeyCode, KeyEventKind};
2use std::time::Duration;
3
4use crate::tui::app::TuiApp;
5
6pub enum InputEvent {
7    Quit,
8    TogglePause,
9    ToggleAutoScroll,
10    ClearEvents,
11    None,
12}
13
14pub fn handle_input(app: &mut TuiApp) -> Result<InputEvent, Box<dyn std::error::Error>> {
15    // Poll for events with a timeout
16    if event::poll(Duration::from_millis(50))? {
17        if let Event::Key(key) = event::read()? {
18            // Only handle key press events, not key release
19            if key.kind == KeyEventKind::Press {
20                match key.code {
21                    KeyCode::Char('q') | KeyCode::Char('Q') => {
22                        return Ok(InputEvent::Quit);
23                    }
24                    KeyCode::Char('p') | KeyCode::Char('P') => {
25                        return Ok(InputEvent::TogglePause);
26                    }
27                    KeyCode::Char('r') | KeyCode::Char('R') => {
28                        if app.paused {
29                            return Ok(InputEvent::TogglePause);
30                        }
31                    }
32                    KeyCode::Char('s') | KeyCode::Char('S') => {
33                        return Ok(InputEvent::ToggleAutoScroll);
34                    }
35                    KeyCode::Char('c') | KeyCode::Char('C') => {
36                        return Ok(InputEvent::ClearEvents);
37                    }
38                    KeyCode::Esc => {
39                        return Ok(InputEvent::Quit);
40                    }
41                    _ => {}
42                }
43            }
44        }
45    }
46
47    Ok(InputEvent::None)
48}