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 let main_chunks = Layout::default()
18 .direction(Direction::Vertical)
19 .constraints([
20 Constraint::Length(1), Constraint::Min(10), Constraint::Length(1), ])
24 .split(size);
25
26 render_title_bar(f, app, main_chunks[0]);
28
29 let content_chunks = Layout::default()
31 .direction(Direction::Horizontal)
32 .constraints([
33 Constraint::Percentage(60), Constraint::Percentage(40), ])
36 .split(main_chunks[1]);
37
38 render_event_panel(f, app, content_chunks[0]);
40 render_status_panel(f, app, content_chunks[1]);
41
42 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}