MyGUI  3.2.1
MyGUI_OverlappedLayer.cpp
Go to the documentation of this file.
1 /*
2  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3  * Distributed under the MIT License
4  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5  */
6 
7 #include "MyGUI_Precompiled.h"
8 #include "MyGUI_LayerItem.h"
10 #include "MyGUI_LayerNode.h"
11 #include "MyGUI_RenderManager.h"
12 
13 namespace MyGUI
14 {
15 
17  mIsPick(false),
18  mOutOfDate(false)
19  {
21  }
22 
24  {
25  MYGUI_ASSERT(mChildItems.empty(), "Layer '" << getName() << "' must be empty before destroy");
26  }
27 
29  {
30  mName = _node->findAttribute("name");
31  if (_version >= Version(1, 2))
32  {
34  while (propert.next("Property"))
35  {
36  const std::string& key = propert->findAttribute("key");
37  const std::string& value = propert->findAttribute("value");
38  if (key == "Pick")
39  mIsPick = utility::parseValue<bool>(value);
40  }
41  }
42  else if (_version >= Version(1, 0))
43  {
44  mIsPick = utility::parseBool(_node->findAttribute("pick"));
45  }
46  else
47  {
48  mIsPick = utility::parseBool(_node->findAttribute("peek"));
49  }
50  }
51 
53  {
54  // создаем рутовый айтем
55  ILayerNode* node = new LayerNode(this);
56  mChildItems.push_back(node);
57 
58  mOutOfDate = true;
59 
60  return node;
61  }
62 
64  {
65  // если есть отец, то русть сам и удаляет
66  ILayerNode* parent = _item->getParent();
67  if (parent)
68  {
69  parent->destroyChildItemNode(_item);
70 
71  mOutOfDate = true;
72 
73  return;
74  }
75 
76  // айтем рутовый, мы удаляем
77  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
78  {
79  if ((*iter) == _item)
80  {
81  delete _item;
82  mChildItems.erase(iter);
83 
84  mOutOfDate = true;
85 
86  return;
87  }
88  }
89 
90  MYGUI_EXCEPT("item node not found");
91  }
92 
94  {
95  // если есть отец, то пусть сам рулит
96  ILayerNode* parent = _item->getParent();
97  if (parent != nullptr)
98  {
99  parent->upChildItemNode(_item);
100 
101  mOutOfDate = true;
102 
103  return;
104  }
105 
106  if ((2 > mChildItems.size()) || (mChildItems.back() == _item))
107  return;
108 
109  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
110  {
111  if ((*iter) == _item)
112  {
113  mChildItems.erase(iter);
114  mChildItems.push_back(_item);
115 
116  mOutOfDate = true;
117 
118  return;
119  }
120  }
121 
122  MYGUI_EXCEPT("item node not found");
123  }
124 
126  {
127  if (!mIsPick)
128  return nullptr;
129 
130  VectorILayerNode::const_reverse_iterator iter = mChildItems.rbegin();
131  while (iter != mChildItems.rend())
132  {
133  ILayerItem* item = (*iter)->getLayerItemByPoint(_left, _top);
134  if (item != nullptr)
135  return item;
136  ++iter;
137  }
138  return nullptr;
139  }
140 
141  IntPoint OverlappedLayer::getPosition(int _left, int _top) const
142  {
143  return IntPoint(_left, _top);
144  }
145 
146  void OverlappedLayer::renderToTarget(IRenderTarget* _target, bool _update)
147  {
148  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
149  (*iter)->renderToTarget(_target, _update);
150 
151  mOutOfDate = false;
152  }
153 
154  void OverlappedLayer::resizeView(const IntSize& _viewSize)
155  {
156  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
157  (*iter)->resizeView(_viewSize);
158 
159  mViewSize = _viewSize;
160  }
161 
163  {
165  }
166 
168  {
169  return mChildItems.size();
170  }
171 
173  {
174  MYGUI_ASSERT_RANGE(_index, mChildItems.size(), "OverlappedLayer::getLayerNodeAt");
175 
176  return mChildItems[_index];
177  }
178 
180  {
181  return mViewSize;
182  }
183 
185  {
186  for (VectorILayerNode::const_iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
187  {
188  if (static_cast<const LayerNode*>(*iter)->isOutOfDate())
189  return true;
190  }
191 
192  return mOutOfDate;
193  }
194 
195 } // namespace MyGUI