Skip to main content

rgx/ui/
status_bar.rs

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        // Flag indicators
41        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}