ratatui/widgets/clear.rs
1use crate::{
2 buffer::Buffer,
3 layout::Rect,
4 widgets::{Widget, WidgetRef},
5};
6
7/// A widget to clear/reset a certain area to allow overdrawing (e.g. for popups).
8///
9/// This widget **cannot be used to clear the terminal on the first render** as `ratatui` assumes
10/// the render area is empty. Use [`crate::Terminal::clear`] instead.
11///
12/// # Examples
13///
14/// ```
15/// use ratatui::{
16/// layout::Rect,
17/// widgets::{Block, Clear},
18/// Frame,
19/// };
20///
21/// fn draw_on_clear(f: &mut Frame, area: Rect) {
22/// let block = Block::bordered().title("Block");
23/// f.render_widget(Clear, area); // <- this will clear/reset the area first
24/// f.render_widget(block, area); // now render the block widget
25/// }
26/// ```
27///
28/// # Popup Example
29///
30/// For a more complete example how to utilize `Clear` to realize popups see
31/// the example `examples/popup.rs`
32#[derive(Debug, Default, Clone, Eq, PartialEq, Hash)]
33pub struct Clear;
34
35impl Widget for Clear {
36 fn render(self, area: Rect, buf: &mut Buffer) {
37 self.render_ref(area, buf);
38 }
39}
40
41impl WidgetRef for Clear {
42 fn render_ref(&self, area: Rect, buf: &mut Buffer) {
43 for x in area.left()..area.right() {
44 for y in area.top()..area.bottom() {
45 buf[(x, y)].reset();
46 }
47 }
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54 use crate::{buffer::Buffer, layout::Rect, widgets::Widget};
55 #[test]
56 fn render() {
57 let mut buffer = Buffer::with_lines(["xxxxxxxxxxxxxxx"; 7]);
58 let clear = Clear;
59 clear.render(Rect::new(1, 2, 3, 4), &mut buffer);
60 let expected = Buffer::with_lines([
61 "xxxxxxxxxxxxxxx",
62 "xxxxxxxxxxxxxxx",
63 "x xxxxxxxxxxx",
64 "x xxxxxxxxxxx",
65 "x xxxxxxxxxxx",
66 "x xxxxxxxxxxx",
67 "xxxxxxxxxxxxxxx",
68 ]);
69 assert_eq!(buffer, expected);
70 }
71}