use alloc::boxed::Box;
use crate::elements::KaolinNode;
use crate::elements::RenderCommand;
use crate::style::sizing::PreferredSize;
use crate::style::sizing::SizingDimensions;
pub trait KaolinElement<Color>
where
Color: Default + Copy + PartialEq + crate::style::KaolinColor<Color>,
{
fn get_sizing_dimensions(&self) -> (SizingDimensions, SizingDimensions);
fn render(
&self,
offsets: (f64, f64),
size: (f64, f64),
) -> Box<dyn Iterator<Item = RenderCommand<Color>> + '_>;
fn default_growable_width(&self, sizing: &SizingDimensions) -> bool {
sizing.is_growable()
}
fn default_shrinkable(&self, sizing: &SizingDimensions) -> bool {
sizing.is_shrinkable()
}
fn default_growable_height(&self, sizing: &SizingDimensions) -> bool {
sizing.is_growable()
}
fn starting_width(&self, sizing: &SizingDimensions) -> f64 {
match sizing.preferred {
PreferredSize::Fixed(size) => size.into(),
_ => sizing.min.into(),
}
}
fn starting_height(&self, sizing: &SizingDimensions) -> f64 {
match sizing.preferred {
PreferredSize::Fixed(size) => size.into(),
_ => sizing.min.into(),
}
}
#[allow(unused_variables)]
fn fit_height_unbound(&mut self, final_width: f64) -> f64 {
0.0
}
#[allow(unused_variables)]
fn propagate_position(&mut self, offsets: (f64, f64), size: (f64, f64)) {}
#[allow(unused_variables)]
fn inherit_color(&mut self, inherited_color: Color) {}
fn as_container(&mut self) -> Option<&mut dyn KaolinContainerElement<Color>>;
}
pub trait KaolinContainerElement<Color>: KaolinElement<Color>
where
Color: Default + Copy + PartialEq + crate::style::KaolinColor<Color>,
{
fn add_child(&mut self, child: KaolinNode<Color>);
fn propagate_width_growth(&mut self, parent_width: f64);
fn propagate_height_growth(&mut self, parent_height: f64);
}