use crate::round_to_px;
pub fn bias_offset(bias: f32, available: f32, child: f32, density: f32) -> f32 {
round_to_px((available - child) / 2.0 * (1.0 + bias), density)
}
#[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 bias(&self) -> f32 {
match self {
HorizontalAlignment::Start => -1.0,
HorizontalAlignment::CenterHorizontally => 0.0,
HorizontalAlignment::End => 1.0,
}
}
pub fn align(&self, available: f32, child: f32, density: f32) -> f32 {
bias_offset(self.bias(), available, child, density)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum VerticalAlignment {
Top,
CenterVertically,
Bottom,
}
impl VerticalAlignment {
pub fn bias(&self) -> f32 {
match self {
VerticalAlignment::Top => -1.0,
VerticalAlignment::CenterVertically => 0.0,
VerticalAlignment::Bottom => 1.0,
}
}
pub fn align(&self, available: f32, child: f32, density: f32) -> f32 {
bias_offset(self.bias(), available, child, density)
}
}
#[cfg(test)]
#[path = "tests/alignment_tests.rs"]
mod tests;