use bevy_ecs::prelude::*;
use super::dimension::*;
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct BoxSize {
pub width: Option<Dimension>,
pub height: Option<Dimension>,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct BoxMargin(pub Rect<LengthPercentageAuto>);
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct BoxPadding(pub Rect<LengthPercentage>);
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub enum BoxPosition {
#[default]
Relative,
Absolute,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct BoxInset(pub Rect<LengthPercentageAuto>);
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct FlexContainer {
pub direction: taffy::FlexDirection,
pub justify_content: Option<taffy::JustifyContent>,
pub align_items: Option<taffy::AlignItems>,
}
impl Default for FlexContainer {
fn default() -> Self {
Self {
direction: taffy::FlexDirection::Row,
justify_content: None,
align_items: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct FlexItem {
pub grow: f32,
pub shrink: f32,
pub basis: Dimension,
pub align_self: Option<taffy::AlignSelf>,
}
impl Default for FlexItem {
fn default() -> Self {
Self {
grow: 0.0,
shrink: 1.0,
basis: Dimension::Auto,
align_self: None,
}
}
}
pub use taffy::{AlignContent, AlignItems, AlignSelf, FlexDirection, JustifyContent};
#[derive(Component, Debug, Clone, Copy, PartialEq, Default)]
pub struct BoxStyle {
pub size: Option<BoxSize>,
pub min_size: Option<BoxSize>,
pub max_size: Option<BoxSize>,
pub margin: Option<BoxMargin>,
pub padding: Option<BoxPadding>,
pub position: Option<BoxPosition>,
pub inset: Option<BoxInset>,
pub flex_direction: Option<FlexDirection>,
pub justify_content: Option<JustifyContent>,
pub align_items: Option<AlignItems>,
pub flex_grow: Option<f32>,
pub flex_shrink: Option<f32>,
pub flex_basis: Option<Dimension>,
pub align_self: Option<AlignSelf>,
}
impl BoxStyle {
pub fn new() -> Self {
Self::default()
}
}
fn apply_box_size(target: &mut taffy::Size<taffy::Dimension>, src: &BoxSize) {
if let Some(w) = src.width {
target.width = w.into();
}
if let Some(h) = src.height {
target.height = h.into();
}
}
impl From<&BoxStyle> for taffy::Style {
fn from(style: &BoxStyle) -> Self {
let mut taffy_style = taffy::Style::default();
if let Some(size) = &style.size {
apply_box_size(&mut taffy_style.size, size);
}
if let Some(min_size) = &style.min_size {
apply_box_size(&mut taffy_style.min_size, min_size);
}
if let Some(max_size) = &style.max_size {
apply_box_size(&mut taffy_style.max_size, max_size);
}
if let Some(margin) = &style.margin {
taffy_style.margin = margin.0.into();
}
if let Some(padding) = &style.padding {
taffy_style.padding = padding.0.into();
}
if let Some(position) = &style.position {
taffy_style.position = match position {
BoxPosition::Relative => taffy::Position::Relative,
BoxPosition::Absolute => taffy::Position::Absolute,
};
}
if let Some(inset) = &style.inset {
taffy_style.inset = inset.0.into();
}
if style.flex_direction.is_some()
|| style.justify_content.is_some()
|| style.align_items.is_some()
{
taffy_style.display = taffy::Display::Flex;
}
if let Some(dir) = style.flex_direction {
taffy_style.flex_direction = dir;
}
if let Some(jc) = style.justify_content {
taffy_style.justify_content = Some(jc);
}
if let Some(ai) = style.align_items {
taffy_style.align_items = Some(ai);
}
taffy_style.flex_grow = style.flex_grow.unwrap_or(0.0);
taffy_style.flex_shrink = style.flex_shrink.unwrap_or(1.0);
if let Some(basis) = style.flex_basis {
taffy_style.flex_basis = basis.into();
}
if let Some(align_self) = style.align_self {
taffy_style.align_self = Some(align_self);
}
taffy_style
}
}