use retroglyph_core::{Backend, Rect, Style, Terminal};
use super::{Widget, bar};
use crate::Theme;
#[derive(Clone, Copy, Debug)]
pub struct Gauge<'a> {
label: &'a str,
ratio: f32,
label_style: Style,
}
impl<'a> Gauge<'a> {
#[must_use]
pub fn new(label: &'a str, ratio: f32) -> Self {
Self {
label,
ratio,
label_style: bar::default_label_style(),
}
}
#[must_use]
pub const fn label_style(mut self, style: Style) -> Self {
self.label_style = style;
self
}
#[must_use]
pub fn theme(mut self, theme: Theme) -> Self {
self.label_style = Style::new().fg(theme.dim).bg(theme.panel_bg);
self
}
}
impl<B: Backend> Widget<B> for Gauge<'_> {
fn render(self, area: Rect, term: &mut Terminal<B>) {
let ratio = self.ratio.clamp(0.0, 1.0);
let pct = format!("{:>3}%", (ratio * 100.0).round() as i32);
bar::render(term, area, self.label, self.label_style, ratio, &pct);
}
}
#[cfg(test)]
mod tests {
use retroglyph_core::Headless;
use super::*;
#[test]
fn label_bar_and_percentage_readout() {
let area = Rect::new(0, 0, 20, 1);
let mut term = Terminal::new(Headless::new(20, 1));
Gauge::new("H", 0.5).render(area, &mut term);
assert_eq!(term.grid().get(2, 0).glyph(), '█'); assert_eq!(term.grid().get(19, 0).glyph(), '%'); }
#[test]
fn label_style_is_configurable() {
use retroglyph_core::Color;
let area = Rect::new(0, 0, 20, 1);
let mut term = Terminal::new(Headless::new(20, 1));
Gauge::new("H", 0.5)
.label_style(Style::new().fg(Color::WHITE))
.render(area, &mut term);
assert_eq!(term.grid().get(0, 0).style().foreground(), Color::WHITE);
}
#[test]
fn theme_maps_dim_role_onto_label_style() {
let area = Rect::new(0, 0, 20, 1);
let mut term = Terminal::new(Headless::new(20, 1));
Gauge::new("H", 0.5)
.theme(Theme::DARK)
.render(area, &mut term);
assert_eq!(term.grid().get(0, 0).style().foreground(), Theme::DARK.dim);
assert_eq!(
term.grid().get(0, 0).style().background(),
Theme::DARK.panel_bg
);
}
}