15 #include "../table/sprites.h" |
15 #include "../table/sprites.h" |
16 #include "../genworld.h" |
16 #include "../genworld.h" |
17 #include "../helpers.hpp" |
17 #include "../helpers.hpp" |
18 #include "window_events.hpp" |
18 #include "window_events.hpp" |
19 |
19 |
|
20 #include <algorithm> |
|
21 |
20 namespace gui { |
22 namespace gui { |
21 |
23 |
22 |
24 |
23 void CompositeWidget::AddWidget(Widget *wd) |
25 void CompositeWidget::AddWidget(Widget *wi) |
24 { |
26 { |
25 WidgetId id = wd->GetId(); |
27 Widgets::value_type new_slot = {wi, 0}; |
26 std::pair<WidgetIterator, bool> pib = m_widgets.insert(Widgets::value_type(id, wd)); |
28 m_widgets.push_back(new_slot); |
27 assert(pib.second); |
29 } |
|
30 |
|
31 CompositeWidget::WidgetIterator CompositeWidget::FindWidget(WidgetId id) |
|
32 { |
|
33 /* iterate through children */ |
|
34 for (WidgetIterator it = m_widgets.begin(); it != m_widgets.end(); ++it) { |
|
35 /* get child */ |
|
36 Slot &child = (*it); |
|
37 /* check its id */ |
|
38 if (child.m_wi == NULL || child.m_wi->m_id != id) continue; |
|
39 return it; |
|
40 } |
|
41 return m_widgets.end(); |
28 } |
42 } |
29 |
43 |
30 Widget* CompositeWidget::GetWidget(WidgetId id) |
44 Widget* CompositeWidget::GetWidget(WidgetId id) |
31 { |
45 { |
32 WidgetIterator it = m_widgets.find(id); |
46 WidgetIterator it = FindWidget(id); |
33 return (it != m_widgets.end()) ? (*it).second : NULL; |
47 return it != m_widgets.end() ? (*it).m_wi : NULL; |
34 } |
48 } |
35 |
49 |
36 Widget* CompositeWidget::RemoveWidget(WidgetId id) |
50 Widget* CompositeWidget::RemoveWidget(WidgetId id) |
37 { |
51 { |
38 WidgetIterator it = m_widgets.find(id); |
52 WidgetIterator it = FindWidget(id); |
39 if (it == m_widgets.end()) return NULL; |
53 if (it == m_widgets.end()) return NULL; |
40 Widget *wd = (*it).second; |
54 Widget *wd = (*it).m_wi; |
41 assert(wd->m_container == this); |
55 assert(wd->m_container == this); |
42 wd->m_container = NULL; |
56 wd->m_container = NULL; |
43 m_widgets.erase(it); |
57 m_widgets.erase(it); |
44 return wd; |
58 return wd; |
45 } |
59 } |
48 { |
62 { |
49 Point16 pt_local = pt_parent - TopLeft(); |
63 Point16 pt_local = pt_parent - TopLeft(); |
50 bool inside_me = m_rect.PtInRect(pt_parent); |
64 bool inside_me = m_rect.PtInRect(pt_parent); |
51 for (WidgetReverseIterator rit = m_widgets.rbegin(); rit != m_widgets.rend(); ++rit) { |
65 for (WidgetReverseIterator rit = m_widgets.rbegin(); rit != m_widgets.rend(); ++rit) { |
52 /* get next child */ |
66 /* get next child */ |
53 Widget *wd_child = (*rit).second; |
67 Widget *wd_child = (*rit).m_wi; |
54 /* ask the child recursively */ |
68 /* ask the child recursively */ |
55 Widget *wd = wd_child->WidgetFromPt(pt_local); |
69 Widget *wd = wd_child->WidgetFromPt(pt_local); |
56 if (wd != NULL) { |
70 if (wd != NULL) { |
57 /* if the widget we found is inside me it is what we are searching for */ |
71 /* if the widget we found is inside me it is what we are searching for */ |
58 if (inside_me) return wd; |
72 if (inside_me) return wd; |
69 /* mark all children as closed in safe way */ |
83 /* mark all children as closed in safe way */ |
70 for (WidgetReverseIterator rit_next = m_widgets.rbegin(); rit_next != m_widgets.rend(); ) { |
84 for (WidgetReverseIterator rit_next = m_widgets.rbegin(); rit_next != m_widgets.rend(); ) { |
71 /* save the iterator (it can be invalidated) and move forward */ |
85 /* save the iterator (it can be invalidated) and move forward */ |
72 WidgetReverseIterator rit = rit_next++; |
86 WidgetReverseIterator rit = rit_next++; |
73 /* get child */ |
87 /* get child */ |
74 Widget *wd_child = (*rit).second; |
88 Widget *wd_child = (*rit).m_wi; |
75 /* tell him we are closing */ |
89 /* tell him we are closing */ |
76 wd_child->Close(); |
90 wd_child->Close(); |
77 } |
91 } |
78 /* remove children */ |
92 /* remove children */ |
79 m_widgets.clear(); |
93 m_widgets.clear(); |
91 /* notify all children that we are creating */ |
105 /* notify all children that we are creating */ |
92 for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) { |
106 for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) { |
93 /* save the iterator (it can be invalidated) and move forward */ |
107 /* save the iterator (it can be invalidated) and move forward */ |
94 WidgetIterator it = it_next++; |
108 WidgetIterator it = it_next++; |
95 /* get child */ |
109 /* get child */ |
96 Widget *wd_child = (*it).second; |
110 Widget *wd_child = (*it).m_wi; |
97 /* tell him we are creating window */ |
111 /* tell him we are creating window */ |
98 wd_child->OnCreate(ev); |
112 wd_child->OnCreate(ev); |
99 } |
113 } |
100 |
114 |
101 super::OnCreate(ev); |
115 super::OnCreate(ev); |
109 /* paint all children */ |
123 /* paint all children */ |
110 for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) { |
124 for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) { |
111 /* save the iterator (it can be invalidated) and move forward */ |
125 /* save the iterator (it can be invalidated) and move forward */ |
112 WidgetIterator it = it_next++; |
126 WidgetIterator it = it_next++; |
113 /* get child */ |
127 /* get child */ |
114 Widget *wd_child = (*it).second; |
128 Widget *wd_child = (*it).m_wi; |
115 /* tell him we are painting */ |
129 /* tell him we are painting */ |
116 ClipDrawContext ctx(wd_child->Left(), wd_child->Top(), wd_child->Width(), wd_child->Height()); |
130 ClipDrawContext ctx(wd_child->Left(), wd_child->Top(), wd_child->Width(), wd_child->Height()); |
117 if (!ctx.IsEmpty()) wd_child->OnPaint(ev); |
131 if (!ctx.IsEmpty()) wd_child->OnPaint(ev); |
118 } |
132 } |
119 } |
133 } |
148 /* notify all children */ |
162 /* notify all children */ |
149 for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) { |
163 for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) { |
150 /* save the iterator (it can be invalidated) and move forward */ |
164 /* save the iterator (it can be invalidated) and move forward */ |
151 WidgetIterator it = it_next++; |
165 WidgetIterator it = it_next++; |
152 /* get child */ |
166 /* get child */ |
153 Widget *wd_child = (*it).second; |
167 Widget *wd_child = (*it).m_wi; |
154 /* tell him we are resizing */ |
168 /* tell him we are resizing */ |
155 wd_child->OnResizeParent(evp); |
169 wd_child->OnResizeParent(evp); |
156 } |
170 } |
157 super::OnResize(ev); |
171 super::OnResize(ev); |
158 } |
172 } |