1 | #include "PainterWidget.hpp" |
---|---|
2 | |
3 | PainterWidget:: |
4 | PainterWidget(PainterWidget *parent): |
5 | m_dimensions(100.0f, 100.0f), //whatever. |
6 | m_clipped(true), |
7 | m_draw_transparent(false), |
8 | m_skip_drawing(false), |
9 | m_parent(parent) |
10 | { |
11 | if (m_parent != nullptr) |
12 | { |
13 | m_iterator_loc = m_parent->m_children.insert(m_parent->m_children.end(), this); |
14 | } |
15 | } |
16 | |
17 | PainterWidget:: |
18 | ~PainterWidget(void) |
19 | { |
20 | if (m_parent != nullptr) |
21 | { |
22 | m_parent->m_children.erase(m_iterator_loc); |
23 | } |
24 | |
25 | for(std::list<PainterWidget*>::iterator iter = m_children.begin(), |
26 | end = m_children.end(); iter != end; ++iter) |
27 | { |
28 | PainterWidget *c(*iter); |
29 | |
30 | FASTUIDRAWassert(c->m_parent == this); |
31 | c->m_parent = nullptr; |
32 | FASTUIDRAWdelete(c); |
33 | } |
34 | } |
35 | |
36 | |
37 | void |
38 | PainterWidget:: |
39 | parent(PainterWidget *p) |
40 | { |
41 | if (p == m_parent) |
42 | { |
43 | return; |
44 | } |
45 | |
46 | if (m_parent != nullptr) |
47 | { |
48 | m_parent->m_children.erase(m_iterator_loc); |
49 | } |
50 | |
51 | FASTUIDRAWassert(!is_ancestor_of(p)); |
52 | m_parent = p; |
53 | m_iterator_loc = m_parent->m_children.insert(m_parent->m_children.end(), this); |
54 | } |
55 | |
56 | bool |
57 | PainterWidget:: |
58 | is_ancestor_of(PainterWidget *q) |
59 | { |
60 | for(PainterWidget *p = q; p != nullptr; p = p->parent()) |
61 | { |
62 | if (this == p) |
63 | return true; |
64 | } |
65 | return false; |
66 | } |
67 | |
68 | |
69 | void |
70 | PainterWidget:: |
71 | paint(const fastuidraw::reference_counted_ptr<fastuidraw::Painter> &painter) |
72 | { |
73 | pre_paint(); |
74 | if (m_skip_drawing) |
75 | { |
76 | return; |
77 | } |
78 | |
79 | painter->save(); |
80 | { |
81 | painter->concat(m_parent_matrix_this); |
82 | |
83 | if (m_clipped) |
84 | { |
85 | painter->clip_in_rect(fastuidraw::Rect().size(m_dimensions)); |
86 | } |
87 | |
88 | if (m_draw_transparent) |
89 | { |
90 | painter->begin_layer(0.5f); |
91 | painter->clip_in_rect(fastuidraw::Rect().size(m_dimensions)); |
92 | } |
93 | |
94 | painter->save(); |
95 | paint_pre_children(painter); |
96 | painter->restore(); |
97 | |
98 | for(std::list<PainterWidget*>::iterator iter = m_children.begin(), |
99 | end = m_children.end(); iter!=end; ++iter) |
100 | { |
101 | PainterWidget *c(*iter); |
102 | FASTUIDRAWassert(c->m_parent == this); |
103 | c->paint(painter); |
104 | } |
105 | |
106 | painter->save(); |
107 | paint_post_children(painter); |
108 | painter->restore(); |
109 | |
110 | if (m_draw_transparent) |
111 | { |
112 | painter->end_layer(); |
113 | } |
114 | } |
115 | painter->restore(); |
116 | } |
117 | |
118 | void |
119 | PainterWidget:: |
120 | paint_pre_children(const fastuidraw::reference_counted_ptr<fastuidraw::Painter> &) |
121 | {} |
122 | |
123 | void |
124 | PainterWidget:: |
125 | paint_post_children(const fastuidraw::reference_counted_ptr<fastuidraw::Painter> &) |
126 | {} |
127 |