use crate::*; pub enum Cond, B: Render> { _Unused(E), When(bool, A), Either(bool, A, B) } impl> LayoutCond for R {} pub trait LayoutCond: Render + Sized { fn when (self, cond: bool) -> If { If(Default::default(), cond, self) } fn or > (self, cond: bool, other: B) -> Either { Either(Default::default(), cond, self, other) } } impl LayoutCondStatic for E {} pub trait LayoutCondStatic { fn either , B: Render> ( condition: bool, a: A, b: B, ) -> Either { Either(Default::default(), condition, a, b) } } /// Render widget if predicate is true pub struct If>(PhantomData, bool, A); impl> Render for If { fn min_size (&self, to: E::Size) -> Perhaps { if self.1 { return self.2.min_size(to) } Ok(None) } fn render (&self, to: &mut E::Output) -> Usually<()> { if self.1 { return self.2.render(to) } Ok(()) } } /// Render widget A if predicate is true, otherwise widget B pub struct Either, B: Render>( PhantomData, bool, A, B, ); impl, B: Render> Render for Either { fn min_size (&self, to: E::Size) -> Perhaps { if self.1 { self.2.min_size(to) } else { self.3.min_size(to) } } fn render (&self, to: &mut E::Output) -> Usually<()> { if self.1 { self.2.render(to) } else { self.3.render(to) } } }