MyGUI 3.4.1
MyGUI_LayerItem.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"
9#include <algorithm>
10
11namespace MyGUI
12{
13
15 mLayer(nullptr),
16 mLayerNode(nullptr),
17 mSaveLayerNode(nullptr),
18 mTexture(nullptr)
19 {
20 }
21
23 {
24 mLayerItems.push_back(_item);
25 if (mLayerNode != nullptr)
26 {
27 _item->attachToLayerItemNode(mLayerNode, false);
28 }
29 }
30
32 {
33 VectorLayerItem::iterator item = std::remove(mLayerItems.begin(), mLayerItems.end(), _item);
34 MYGUI_ASSERT(item != mLayerItems.end(), "item not found");
35 mLayerItems.erase(item);
36 }
37
39 {
40 mLayerNodes.push_back(_item);
41 if (mLayerNode != nullptr)
42 {
43 // создаем оверлаппеду новый айтем
44 ILayerNode* child_node = mLayerNode->createChildItemNode();
45 _item->attachToLayerItemNode(child_node, true);
46 }
47 }
48
50 {
51 VectorLayerItem::iterator item = std::remove(mLayerNodes.begin(), mLayerNodes.end(), _item);
52 MYGUI_ASSERT(item != mLayerNodes.end(), "item not found");
53 mLayerNodes.erase(item);
54 }
55
57 {
58 mDrawItems.push_back(_item);
59 }
60
62 {
64 mDrawItems.clear();
65 }
66
68 {
69 if (mTexture == _texture)
70 return;
71
72 mTexture = _texture;
73 if (mLayerNode)
74 {
75 ILayerNode* node = mLayerNode;
76 // позже сделать детач без текста
78 attachToLayerItemNode(node, false);
79 }
80 }
81
83 {
84 mSaveLayerNode = mLayerNode;
85 }
86
88 {
89 mLayerNode = mSaveLayerNode;
90 if (mLayerNode)
91 {
92 attachToLayerItemNode(mLayerNode, false);
93 }
94 }
95
97 {
98 mLayer = _layer;
99 mLayerNode = _node;
100
101 attachToLayerItemNode(_node, true);
102 }
103
105 {
106 // мы уже отдетачены в доску
107 if (nullptr == mLayer)
108 return;
109
110 // такого быть не должно
111 MYGUI_ASSERT(mLayerNode, "mLayerNode == nullptr");
112
113 // отписываемся от пиккинга
114 mLayerNode->detachLayerItem(this);
115
116 // при детаче обнулиться
117 ILayerNode* save = mLayerNode;
118
119 // физически отсоединяем
121
122 // отсоединяем леер и обнуляем у рутового виджета
123 mLayer->destroyChildItemNode(save);
124 mLayerNode = nullptr;
125 mLayer = nullptr;
126 }
127
129 {
130 MyGUI::ILayerNode* node = mLayerNode;
131 while (node)
132 {
133 node->getLayer()->upChildItemNode(node);
134 node = node->getParent();
135 }
136 }
137
139 {
140 MYGUI_DEBUG_ASSERT(nullptr != _item, "attached item must be valid");
141
142 // сохраняем, чтобы последующие дети могли приаттачиться
143 mLayerNode = _item;
144
145 for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
146 {
147 (*skin)->createDrawItem(mTexture, _item);
148 }
149
150 for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item)
151 {
152 (*item)->attachToLayerItemNode(_item, _deep);
153 }
154
155 for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item)
156 {
157 // создаем оверлаппеду новый айтем
158 if (_deep)
159 {
160 ILayerNode* child_node = _item->createChildItemNode();
161 (*item)->attachToLayerItemNode(child_node, _deep);
162 }
163 }
164 }
165
167 {
168 for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item)
169 {
170 (*item)->detachFromLayerItemNode(_deep);
171 }
172
173 for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item)
174 {
175 if (_deep)
176 {
177 ILayerNode* node = (*item)->mLayerNode;
178 (*item)->detachFromLayerItemNode(_deep);
179 if (node)
180 {
181 node->getLayer()->destroyChildItemNode(node);
182 }
183 }
184 }
185
186 // мы уже отаттачены
187 ILayerNode* node = mLayerNode;
188 if (node)
189 {
190 //for (VectorWidgetPtr::iterator widget = mWidgetChildSkin.begin(); widget != mWidgetChildSkin.end(); ++widget) (*widget)->_detachFromLayerItemKeeperByStyle(_deep);
191 for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
192 {
193 (*skin)->destroyDrawItem();
194 }
195
196 // при глубокой очистке, если мы оверлаппед, то для нас создавали айтем
197 /*if (_deep && !this->isRootWidget() && mWidgetStyle == WidgetStyle::Overlapped)
198 {
199 node->destroyItemNode();
200 }*/
201 // очищаем
202 mLayerNode = nullptr;
203 }
204 }
205
207 {
208 return mLayer;
209 }
210
212 {
213 return mLayerNode;
214 }
215
216} // namespace MyGUI
#define MYGUI_ASSERT(exp, dest)
#define MYGUI_DEBUG_ASSERT(exp, dest)
virtual void upChildItemNode(ILayerNode *_node)=0
virtual void destroyChildItemNode(ILayerNode *_node)=0
virtual ILayerNode * getParent() const =0
virtual void detachLayerItem(ILayerItem *_root)=0
virtual ILayer * getLayer() const =0
virtual ILayerNode * createChildItemNode()=0
void removeChildNode(LayerItem *_item)
ILayerNode * getLayerNode() const
void detachFromLayerItemNode(bool _deep)
void addChildItem(LayerItem *_item)
void addChildNode(LayerItem *_item)
void removeChildItem(LayerItem *_item)
ILayer * getLayer() const
void addRenderItem(ISubWidget *_item)
void detachFromLayer() override
void upLayerItem() override
void attachItemToNode(ILayer *_layer, ILayerNode *_node) override
void setRenderItemTexture(ITexture *_texture)
void attachToLayerItemNode(ILayerNode *_node, bool _deep)