use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use crate::{RenderCtx, Size, Surface, View};
pub struct RatatuiView<F> {
measure: Measure,
render: F,
}
#[derive(Clone, Copy, Debug)]
enum Measure {
Fill,
Fixed(Size),
}
impl<F> RatatuiView<F>
where
F: Fn(Rect, &mut Buffer),
{
pub fn fill(render: F) -> Self {
Self {
measure: Measure::Fill,
render,
}
}
pub fn sized(size: Size, render: F) -> Self {
Self {
measure: Measure::Fixed(size),
render,
}
}
}
impl<F> View for RatatuiView<F>
where
F: Fn(Rect, &mut Buffer),
{
fn measure(&self, available: Size) -> Size {
match self.measure {
Measure::Fill => available,
Measure::Fixed(size) => Size::new(
size.width.min(available.width),
size.height.min(available.height),
),
}
}
fn render(&self, area: Rect, surface: &mut Surface, _ctx: &RenderCtx) {
surface.render_ratatui(area, &self.render);
}
}