#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Alignment {
pub horizontal: HorizontalAlignment,
pub vertical: VerticalAlignment,
}
impl Alignment {
pub const fn new(horizontal: HorizontalAlignment, vertical: VerticalAlignment) -> Self {
Self {
horizontal,
vertical,
}
}
pub const TOP_START: Self = Self::new(HorizontalAlignment::Start, VerticalAlignment::Top);
pub const CENTER: Self = Self::new(
HorizontalAlignment::CenterHorizontally,
VerticalAlignment::CenterVertically,
);
pub const BOTTOM_END: Self = Self::new(HorizontalAlignment::End, VerticalAlignment::Bottom);
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum HorizontalAlignment {
Start,
CenterHorizontally,
End,
}
impl HorizontalAlignment {
pub fn align(&self, available: f32, child: f32) -> f32 {
match self {
HorizontalAlignment::Start => 0.0,
HorizontalAlignment::CenterHorizontally => ((available - child) / 2.0).max(0.0),
HorizontalAlignment::End => (available - child).max(0.0),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum VerticalAlignment {
Top,
CenterVertically,
Bottom,
}
impl VerticalAlignment {
pub fn align(&self, available: f32, child: f32) -> f32 {
match self {
VerticalAlignment::Top => 0.0,
VerticalAlignment::CenterVertically => ((available - child) / 2.0).max(0.0),
VerticalAlignment::Bottom => (available - child).max(0.0),
}
}
}