Skip to main content

scrin/widgets/
clear.rs

1use crate::core::buffer::Buffer;
2use crate::core::color::Color;
3use crate::core::rect::Rect;
4use crate::widgets::Widget;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub struct Clear {
8    pub bg: Option<Color>,
9}
10
11impl Clear {
12    pub const fn new() -> Self {
13        Self { bg: None }
14    }
15
16    pub const fn with_bg(bg: Color) -> Self {
17        Self { bg: Some(bg) }
18    }
19}
20
21impl Default for Clear {
22    fn default() -> Self {
23        Self::new()
24    }
25}
26
27impl Widget for Clear {
28    fn render(&self, buffer: &mut Buffer, area: Rect) {
29        buffer.fill(area, ' ', Color::WHITE, self.bg);
30    }
31}
32
33pub fn centered_rect(percent_x: u16, percent_y: u16, area: Rect) -> Rect {
34    let width = area.width.saturating_mul(percent_x.min(100)) / 100;
35    let height = area.height.saturating_mul(percent_y.min(100)) / 100;
36    let x = area.x + area.width.saturating_sub(width) / 2;
37    let y = area.y + area.height.saturating_sub(height) / 2;
38    Rect::new(x, y, width, height)
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn clear_overwrites_area() {
47        let mut buffer = Buffer::new(6, 3);
48        buffer.fill(Rect::new(0, 0, 6, 3), 'X', Color::rgb(1, 2, 3), None);
49        Clear::with_bg(Color::rgb(4, 5, 6)).render(&mut buffer, Rect::new(1, 1, 3, 1));
50        assert_eq!(buffer.get(1, 1).unwrap().ch, ' ');
51        assert_eq!(buffer.get(1, 1).unwrap().bg, Some(Color::rgb(4, 5, 6)));
52        assert_eq!(buffer.get(0, 1).unwrap().ch, 'X');
53    }
54
55    #[test]
56    fn centered_rect_uses_percentages() {
57        assert_eq!(
58            centered_rect(50, 50, Rect::new(0, 0, 100, 40)),
59            Rect::new(25, 10, 50, 20)
60        );
61    }
62}