use ratatui_core::layout; use ratatui_core::style; use ratatui_core::symbols; use ratatui_core::widgets::Widget; use super::element::Element; use crate::error; pub struct VFrame<'a> { children: Vec>, constraint: layout::Constraint, fill: style::Style, } impl Element for Frame { fn add_child(&mut self, child: Box) -> Result<(), error::LintuiniError>{ self.children.push(child); 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() } #[inline(always)] fn constraint(&self) -> &layout::Constraint { &self.constraint } } #[derive(Default)] pub struct FrameBuilder<'a> { fill: style::Style, constraint: layout::Constraint, border: Option>, } impl FrameBuilder<'_> { #[inline(always)] fn new() -> Self { FrameBuilder::default() } #[inline(always)] fn fill(mut self, style: style::Style) -> Self { self.fill = style; self } #[inline(always)] fn border_style(mut self, style: style::Style) -> Self { match self.border { Some(mut bs) => { bs.style = style; }, None => { self.border = Some(BorderStyle { style: style, ..Default::default() }) }, } self } #[inline(always)] fn border_charset(mut self, charset: symbols::border::Set<'_>) -> Self { match self.border { Some(mut bs) => { bs.charset = charset; }, None => { self.border = Some(BorderStyle { charset: charset, ..Default::default() }) }, } self } #[inline(always)] fn build<'a>(self) -> Frame<'a> { Frame { border: self.border.clone(), constraint: self.constraint, children: Vec::new(), fill: self.fill, } } } #[derive(Clone, Copy, Default)] pub struct BorderStyle<'a> { style: style::Style, charset: symbols::border::Set<'a>, }