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}