ratatui_kit/render/
drawer.rs

1use ratatui::{
2    buffer::Buffer,
3    layout::Rect,
4    widgets::{StatefulWidget, Widget},
5};
6
7pub struct ComponentDrawer<'a, 'b: 'a> {
8    pub area: ratatui::layout::Rect,
9    pub frame: &'a mut ratatui::Frame<'b>,
10    pub scroll_buffer: Option<Buffer>,
11}
12
13impl<'a, 'b> ComponentDrawer<'a, 'b> {
14    pub fn new(frame: &'a mut ratatui::Frame<'b>, area: ratatui::layout::Rect) -> Self {
15        Self {
16            area,
17            frame,
18            scroll_buffer: None,
19        }
20    }
21
22    pub fn buffer_mut(&mut self) -> &mut ratatui::buffer::Buffer {
23        if let Some(scroll_buffer) = &mut self.scroll_buffer {
24            scroll_buffer
25        } else {
26            self.frame.buffer_mut()
27        }
28    }
29
30    pub fn render_widget<W: Widget>(&mut self, widget: W, area: Rect) {
31        widget.render(area, self.buffer_mut());
32    }
33
34    pub fn render_stateful_widget<W: StatefulWidget>(
35        &mut self,
36        widget: W,
37        area: Rect,
38        state: &mut W::State,
39    ) {
40        widget.render(area, self.buffer_mut(), state);
41    }
42}