Skip to main content

sequoia_core/
dirty.rs

1use bitflags::bitflags;
2
3bitflags! {
4    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5    pub struct Dirty: u16 {
6        const NONE      = 0;
7
8        const PAINT     = 1 << 0;
9
10        const LAYOUT    = 1 << 1;
11
12        const CHILDREN  = 1 << 2;
13
14        const TRANSFORM = 1 << 3;
15
16        const TEXT      = 1 << 4;
17
18        const HIT_TEST  = 1 << 5;
19
20        const DATA      = 1 << 6;
21
22        const CANVAS    = 1 << 7;
23
24        const OVERLAY   = 1 << 8;
25
26        const SURFACE   = 1 << 9;
27    }
28}
29
30impl Dirty {
31    pub fn needs_layout(self) -> bool {
32        self.intersects(Self::LAYOUT | Self::CHILDREN | Self::TEXT)
33    }
34
35    pub fn needs_repaint(self) -> bool {
36        self.intersects(
37            Self::PAINT
38                | Self::LAYOUT
39                | Self::CHILDREN
40                | Self::TRANSFORM
41                | Self::TEXT
42                | Self::CANVAS
43                | Self::OVERLAY
44                | Self::SURFACE,
45        )
46    }
47
48    pub fn needs_hit_test(self) -> bool {
49        self.intersects(Self::HIT_TEST | Self::CHILDREN | Self::LAYOUT | Self::TRANSFORM)
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn empty_is_clean() {
59        let d = Dirty::empty();
60        assert!(!d.needs_layout());
61        assert!(!d.needs_repaint());
62        assert!(!d.needs_hit_test());
63    }
64
65    #[test]
66    fn body_change_needs_layout() {
67        let d = Dirty::LAYOUT | Dirty::CHILDREN;
68        assert!(d.needs_layout());
69        assert!(d.needs_repaint());
70    }
71
72    #[test]
73    fn hover_needs_only_repaint() {
74        let d = Dirty::PAINT;
75        assert!(!d.needs_layout());
76        assert!(d.needs_repaint());
77        assert!(!d.needs_hit_test());
78    }
79
80    #[test]
81    fn flags_accumulate() {
82        let mut d = Dirty::empty();
83        d |= Dirty::PAINT;
84        d |= Dirty::TEXT;
85        assert!(d.needs_layout());
86        assert!(d.needs_repaint());
87    }
88}