use super::*; /// A container with a horizontal and vertical component. #[derive(Default, Copy, Clone, Eq, PartialEq)] pub struct Spec { /// The horizontal component. pub horizontal: T, /// The vertical component. pub vertical: T, } impl Spec { /// Create a new instance from the two components. pub fn new(horizontal: T, vertical: T) -> Self { Self { horizontal, vertical } } /// Create a new instance with two equal components. pub fn splat(value: T) -> Self where T: Clone, { Self { horizontal: value.clone(), vertical: value, } } } impl Spec { /// The zero value. pub const ZERO: Self = Self { horizontal: Length::ZERO, vertical: Length::ZERO, }; /// Convert to a point. pub fn to_point(self) -> Point { Point::new(self.horizontal, self.vertical) } /// Convert to a size. pub fn to_size(self) -> Size { Size::new(self.horizontal, self.vertical) } } impl Get for Spec { type Component = T; fn get(self, axis: SpecAxis) -> T { match axis { SpecAxis::Horizontal => self.horizontal, SpecAxis::Vertical => self.vertical, } } fn get_mut(&mut self, axis: SpecAxis) -> &mut T { match axis { SpecAxis::Horizontal => &mut self.horizontal, SpecAxis::Vertical => &mut self.vertical, } } } impl Switch for Spec { type Other = Gen; fn switch(self, main: SpecAxis) -> Self::Other { match main { SpecAxis::Horizontal => Gen::new(self.vertical, self.horizontal), SpecAxis::Vertical => Gen::new(self.horizontal, self.vertical), } } } impl Debug for Spec { fn fmt(&self, f: &mut Formatter) -> fmt::Result { write!(f, "Spec({:?}, {:?})", self.horizontal, self.vertical) } } /// The two specific layouting axes. #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub enum SpecAxis { /// The vertical layouting axis. Vertical, /// The horizontal layouting axis. Horizontal, } impl SpecAxis { /// The other axis. pub fn other(self) -> Self { match self { Self::Horizontal => Self::Vertical, Self::Vertical => Self::Horizontal, } } } impl Switch for SpecAxis { type Other = GenAxis; fn switch(self, main: SpecAxis) -> Self::Other { if self == main { GenAxis::Main } else { GenAxis::Cross } } } impl Display for SpecAxis { fn fmt(&self, f: &mut Formatter) -> fmt::Result { f.pad(match self { Self::Vertical => "vertical", Self::Horizontal => "horizontal", }) } }