trippy_tui/frontend/render/
flows.rs

1use crate::frontend::tui_app::TuiApp;
2use crate::t;
3use ratatui::layout::{Alignment, Rect};
4use ratatui::style::{Modifier, Style};
5use ratatui::text::Line;
6use ratatui::widgets::{Bar, BarChart, BarGroup, Block, BorderType, Borders};
7use ratatui::Frame;
8
9/// Render the flows.
10pub fn render(f: &mut Frame<'_>, rect: Rect, app: &TuiApp) {
11    let round_flow_id = app.tracer_data().round_flow_id();
12    let data: Vec<_> = app
13        .flow_counts
14        .iter()
15        .map(|(flow_id, count)| {
16            let bar_color = if flow_id == &app.selected_flow {
17                app.tui_config.theme.flows_chart_bar_selected
18            } else {
19                app.tui_config.theme.flows_chart_bar_unselected
20            };
21            let label_color = if flow_id == &round_flow_id {
22                app.tui_config.theme.flows_chart_text_current
23            } else {
24                app.tui_config.theme.flows_chart_text_non_current
25            };
26            Bar::default()
27                .label(Line::from(format!("{flow_id}")))
28                .value(*count as u64)
29                .style(Style::default().fg(bar_color))
30                .value_style(
31                    Style::default()
32                        .bg(bar_color)
33                        .fg(label_color)
34                        .add_modifier(Modifier::BOLD),
35                )
36        })
37        .collect();
38    let block = Block::default()
39        .title(Line::raw(t!("title_flows")))
40        .title_alignment(Alignment::Left)
41        .borders(Borders::ALL)
42        .border_type(BorderType::Rounded)
43        .border_style(Style::default().fg(app.tui_config.theme.border))
44        .style(
45            Style::default()
46                .bg(app.tui_config.theme.bg)
47                .fg(app.tui_config.theme.text),
48        );
49    let group = BarGroup::default().bars(&data);
50    let flow_counts = BarChart::default()
51        .block(block)
52        .data(group)
53        .bar_width(4)
54        .bar_gap(1);
55    f.render_widget(flow_counts, rect);
56}