use crate::layout_constraints::{AvailableSpace, LayoutConstraints, LayoutSize};
use fret_core::Size;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LayoutOverflowContext {
pub probe_available_override: LayoutSize<Option<AvailableSpace>>,
pub allow_overflow_on_auto: LayoutSize<bool>,
}
impl LayoutOverflowContext {
pub const fn new(probe_available_override: LayoutSize<Option<AvailableSpace>>) -> Self {
Self {
probe_available_override,
allow_overflow_on_auto: LayoutSize::new(false, false),
}
}
pub const fn default_for_layout() -> Self {
Self {
probe_available_override: LayoutSize::new(None, None),
allow_overflow_on_auto: LayoutSize::new(false, false),
}
}
pub fn probe_constraints_for_size(self, size: Size) -> LayoutConstraints {
let mut available = LayoutSize::new(
AvailableSpace::Definite(size.width),
AvailableSpace::Definite(size.height),
);
if let Some(w) = self.probe_available_override.width {
available.width = w;
}
if let Some(h) = self.probe_available_override.height {
available.height = h;
}
LayoutConstraints::new(LayoutSize::new(None, None), available)
}
}
impl Default for LayoutOverflowContext {
fn default() -> Self {
Self::default_for_layout()
}
}
#[cfg(test)]
mod tests {
use super::*;
use fret_core::Px;
#[test]
fn probe_constraints_default_to_definite() {
let ctx = LayoutOverflowContext::default();
let c = ctx.probe_constraints_for_size(Size::new(Px(10.0), Px(20.0)));
assert_eq!(c.available.width, AvailableSpace::Definite(Px(10.0)));
assert_eq!(c.available.height, AvailableSpace::Definite(Px(20.0)));
}
#[test]
fn probe_constraints_apply_overrides_per_axis() {
let ctx = LayoutOverflowContext {
probe_available_override: LayoutSize::new(Some(AvailableSpace::MaxContent), None),
allow_overflow_on_auto: LayoutSize::new(false, false),
};
let c = ctx.probe_constraints_for_size(Size::new(Px(10.0), Px(20.0)));
assert_eq!(c.available.width, AvailableSpace::MaxContent);
assert_eq!(c.available.height, AvailableSpace::Definite(Px(20.0)));
}
}