1use ratatui::{
2 buffer::Buffer,
3 layout::Rect,
4 style::{Modifier, Style},
5 text::{Line, Span},
6 widgets::{Paragraph, Widget},
7};
8
9use crate::engine::{EngineFlags, EngineKind};
10use crate::ui::theme;
11
12pub struct StatusBar {
13 pub engine: EngineKind,
14 pub match_count: usize,
15 pub flags: EngineFlags,
16}
17
18impl Widget for StatusBar {
19 fn render(self, area: Rect, buf: &mut Buffer) {
20 let mut spans = vec![
21 Span::styled(
22 format!(" {} ", self.engine),
23 Style::default()
24 .fg(theme::BASE)
25 .bg(theme::BLUE)
26 .add_modifier(Modifier::BOLD),
27 ),
28 Span::styled(" ", Style::default().bg(theme::SURFACE0)),
29 Span::styled(
30 format!(
31 " {} match{} ",
32 self.match_count,
33 if self.match_count == 1 { "" } else { "es" }
34 ),
35 Style::default().fg(theme::TEXT).bg(theme::SURFACE0),
36 ),
37 Span::styled(" ", Style::default().bg(theme::SURFACE0)),
38 ];
39
40 let flags = [
42 ("i", self.flags.case_insensitive),
43 ("m", self.flags.multi_line),
44 ("s", self.flags.dot_matches_newline),
45 ("u", self.flags.unicode),
46 ("x", self.flags.extended),
47 ];
48
49 for (name, active) in &flags {
50 let style = if *active {
51 Style::default()
52 .fg(theme::BASE)
53 .bg(theme::GREEN)
54 .add_modifier(Modifier::BOLD)
55 } else {
56 Style::default().fg(theme::OVERLAY).bg(theme::SURFACE0)
57 };
58 spans.push(Span::styled(format!(" {name} "), style));
59 }
60
61 spans.push(Span::styled(
62 " | Ctrl+E: engine | Tab: switch | F1: help | Esc: quit ",
63 Style::default().fg(theme::SUBTEXT).bg(theme::SURFACE0),
64 ));
65
66 let line = Line::from(spans);
67 let paragraph = Paragraph::new(line).style(Style::default().bg(theme::SURFACE0));
68 paragraph.render(area, buf);
69 }
70}