#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub enum Dimension {
Px(i32),
Match,
#[default]
Wrap,
Weight(f32),
}
impl Dimension {
pub fn weight(&self) -> f32 {
match self {
Dimension::Weight(w) => *w,
_ => 0.0,
}
}
pub fn is_weight(&self) -> bool {
matches!(self, Dimension::Weight(_))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MeasureMode {
Exact,
AtMost,
Unbounded,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct MeasureSpec {
pub mode: MeasureMode,
pub size: i32,
}
impl MeasureSpec {
pub fn exactly(size: i32) -> Self {
Self { mode: MeasureMode::Exact, size }
}
pub fn at_most(size: i32) -> Self {
Self { mode: MeasureMode::AtMost, size }
}
pub fn unbounded() -> Self {
Self { mode: MeasureMode::Unbounded, size: 0 }
}
pub fn avail(&self) -> i32 {
match self.mode {
MeasureMode::Unbounded => i32::MAX / 4,
_ => self.size,
}
}
pub fn resolve(&self, desired: i32) -> i32 {
match self.mode {
MeasureMode::Exact => self.size,
MeasureMode::AtMost => desired.min(self.size).max(0),
MeasureMode::Unbounded => desired.max(0),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Axis {
Horizontal,
Vertical,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Align {
#[default]
Start,
Center,
End,
Stretch,
}