use ratatui::layout::Margin;
use ratatui::widgets::{Block, Borders};
use super::{PaneLayout, PaneLayoutState};
use crate::component::RenderContext;
fn render_panes<F>(state: &PaneLayoutState, ctx: &mut RenderContext<'_, '_>, mut render_child: F)
where
F: FnMut(&str, &mut RenderContext<'_, '_>),
{
crate::annotation::with_registry(|reg| {
reg.register(
ctx.area,
crate::annotation::Annotation::new(crate::annotation::WidgetType::PaneLayout)
.with_id("pane_layout")
.with_focus(ctx.focused)
.with_disabled(ctx.disabled),
);
});
let rects = state.layout(ctx.area);
for (i, (pane, rect)) in state.panes.iter().zip(rects.iter()).enumerate() {
let is_focused_pane = ctx.focused && i == state.focused_pane;
let border_style = if ctx.disabled {
ctx.theme.disabled_style()
} else if is_focused_pane {
ctx.theme.focused_border_style()
} else {
ctx.theme.border_style()
};
let mut block = Block::default()
.borders(Borders::ALL)
.border_style(border_style);
if let Some(title) = &pane.title {
let span = if let Some(style) = pane.title_style {
ratatui::text::Span::styled(format!(" {} ", title), style)
} else {
ratatui::text::Span::raw(format!(" {} ", title))
};
block = block.title(span);
}
ctx.frame.render_widget(block, *rect);
let inner = rect.inner(Margin {
vertical: 1,
horizontal: 1,
});
let mut child_ctx = ctx.with_area(inner);
child_ctx.focused = is_focused_pane;
child_ctx.chrome_owned = true;
render_child(pane.id.as_str(), &mut child_ctx);
}
}
pub(super) fn render_chrome_only(state: &PaneLayoutState, ctx: &mut RenderContext<'_, '_>) {
render_panes(state, ctx, |_, _| {});
}
impl PaneLayout {
pub fn view_with<F>(state: &PaneLayoutState, ctx: &mut RenderContext<'_, '_>, render_child: F)
where
F: FnMut(&str, &mut RenderContext<'_, '_>),
{
render_panes(state, ctx, render_child);
}
}