use ratatui_core::layout; use ratatui_core::style::Style; use ratatui_core::terminal::Frame; use ratatui_widgets::block; use ratatui_widgets::borders; use super::element::{Element, ElementWithChildren}; use crate::error; #[derive(Default)] pub struct Container<'a> { children: Vec>, constraint: layout::Constraint, layout: layout::Layout, widgets: ContainerWidgets<'a>, } impl ElementWithChildren for Container<'_> { #[inline(always)] fn add_child(&mut self, child: impl Into>) -> Result<(), error::LintuiniError>{ self.children.push(child.into()); Ok(()) } #[inline(always)] fn children(&self) -> &[Box] { self.children.as_slice() } #[inline(always)] fn children_mut(&mut self) -> &mut [Box] { self.children.as_mut_slice() } } impl Element for Container<'_> { #[inline(always)] fn constraint(&self) -> layout::Constraint { self.constraint } fn render(&self, frm: &mut Frame, rect: layout::Rect) -> Result<(), error::LintuiniError> { frm.render_widget(&self.widgets.block0, rect); for (el, r) in self.children.iter().zip(&*self.layout.split(rect)) { el.render(frm, *r); } Ok(()) } } impl Container<'_> { #[inline(always)] pub fn new() -> Self { Container::default() } #[inline(always)] pub fn constraint(mut self, constraint: layout::Constraint) -> Self { self.constraint = constraint; self } #[inline(always)] pub fn direction(mut self, direction: layout::Direction) -> Self { self.layout = self.layout.direction(direction); self.regenerate_layout() } fn regenerate_layout(mut self) -> Self { if self.children.len() == 0 { return self; } self.layout = self.layout.constraints( self.children .iter() .map(|el| el.constraint()) ); self } } #[derive(Clone, Default)] struct ContainerWidgets<'a> { block0: block::Block<'a>, }