use derive_builder::Builder;
use tessera_ui::{ComputedData, Constraint, DimensionValue, Dp, Px, tessera};
#[derive(Default, Clone, Copy, Builder)]
#[builder(pattern = "owned")]
pub struct SpacerArgs {
#[builder(default = "DimensionValue::Fixed(Px(0))", setter(into))]
pub width: DimensionValue,
#[builder(default = "DimensionValue::Fixed(Px(0))", setter(into))]
pub height: DimensionValue,
}
impl SpacerArgs {
pub fn fill_both() -> Self {
SpacerArgsBuilder::default()
.width(DimensionValue::Fill {
min: None,
max: None,
})
.height(DimensionValue::Fill {
min: None,
max: None,
})
.build()
.unwrap() }
pub fn fill_width() -> Self {
SpacerArgsBuilder::default()
.width(DimensionValue::Fill {
min: None,
max: None,
})
.height(DimensionValue::Fixed(Px(0))) .build()
.unwrap()
}
pub fn fill_height() -> Self {
SpacerArgsBuilder::default()
.width(DimensionValue::Fixed(Px(0))) .height(DimensionValue::Fill {
min: None,
max: None,
})
.build()
.unwrap()
}
}
impl From<Dp> for SpacerArgs {
fn from(value: Dp) -> Self {
SpacerArgsBuilder::default()
.width(DimensionValue::Fixed(value.to_px()))
.height(DimensionValue::Fixed(value.to_px()))
.build()
.unwrap()
}
}
impl From<Px> for SpacerArgs {
fn from(value: Px) -> Self {
SpacerArgsBuilder::default()
.width(DimensionValue::Fixed(value))
.height(DimensionValue::Fixed(value))
.build()
.unwrap()
}
}
#[tessera]
pub fn spacer(args: impl Into<SpacerArgs>) {
let args: SpacerArgs = args.into();
measure(Box::new(move |input| {
let spacer_intrinsic_constraint = Constraint::new(args.width, args.height);
let effective_spacer_constraint =
spacer_intrinsic_constraint.merge(input.parent_constraint);
let final_spacer_width = match effective_spacer_constraint.width {
DimensionValue::Fixed(w) => w,
DimensionValue::Wrap { min, .. } => min.unwrap_or(Px(0)), DimensionValue::Fill { min, max: _ } => {
min.unwrap_or(Px(0))
}
};
let final_spacer_height = match effective_spacer_constraint.height {
DimensionValue::Fixed(h) => h,
DimensionValue::Wrap { min, .. } => min.unwrap_or(Px(0)),
DimensionValue::Fill { min, max: _ } => min.unwrap_or(Px(0)),
};
Ok(ComputedData {
width: final_spacer_width,
height: final_spacer_height,
})
}));
}