thd75_tui/ui/
status_bar.rs1use 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 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 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 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 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 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 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}