theater_cli/tui/
ui.rs

1use ratatui::{
2    layout::{Constraint, Direction, Layout, Rect},
3    style::{Color, Modifier, Style},
4    widgets::Paragraph,
5    Frame,
6};
7
8use crate::tui::{
9    app::TuiApp,
10    components::{render_event_panel, render_status_panel},
11};
12
13pub fn render_ui(f: &mut Frame, app: &TuiApp) {
14    let size = f.size();
15
16    // Create the main layout: title bar + main content + controls
17    let main_chunks = Layout::default()
18        .direction(Direction::Vertical)
19        .constraints([
20            Constraint::Length(1), // Title bar
21            Constraint::Min(10),   // Main content
22            Constraint::Length(1), // Controls bar
23        ])
24        .split(size);
25
26    // Render title bar
27    render_title_bar(f, app, main_chunks[0]);
28
29    // Split main content into two panels
30    let content_chunks = Layout::default()
31        .direction(Direction::Horizontal)
32        .constraints([
33            Constraint::Percentage(60), // Events panel (left)
34            Constraint::Percentage(40), // Status panel (right)
35        ])
36        .split(main_chunks[1]);
37
38    // Render the two main panels
39    render_event_panel(f, app, content_chunks[0]);
40    render_status_panel(f, app, content_chunks[1]);
41
42    // Render controls bar
43    render_controls_bar(f, app, main_chunks[2]);
44}
45
46fn render_title_bar(f: &mut Frame, app: &TuiApp, area: Rect) {
47    let actor_id_short = if app.actor_id.len() > 12 {
48        format!("{}...", &app.actor_id[..9])
49    } else {
50        app.actor_id.clone()
51    };
52
53    let title = format!(" Theater Actor Monitor - Actor ID: {} ", actor_id_short);
54
55    let title_paragraph = Paragraph::new(title).style(
56        Style::default()
57            .fg(Color::White)
58            .bg(Color::Blue)
59            .add_modifier(Modifier::BOLD),
60    );
61
62    f.render_widget(title_paragraph, area);
63}
64
65fn render_controls_bar(f: &mut Frame, app: &TuiApp, area: Rect) {
66    let controls = if app.paused {
67        " Controls: [q]uit [r]esume [s]croll [c]lear "
68    } else {
69        " Controls: [q]uit [p]ause [s]croll [c]lear "
70    };
71
72    let controls_paragraph =
73        Paragraph::new(controls).style(Style::default().fg(Color::Black).bg(Color::Gray));
74
75    f.render_widget(controls_paragraph, area);
76}