WoW Model Viewer
Your premiere tool for viewing, equipping and animating World of Warcraft models.
Loading...
Searching...
No Matches
Container.h
Go to the documentation of this file.
1#pragma once
2
3#include <unordered_set>
4#include "Component.h"
5#include <vector>
6
11template <class DataType>
12class Container : public Component
13{
14public:
15 typedef typename std::unordered_set<DataType*>::iterator iterator;
16
18 virtual ~Container();
19
20 virtual bool addChild(DataType* child);
21 virtual bool removeChild(DataType* child);
23
24 virtual void onChildAdded(DataType*)
25 {
26 };
27
28 virtual void onChildRemoved(DataType*)
29 {
30 };
31
32 template <class ChildType>
34
35 unsigned int nbChildren() const { return static_cast<unsigned int>(m_children.size()); }
36
37 bool findChildComponent(Component* child, bool recursive = false);
38 Component* getChild(unsigned int index);
39 const Component* getChild(unsigned int index) const;
40
42 {
43 return m_children.begin();
44 }
45
47 {
48 return m_children.end();
49 }
50
51private:
52 std::unordered_set<DataType*> m_children;
53};
54
55template <class DataType>
57{
58 m_children.clear();
59 setName("Container");
60}
61
62template <class DataType>
64{
65 typename std::unordered_set<DataType*>::iterator l_it;
66 for (l_it = m_children.begin(); l_it != m_children.end(); ++l_it)
67 {
68 (*l_it)->unref();
69 }
70}
71
72template <class DataType>
73bool Container<DataType>::addChild(DataType* child)
74{
75 m_children.insert(child);
76
77 child->setParentComponent(this);
78
79 // for hierarchy notification
80 onChildAdded(child);
81
82 return true;
83}
84
85template <class DataType>
87{
88 // ok, we remove this child from the list
89 m_children.erase(child);
90 child->setParentComponent(0);
91
92 // for hierarchy notification
93 onChildRemoved(child);
94
95 child->unref();
96 return true;
97}
98
99template <class DataType>
101{
102 while (!m_children.empty())
103 {
104 removeChild(*m_children.begin());
105 }
106}
107
108template <class DataType>
109template <class ChildType>
111{
112 std::vector<DataType*> l_childrenToRemove;
113 for (auto& child : m_children)
114 {
115 if (dynamic_cast<ChildType*>(child) != nullptr)
116 {
117 l_childrenToRemove.push_back(child);
118 }
119 }
120
121 const int l_result = l_childrenToRemove.size();
122
123 for (auto& child : l_childrenToRemove)
124 {
125 removeChild(child);
126 }
127
128 return l_result;
129}
130
131template <class DataType>
132bool Container<DataType>::findChildComponent(Component* child, bool recursive /* = false */)
133{
134 auto l_it = m_children.find(dynamic_cast<DataType*>(child));
135
136 if (l_it != m_children.end())
137 return true;
138
139 // resursive part
140 if (recursive)
141 {
142 auto l_itEnd = m_children.end();
143 for (l_it = m_children.begin(); l_it != l_itEnd; ++l_it)
144 {
145 if ((*l_it)->findChildComponent(child, recursive))
146 return true;
147 }
148 }
149
150 return false;
151}
152
153template <class DataType>
155{
156 DataType* l_p_result = nullptr;
157 if (index < m_children.size())
158 {
159 unsigned int l_index = 0;
160 typename std::unordered_set<DataType*>::iterator l_it;
161 for (l_it = m_children.begin(); l_index < index; l_index++)
162 {
163 ++l_it;
164 }
165 l_p_result = *l_it;
166 }
167 return l_p_result;
168}
169
170template <class DataType>
171const Component* Container<DataType>::getChild(unsigned int index) const
172{
173 const DataType* l_p_result = nullptr;
174 if (index < m_children.size())
175 {
176 unsigned int l_index = 0;
177 typename std::unordered_set<DataType*>::const_iterator l_it;
178 for (l_it = m_children.begin(); l_index < index; l_index++)
179 {
180 ++l_it;
181 }
182 l_p_result = *l_it;
183 }
184 return l_p_result;
185}
Base class for all scene-graph nodes in the component hierarchy.
Definition Component.h:11
Generic typed container that manages a set of child Component pointers.
Definition Container.h:13
unsigned int nbChildren() const
Definition Container.h:35
bool findChildComponent(Component *child, bool recursive=false)
Definition Container.h:132
iterator begin()
Definition Container.h:41
std::unordered_set< DataType * > m_children
Definition Container.h:52
virtual bool addChild(DataType *child)
Definition Container.h:73
const Component * getChild(unsigned int index) const
Definition Container.h:171
iterator end()
Definition Container.h:46
virtual ~Container()
Definition Container.h:63
virtual void onChildAdded(DataType *)
Definition Container.h:24
int removeAllChildrenOfType()
Definition Container.h:110
std::unordered_set< DataType * >::iterator iterator
Definition Container.h:15
Component * getChild(unsigned int index)
Definition Container.h:154
void removeAllChildren()
Definition Container.h:100
virtual bool removeChild(DataType *child)
Definition Container.h:86
virtual void onChildRemoved(DataType *)
Definition Container.h:28