ratatui_kit/render/
drawer.rs

1use ratatui::{
2    buffer::Buffer,
3    layout::Rect,
4    widgets::{StatefulWidget, StatefulWidgetRef, Widget, WidgetRef},
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_widget_ref<W: WidgetRef>(&mut self, widget: W, area: Rect) {
35        widget.render_ref(area, self.buffer_mut());
36    }
37
38    pub fn render_stateful_widget<W: StatefulWidget>(
39        &mut self,
40        widget: W,
41        area: Rect,
42        state: &mut W::State,
43    ) {
44        widget.render(area, self.buffer_mut(), state);
45    }
46
47    pub fn render_stateful_widget_ref<W: StatefulWidgetRef>(
48        &mut self,
49        widget: W,
50        area: Rect,
51        state: &mut W::State,
52    ) {
53        widget.render_ref(area, self.buffer_mut(), state);
54    }
55}