MyGUI  3.4.0
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  setPick(utility::parseValue<bool>(value));
40  }
41  }
42  else if (_version >= Version(1, 0))
43  {
44  setPick(utility::parseBool(_node->findAttribute("pick")));
45  }
46  else
47  {
48  setPick(utility::parseBool(_node->findAttribute("peek")));
49  }
50  }
51 
52  void OverlappedLayer::setPick(bool _pick)
53  {
54  mIsPick = _pick;
55  }
56 
58  {
59  // создаем рутовый айтем
60  ILayerNode* node = new LayerNode(this);
61  mChildItems.push_back(node);
62 
63  mOutOfDate = true;
64 
65  return node;
66  }
67 
69  {
70  // если есть отец, то русть сам и удаляет
71  ILayerNode* parent = _item->getParent();
72  if (parent)
73  {
74  parent->destroyChildItemNode(_item);
75 
76  mOutOfDate = true;
77 
78  return;
79  }
80 
81  // айтем рутовый, мы удаляем
82  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
83  {
84  if ((*iter) == _item)
85  {
86  delete _item;
87  mChildItems.erase(iter);
88 
89  mOutOfDate = true;
90 
91  return;
92  }
93  }
94 
95  MYGUI_EXCEPT("item node not found");
96  }
97 
99  {
100  // если есть отец, то пусть сам рулит
101  ILayerNode* parent = _item->getParent();
102  if (parent != nullptr)
103  {
104  parent->upChildItemNode(_item);
105 
106  mOutOfDate = true;
107 
108  return;
109  }
110 
111  if ((2 > mChildItems.size()) || (mChildItems.back() == _item))
112  return;
113 
114  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
115  {
116  if ((*iter) == _item)
117  {
118  mChildItems.erase(iter);
119  mChildItems.push_back(_item);
120 
121  mOutOfDate = true;
122 
123  return;
124  }
125  }
126 
127  MYGUI_EXCEPT("item node not found");
128  }
129 
131  {
132  if (!mIsPick)
133  return nullptr;
134 
135  VectorILayerNode::const_reverse_iterator iter = mChildItems.rbegin();
136  while (iter != mChildItems.rend())
137  {
138  ILayerItem* item = (*iter)->getLayerItemByPoint(_left, _top);
139  if (item != nullptr)
140  return item;
141  ++iter;
142  }
143  return nullptr;
144  }
145 
146  IntPoint OverlappedLayer::getPosition(int _left, int _top) const
147  {
148  return IntPoint(_left, _top);
149  }
150 
151  void OverlappedLayer::renderToTarget(IRenderTarget* _target, bool _update)
152  {
153  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
154  (*iter)->renderToTarget(_target, _update);
155 
156  mOutOfDate = false;
157  }
158 
159  void OverlappedLayer::resizeView(const IntSize& _viewSize)
160  {
161  for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
162  (*iter)->resizeView(_viewSize);
163 
164  mViewSize = _viewSize;
165  }
166 
168  {
170  }
171 
173  {
174  return mChildItems.size();
175  }
176 
178  {
179  MYGUI_ASSERT_RANGE(_index, mChildItems.size(), "OverlappedLayer::getLayerNodeAt");
180 
181  return mChildItems[_index];
182  }
183 
185  {
186  return mViewSize;
187  }
188 
190  {
191  for (VectorILayerNode::const_iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
192  {
193  if (static_cast<const LayerNode*>(*iter)->isOutOfDate())
194  return true;
195  }
196 
197  return mOutOfDate;
198  }
199 
200 } // namespace MyGUI
MyGUI::Singleton< RenderManager >::getInstance
static RenderManager & getInstance()
Definition: MyGUI_Singleton.h:44
MyGUI::ILayerItem::getLayerItemByPoint
virtual ILayerItem * getLayerItemByPoint(int _left, int _top) const =0
MyGUI::OverlappedLayer::destroyChildItemNode
void destroyChildItemNode(ILayerNode *_node) override
Definition: MyGUI_OverlappedLayer.cpp:68
MyGUI::OverlappedLayer::getPosition
IntPoint getPosition(int _left, int _top) const override
Definition: MyGUI_OverlappedLayer.cpp:146
MyGUI::utility::parseBool
bool parseBool(const std::string &_value)
Definition: MyGUI_StringUtility.h:189
MyGUI::OverlappedLayer::deserialization
void deserialization(xml::ElementPtr _node, Version _version) override
Definition: MyGUI_OverlappedLayer.cpp:28
MYGUI_ASSERT_RANGE
#define MYGUI_ASSERT_RANGE(index, size, owner)
Definition: MyGUI_Diagnostic.h:45
MyGUI::ILayerNode::getParent
virtual ILayerNode * getParent() const =0
MyGUI::OverlappedLayer::isOutOfDate
bool isOutOfDate() const
Definition: MyGUI_OverlappedLayer.cpp:189
MyGUI::ILayerNode
Definition: MyGUI_ILayerNode.h:30
MyGUI::OverlappedLayer::mViewSize
IntSize mViewSize
Definition: MyGUI_OverlappedLayer.h:63
MyGUI::OverlappedLayer::createChildItemNode
ILayerNode * createChildItemNode() override
Definition: MyGUI_OverlappedLayer.cpp:57
MyGUI::OverlappedLayer::resizeView
void resizeView(const IntSize &_viewSize) override
Definition: MyGUI_OverlappedLayer.cpp:159
MyGUI_LayerItem.h
MyGUI::OverlappedLayer::upChildItemNode
void upChildItemNode(ILayerNode *_node) override
Definition: MyGUI_OverlappedLayer.cpp:98
MyGUI::types::TPoint< int >
MyGUI::ILayer::mName
std::string mName
Definition: MyGUI_ILayer.h:67
MyGUI::OverlappedLayer::getEnumerator
EnumeratorILayerNode getEnumerator() const override
Definition: MyGUI_OverlappedLayer.cpp:167
MyGUI::OverlappedLayer::getLayerNodeCount
size_t getLayerNodeCount() const override
Definition: MyGUI_OverlappedLayer.cpp:172
MyGUI_LayerNode.h
MyGUI::OverlappedLayer::OverlappedLayer
OverlappedLayer()
Definition: MyGUI_OverlappedLayer.cpp:16
MyGUI::xml::Element
Definition: MyGUI_XmlDocument.h:159
MyGUI::ILayerNode::upChildItemNode
virtual void upChildItemNode(ILayerNode *_node)=0
MyGUI::LayerNode
Definition: MyGUI_LayerNode.h:24
MyGUI::xml::Element::findAttribute
bool findAttribute(const std::string &_name, std::string &_value)
Definition: MyGUI_XmlDocument.cpp:246
MyGUI::OverlappedLayer::getLayerNodeAt
ILayerNode * getLayerNodeAt(size_t _index) const override
Definition: MyGUI_OverlappedLayer.cpp:177
MyGUI_Precompiled.h
MyGUI::OverlappedLayer::getLayerItemByPoint
ILayerItem * getLayerItemByPoint(int _left, int _top) const override
Definition: MyGUI_OverlappedLayer.cpp:130
MyGUI::Version
Definition: MyGUI_Version.h:18
MyGUI::OverlappedLayer::mOutOfDate
bool mOutOfDate
Definition: MyGUI_OverlappedLayer.h:62
MYGUI_EXCEPT
#define MYGUI_EXCEPT(dest)
Definition: MyGUI_Diagnostic.h:26
MyGUI::xml::ElementEnumerator
Definition: MyGUI_XmlDocument.h:115
MYGUI_ASSERT
#define MYGUI_ASSERT(exp, dest)
Definition: MyGUI_Diagnostic.h:34
MyGUI::OverlappedLayer::renderToTarget
void renderToTarget(IRenderTarget *_target, bool _update) override
Definition: MyGUI_OverlappedLayer.cpp:151
MyGUI_OverlappedLayer.h
MyGUI::LayerNode::isOutOfDate
bool isOutOfDate() const
Definition: MyGUI_LayerNode.cpp:322
MyGUI::Enumerator
Definition: MyGUI_Enumerator.h:49
MyGUI::types::TSize< int >
MyGUI::OverlappedLayer::getSize
const IntSize & getSize() const override
Definition: MyGUI_OverlappedLayer.cpp:184
MyGUI_RenderManager.h
MyGUI::RenderManager::getViewSize
virtual const IntSize & getViewSize() const =0
MyGUI::OverlappedLayer::~OverlappedLayer
~OverlappedLayer() override
Definition: MyGUI_OverlappedLayer.cpp:23
MyGUI::IntPoint
types::TPoint< int > IntPoint
Definition: MyGUI_Types.h:26
MyGUI::OverlappedLayer::setPick
void setPick(bool _pick)
Definition: MyGUI_OverlappedLayer.cpp:52
MyGUI::xml::Element::getElementEnumerator
ElementEnumerator getElementEnumerator()
Definition: MyGUI_XmlDocument.cpp:352
MyGUI
Definition: MyGUI_ActionController.h:15
MyGUI::xml::ElementEnumerator::next
bool next()
Definition: MyGUI_XmlDocument.cpp:100
MyGUI::OverlappedLayer::mIsPick
bool mIsPick
Definition: MyGUI_OverlappedLayer.h:60
MyGUI::ILayerItem
Definition: MyGUI_ILayerItem.h:20
MyGUI::IRenderTarget
Definition: MyGUI_IRenderTarget.h:21
MyGUI::ILayer::getName
const std::string & getName() const
Definition: MyGUI_ILayer.h:29
MyGUI::OverlappedLayer::mChildItems
VectorILayerNode mChildItems
Definition: MyGUI_OverlappedLayer.h:61
MyGUI::EnumeratorILayerNode
Enumerator< VectorILayerNode > EnumeratorILayerNode
Definition: MyGUI_ILayerNode.h:26
MyGUI::ILayerNode::destroyChildItemNode
virtual void destroyChildItemNode(ILayerNode *_node)=0