leetcode_tui_rs/widgets/
progress_bar.rs

1use crate::ctx::Ctx;
2use leetcode_tui_config::CONFIG;
3use ratatui::prelude::*;
4use ratatui::widgets::{Gauge, Widget};
5
6pub(super) struct ProgressBar<'a> {
7    cx: &'a Ctx,
8}
9
10impl<'a> ProgressBar<'a> {
11    pub fn new(cx: &'a Ctx) -> Self {
12        Self { cx }
13    }
14
15    fn create_gauge_without_block(title: &str, val: usize, total: usize, style: Style) -> Gauge {
16        let percentage = if total != 0 {
17            (val as f32 / total as f32) * 100_f32
18        } else {
19            0 as f32
20        };
21        let label = Span::styled(
22            format!("{title} - {:.2}%", percentage),
23            style
24                .add_modifier(Modifier::ITALIC | Modifier::BOLD)
25                .fg(Color::White)
26                .bg(Color::Black),
27        );
28
29        Gauge::default()
30            .gauge_style(style)
31            .percent(percentage as u16)
32            .label(label)
33    }
34}
35
36impl<'a> Widget for ProgressBar<'a> {
37    fn render(self, _area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer) {
38        let progress = &self.cx.progress;
39
40        let style = CONFIG.as_ref().theme.question.normal.easy.into();
41        let progress_guage = Self::create_gauge_without_block(
42            progress.get_title(),
43            progress.get_progress() as usize,
44            progress.get_total() as usize,
45            style,
46        );
47
48        progress_guage.render(_area, buf);
49    }
50}