MyGUI 3.4.3
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
13namespace MyGUI
14{
15
17 {
18 mViewSize = RenderManager::getInstance().getViewSize();
19 }
20
22 {
23 if (!mChildItems.empty())
24 MYGUI_LOG(Critical, "Layer '" << getName() << "' must be empty before destroy");
25 }
26
28 {
29 mName = _node->findAttribute("name");
30 if (_version >= Version(1, 2))
31 {
32 MyGUI::xml::ElementEnumerator propert = _node->getElementEnumerator();
33 while (propert.next("Property"))
34 {
35 std::string_view key = propert->findAttribute("key");
36 std::string_view value = propert->findAttribute("value");
37 if (key == "Pick")
38 setPick(utility::parseValue<bool>(value));
39 }
40 }
41 else if (_version >= Version(1, 0))
42 {
43 setPick(utility::parseBool(_node->findAttribute("pick")));
44 }
45 else
46 {
47 setPick(utility::parseBool(_node->findAttribute("peek")));
48 }
49 }
50
52 {
53 mIsPick = _pick;
54 }
55
57 {
58 // создаем рутовый айтем
59 ILayerNode* node = new LayerNode(this);
60 mChildItems.push_back(node);
61
62 mOutOfDate = true;
63
64 return node;
65 }
66
68 {
69 // если есть отец, то русть сам и удаляет
70 ILayerNode* parent = _item->getParent();
71 if (parent)
72 {
73 parent->destroyChildItemNode(_item);
74
75 mOutOfDate = true;
76
77 return;
78 }
79
80 // айтем рутовый, мы удаляем
81 for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
82 {
83 if ((*iter) == _item)
84 {
85 delete _item;
86 mChildItems.erase(iter);
87
88 mOutOfDate = true;
89
90 return;
91 }
92 }
93
94 MYGUI_EXCEPT("item node not found");
95 }
96
98 {
99 // если есть отец, то пусть сам рулит
100 ILayerNode* parent = _item->getParent();
101 if (parent != nullptr)
102 {
103 parent->upChildItemNode(_item);
104
105 mOutOfDate = true;
106
107 return;
108 }
109
110 if ((2 > mChildItems.size()) || (mChildItems.back() == _item))
111 return;
112
113 for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
114 {
115 if ((*iter) == _item)
116 {
117 mChildItems.erase(iter);
118 mChildItems.push_back(_item);
119
120 mOutOfDate = true;
121
122 return;
123 }
124 }
125
126 MYGUI_EXCEPT("item node not found");
127 }
128
130 {
131 if (!mIsPick)
132 return nullptr;
133
134 VectorILayerNode::const_reverse_iterator iter = mChildItems.rbegin();
135 while (iter != mChildItems.rend())
136 {
137 ILayerItem* item = (*iter)->getLayerItemByPoint(_left, _top);
138 if (item != nullptr)
139 return item;
140 ++iter;
141 }
142 return nullptr;
143 }
144
146 {
147 return {_left, _top};
148 }
149
151 {
152 for (auto& childItem : mChildItems)
153 childItem->renderToTarget(_target, _update);
154
155 mOutOfDate = false;
156 }
157
159 {
160 for (auto& childItem : mChildItems)
161 childItem->resizeView(_viewSize);
162
164 }
165
167 {
169 }
170
172 {
173 return mChildItems.size();
174 }
175
177 {
178 MYGUI_ASSERT_RANGE(_index, mChildItems.size(), "OverlappedLayer::getLayerNodeAt");
179
180 return mChildItems[_index];
181 }
182
184 {
185 return mViewSize;
186 }
187
189 {
190 for (const auto& childItem : mChildItems)
191 {
192 if (static_cast<const LayerNode*>(childItem)->isOutOfDate())
193 return true;
194 }
195
196 return mOutOfDate;
197 }
198
199} // namespace MyGUI
#define MYGUI_EXCEPT(dest)
#define MYGUI_ASSERT_RANGE(index, size, owner)
#define MYGUI_LOG(level, text)
const std::string & getName() const
std::string mName
virtual ILayerItem * getLayerItemByPoint(int _left, int _top) const =0
bool isOutOfDate() const
const IntSize & getSize() const override
void deserialization(xml::ElementPtr _node, Version _version) override
EnumeratorILayerNode getEnumerator() const override
ILayerNode * getLayerNodeAt(size_t _index) const override
void resizeView(const IntSize &_viewSize) override
IntPoint getPosition(int _left, int _top) const override
ILayerItem * getLayerItemByPoint(int _left, int _top) const override
void destroyChildItemNode(ILayerNode *_item) override
ILayerNode * createChildItemNode() override
void renderToTarget(IRenderTarget *_target, bool _update) override
void upChildItemNode(ILayerNode *_item) override
size_t getLayerNodeCount() const override
static RenderManager & getInstance()
bool parseBool(std::string_view _value)
Enumerator< VectorILayerNode > EnumeratorILayerNode