thd75_tui/ui/
status_bar.rs

1use ratatui::Frame;
2use ratatui::layout::Rect;
3use ratatui::style::{Color, Style};
4use ratatui::text::{Line, Span};
5use ratatui::widgets::Paragraph;
6
7use crate::app::{App, AprsMode};
8
9pub(crate) fn render(app: &App, frame: &mut Frame<'_>, area: Rect) {
10    let mut spans: Vec<Span<'_>> = Vec::new();
11
12    // Connection
13    if app.connected {
14        spans.push(Span::styled(
15            format!(" {} ", app.port_path),
16            Style::default().fg(Color::Green),
17        ));
18    } else {
19        spans.push(Span::styled(
20            " Disconnected ",
21            Style::default().fg(Color::Red),
22        ));
23    }
24
25    // Firmware
26    if !app.state.firmware_version.is_empty() {
27        spans.push(Span::styled(
28            format!("FW:{} ", app.state.firmware_version),
29            Style::default().fg(Color::DarkGray),
30        ));
31    }
32
33    // Live toggles as compact indicators
34    let s = &app.state;
35    let mut flags = Vec::new();
36    flags.push(format!("BAT:{}", s.battery_level));
37    flags.push(format!("Vol:{}", s.af_gain));
38    if s.lock {
39        flags.push("LCK".into());
40    }
41    if s.bluetooth {
42        flags.push("BT".into());
43    }
44    if s.vox {
45        flags.push("VOX".into());
46    }
47    if s.gps_enabled {
48        flags.push("GPS".into());
49    }
50    if !s.dual_band {
51        flags.push("1BD".into());
52    }
53    if app.aprs_mode == AprsMode::Active {
54        flags.push("APRS".into());
55    }
56
57    spans.push(Span::styled(
58        format!(" {} ", flags.join(" ")),
59        Style::default().fg(Color::DarkGray),
60    ));
61
62    // Target band indicator
63    let band_label = if app.target_band == kenwood_thd75::types::Band::B {
64        "B"
65    } else {
66        "A"
67    };
68    spans.push(Span::styled(
69        format!("→{band_label} "),
70        Style::default().fg(Color::Cyan),
71    ));
72
73    // Status message
74    if let Some(ref msg) = app.status_message {
75        spans.push(Span::styled(
76            format!("{msg} "),
77            Style::default().fg(Color::Yellow),
78        ));
79    }
80
81    // Help hint
82    spans.push(Span::styled(
83        "[?]Help ",
84        Style::default().fg(Color::DarkGray),
85    ));
86
87    frame.render_widget(Paragraph::new(Line::from(spans)), area);
88}