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<Box<dyn Element>>,
constraint: layout::Constraint,
fill: style::Style,
}
impl Element for Frame {
fn add_child(&mut self, child: Box<dyn Element>) -> Result<(), error::LintuiniError>{
self.children.push(child);
Ok(())
}
#[inline(always)]
fn children(&self) -> &[Box<dyn Element>] {
self.children.as_slice()
}
#[inline(always)]
fn children_mut(&mut self) -> &mut [Box<dyn Element>] {
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<BorderStyle<'a>>,
}
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>,
}