1#include "PainterWidget.hpp"
2
3PainterWidget::
4PainterWidget(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
17PainterWidget::
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
37void
38PainterWidget::
39parent(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
56bool
57PainterWidget::
58is_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
69void
70PainterWidget::
71paint(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
118void
119PainterWidget::
120paint_pre_children(const fastuidraw::reference_counted_ptr<fastuidraw::Painter> &)
121{}
122
123void
124PainterWidget::
125paint_post_children(const fastuidraw::reference_counted_ptr<fastuidraw::Painter> &)
126{}
127