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}