MyGUI  3.2.0
MyGUI_OverlappedLayer.cpp
Go to the documentation of this file.
1 
6 /*
7  This file is part of MyGUI.
8 
9  MyGUI is free software: you can redistribute it and/or modify
10  it under the terms of the GNU Lesser General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  (at your option) any later version.
13 
14  MyGUI is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public License
20  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
21 */
22 
23 #include "MyGUI_Precompiled.h"
24 #include "MyGUI_LayerItem.h"
25 #include "MyGUI_OverlappedLayer.h"
26 #include "MyGUI_LayerNode.h"
27 #include "MyGUI_RenderManager.h"
28 
29 namespace MyGUI
30 {
31 
33  mIsPick(false),
34  mOutOfDate(false)
35  {
37  }
38 
40  {
41  MYGUI_ASSERT(mChildItems.empty(), "Layer '" << getName() << "' must be empty before destroy");
42  }
43 
45  {
46  mName = _node->findAttribute("name");
47  if (_version >= Version(1, 2))
48  {
50  while (propert.next("Property"))
51  {
52  const std::string& key = propert->findAttribute("key");
53  const std::string& value = propert->findAttribute("value");
54  if (key == "Pick")
55  mIsPick = utility::parseValue<bool>(value);
56  }
57  }
58  else if (_version >= Version(1, 0))
59  {
60  mIsPick = utility::parseBool(_node->findAttribute("pick"));
61  }
62  else
63  {
64  mIsPick = utility::parseBool(_node->findAttribute("peek"));
65  }
66  }
67 
69  {
70  // создаем рутовый айтем
71  ILayerNode* node = new LayerNode(this);
72  mChildItems.push_back(node);
73 
74  mOutOfDate = true;
75 
76  return node;
77  }
78 
80  {
81  // если есть отец, то русть сам и удаляет
82  ILayerNode* parent = _item->getParent();
83  if (parent)
84  {
85  parent->destroyChildItemNode(_item);
86 
87  mOutOfDate = true;
88 
89  return;
90  }
91 
92  // айтем рутовый, мы удаляем
93  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
94  {
95  if ((*iter) == _item)
96  {
97  delete _item;
98  mChildItems.erase(iter);
99 
100  mOutOfDate = true;
101 
102  return;
103  }
104  }
105 
106  MYGUI_EXCEPT("item node not found");
107  }
108 
110  {
111  // если есть отец, то пусть сам рулит
112  ILayerNode* parent = _item->getParent();
113  if (parent != nullptr)
114  {
115  parent->upChildItemNode(_item);
116 
117  mOutOfDate = true;
118 
119  return;
120  }
121 
122  if ((2 > mChildItems.size()) || (mChildItems.back() == _item))
123  return;
124 
125  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
126  {
127  if ((*iter) == _item)
128  {
129  mChildItems.erase(iter);
130  mChildItems.push_back(_item);
131 
132  mOutOfDate = true;
133 
134  return;
135  }
136  }
137 
138  MYGUI_EXCEPT("item node not found");
139  }
140 
142  {
143  if (!mIsPick)
144  return nullptr;
145 
146  VectorILayerNode::const_reverse_iterator iter = mChildItems.rbegin();
147  while (iter != mChildItems.rend())
148  {
149  ILayerItem* item = (*iter)->getLayerItemByPoint(_left, _top);
150  if (item != nullptr)
151  return item;
152  ++iter;
153  }
154  return nullptr;
155  }
156 
157  IntPoint OverlappedLayer::getPosition(int _left, int _top) const
158  {
159  return IntPoint(_left, _top);
160  }
161 
162  void OverlappedLayer::renderToTarget(IRenderTarget* _target, bool _update)
163  {
164  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
165  (*iter)->renderToTarget(_target, _update);
166 
167  mOutOfDate = false;
168  }
169 
170  void OverlappedLayer::resizeView(const IntSize& _viewSize)
171  {
172  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
173  (*iter)->resizeView(_viewSize);
174 
175  mViewSize = _viewSize;
176  }
177 
179  {
181  }
182 
184  {
185  return mViewSize;
186  }
187 
189  {
190  for (VectorILayerNode::const_iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
191  {
192  if (static_cast<const LayerNode*>(*iter)->isOutOfDate())
193  return true;
194  }
195 
196  return mOutOfDate;
197  }
198 
199 } // namespace MyGUI