//! Dirt classification for widget mutations. //! //! Every widget setter knows which pipeline stage its property affects and //! marks the widget's dirt accordingly; the tree collects it through //! [`Widget::take_dirt`](crate::widget::Widget::take_dirt) when a mutation //! borrow ends. Layout dirt implies repainting; paint dirt does not imply //! relayout. /// What must be redone because of a mutation. #[derive(Copy, Clone, Debug, Default, PartialEq, Eq)] pub struct Dirt { /// The widget's size or content geometry may have changed. pub layout: bool, /// The widget's appearance changed within its current geometry. pub paint: bool, } impl Dirt { pub const CLEAN: Self = Self { layout: false, paint: false, }; pub const PAINT: Self = Self { layout: false, paint: true, }; /// Layout-affecting mutations always repaint too. pub const LAYOUT: Self = Self { layout: true, paint: true, }; pub fn is_clean(self) -> bool { self == Self::CLEAN } #[must_use] pub fn union(self, other: Self) -> Self { Self { layout: self.layout || other.layout, paint: self.paint || other.paint, } } /// Mark a layout-affecting change. pub fn mark_layout(&mut self) { *self = self.union(Self::LAYOUT); } /// Mark a paint-only change. pub fn mark_paint(&mut self) { *self = self.union(Self::PAINT); } }