1use ratatui::Frame;
7use ratatui::layout::Rect;
8
9pub struct ClosureRoot {
15 render_fn: Box<dyn FnMut(&mut Frame<'_>)>,
16 frame_counter: u64,
17}
18
19impl ClosureRoot {
20 pub fn new<F>(render_fn: F) -> Self
22 where
23 F: FnMut(&mut Frame<'_>) + 'static,
24 {
25 Self {
26 render_fn: Box::new(render_fn),
27 frame_counter: 0,
28 }
29 }
30}
31
32impl oxi_tui::widget::Renderable for ClosureRoot {
33 fn content_hash(&self) -> u64 {
34 self.frame_counter.wrapping_add(1)
35 }
36
37 fn height_for(&self, _width: u16, _ctx: &oxi_tui::widget::RenderCtx<'_, '_>) -> u16 {
38 24
39 }
40
41 fn render(&mut self, _area: Rect, ctx: &mut oxi_tui::widget::RenderCtx<'_, '_>) {
42 self.frame_counter = self.frame_counter.wrapping_add(1);
43 ctx.with_frame(|frame| (self.render_fn)(frame));
44 }
45}
46#[allow(unused_imports)] pub use oxi_tui::content::{ChatLog, ChatMessage, ContentBlock, MessageRole, StreamingState};
48#[allow(unused_imports)] pub use oxi_tui::pipeline::{CursorState, FrameOutcome, draw_frame};
50#[allow(unused_imports)] pub use oxi_tui::theme::{TerminalCaps, Theme as V2Theme};
52#[allow(unused_imports)] pub use oxi_tui::widget::chat::ChatView;
54#[allow(unused_imports)] pub use oxi_tui::widget::panel::Footer;
56#[allow(unused_imports)] pub use oxi_tui::widget::{FocusTarget, RenderCtx, Renderable, RetainedChild, RetainedTree};