leetcode_tui_rs/widgets/
progress_bar.rs1use 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}