semantic_diff/ui/
summary.rs1use crate::app::App;
2use ratatui::layout::Rect;
3use ratatui::style::{Color, Modifier, Style};
4use ratatui::text::{Line, Span};
5use ratatui::Frame;
6
7pub fn render_summary(app: &App, frame: &mut Frame, area: Rect) {
9 let total_files = app.diff_data.files.len() + app.diff_data.binary_files.len();
10 let total_added: usize = app.diff_data.files.iter().map(|f| f.added_count).sum();
11 let total_removed: usize = app.diff_data.files.iter().map(|f| f.removed_count).sum();
12
13 let mut spans = vec![
14 Span::styled(
15 format!(" {total_files} file(s) changed "),
16 Style::default().add_modifier(Modifier::BOLD),
17 ),
18 Span::styled(
19 format!("+{total_added}"),
20 Style::default()
21 .fg(Color::Green)
22 .add_modifier(Modifier::BOLD),
23 ),
24 Span::styled(
25 format!(" -{total_removed}"),
26 Style::default()
27 .fg(Color::Red)
28 .add_modifier(Modifier::BOLD),
29 ),
30 ];
31
32 if !app.diff_data.binary_files.is_empty() {
33 spans.push(Span::styled(
34 format!(" ({} binary)", app.diff_data.binary_files.len()),
35 Style::default().fg(Color::Yellow),
36 ));
37 }
38
39 if let Some(ref filter) = app.active_filter {
41 spans.push(Span::styled(
42 format!(" [filter: {filter}]"),
43 Style::default()
44 .fg(Color::Cyan)
45 .add_modifier(Modifier::BOLD),
46 ));
47 }
48
49 use crate::grouper::GroupingStatus;
51 match &app.grouping_status {
52 GroupingStatus::Loading => {
53 spans.push(Span::styled(
54 " | Grouping...",
55 Style::default().fg(Color::Yellow),
56 ));
57 }
58 GroupingStatus::Done => {
59 if let Some(ref groups) = app.semantic_groups {
60 spans.push(Span::styled(
61 format!(" | {} groups", groups.len()),
62 Style::default().fg(Color::Cyan),
63 ));
64 }
65 }
66 GroupingStatus::Error(_) => {
67 spans.push(Span::styled(
68 " | Ungrouped",
69 Style::default().fg(Color::DarkGray),
70 ));
71 }
72 GroupingStatus::Idle => {} }
74
75 spans.push(Span::styled(
77 " ? help",
78 Style::default().fg(Color::DarkGray),
79 ));
80
81 let line = Line::from(spans);
82 let paragraph = ratatui::widgets::Paragraph::new(line);
83 frame.render_widget(paragraph, area);
84}