MyGUI 3.4.3
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 {
16 mLayerItems.push_back(_item);
17 if (mLayerNode != nullptr)
18 {
19 _item->attachToLayerItemNode(mLayerNode, false);
20 }
21 }
22
24 {
25 VectorLayerItem::iterator item = std::remove(mLayerItems.begin(), mLayerItems.end(), _item);
26 MYGUI_ASSERT(item != mLayerItems.end(), "item not found");
27 mLayerItems.erase(item);
28 }
29
31 {
32 mLayerNodes.push_back(_item);
33 if (mLayerNode != nullptr)
34 {
35 // создаем оверлаппеду новый айтем
36 ILayerNode* child_node = mLayerNode->createChildItemNode();
37 _item->attachToLayerItemNode(child_node, true);
38 }
39 }
40
42 {
43 VectorLayerItem::iterator item = std::remove(mLayerNodes.begin(), mLayerNodes.end(), _item);
44 MYGUI_ASSERT(item != mLayerNodes.end(), "item not found");
45 mLayerNodes.erase(item);
46 }
47
49 {
50 mDrawItems.push_back(_item);
51 }
52
54 {
56 mDrawItems.clear();
57 }
58
60 {
61 if (mTexture == _texture)
62 return;
63
64 mTexture = _texture;
65 if (mLayerNode)
66 {
67 ILayerNode* node = mLayerNode;
68 // позже сделать детач без текста
70 attachToLayerItemNode(node, false);
71 }
72 }
73
75 {
76 mSaveLayerNode = mLayerNode;
77 }
78
80 {
81 mLayerNode = mSaveLayerNode;
82 if (mLayerNode)
83 {
84 attachToLayerItemNode(mLayerNode, false);
85 }
86 }
87
89 {
90 mLayer = _layer;
91 mLayerNode = _node;
92
93 attachToLayerItemNode(_node, true);
94 }
95
97 {
98 // мы уже отдетачены в доску
99 if (nullptr == mLayer)
100 return;
101
102 // такого быть не должно
103 MYGUI_ASSERT(mLayerNode, "mLayerNode == nullptr");
104
105 // отписываемся от пиккинга
106 mLayerNode->detachLayerItem(this);
107
108 // при детаче обнулиться
109 ILayerNode* save = mLayerNode;
110
111 // физически отсоединяем
113
114 // отсоединяем леер и обнуляем у рутового виджета
115 mLayer->destroyChildItemNode(save);
116 mLayerNode = nullptr;
117 mLayer = nullptr;
118 }
119
121 {
122 MyGUI::ILayerNode* node = mLayerNode;
123 while (node)
124 {
125 node->getLayer()->upChildItemNode(node);
126 node = node->getParent();
127 }
128 }
129
131 {
132 MYGUI_DEBUG_ASSERT(nullptr != _item, "attached item must be valid");
133
134 // сохраняем, чтобы последующие дети могли приаттачиться
135 mLayerNode = _item;
136
137 for (auto& drawItem : mDrawItems)
138 {
139 drawItem->createDrawItem(mTexture, _item);
140 }
141
142 for (auto& layerItem : mLayerItems)
143 {
144 layerItem->attachToLayerItemNode(_item, _deep);
145 }
146
147 for (auto& layerNode : mLayerNodes)
148 {
149 // создаем оверлаппеду новый айтем
150 if (_deep)
151 {
152 ILayerNode* child_node = _item->createChildItemNode();
153 layerNode->attachToLayerItemNode(child_node, _deep);
154 }
155 }
156 }
157
159 {
160 for (auto& layerItem : mLayerItems)
161 {
162 layerItem->detachFromLayerItemNode(_deep);
163 }
164
165 for (auto& layerNode : mLayerNodes)
166 {
167 if (_deep)
168 {
169 ILayerNode* node = layerNode->mLayerNode;
170 layerNode->detachFromLayerItemNode(_deep);
171 if (node)
172 {
173 node->getLayer()->destroyChildItemNode(node);
174 }
175 }
176 }
177
178 // мы уже отаттачены
179 ILayerNode* node = mLayerNode;
180 if (node)
181 {
182 for (auto& drawItem : mDrawItems)
183 {
184 drawItem->destroyDrawItem();
185 }
186
187 mLayerNode = nullptr;
188 }
189 }
190
192 {
193 return mLayer;
194 }
195
197 {
198 return mLayerNode;
199 }
200
201} // namespace MyGUI
#define MYGUI_ASSERT(exp, dest)
#define MYGUI_DEBUG_ASSERT(exp, dest)
virtual void upChildItemNode(ILayerNode *_item)=0
virtual void destroyChildItemNode(ILayerNode *_node)=0
virtual ILayerNode * getParent() const =0
virtual ILayer * getLayer() const =0
virtual ILayerNode * createChildItemNode()=0
void removeChildNode(LayerItem *_item)
ILayerNode * getLayerNode() const
void attachToLayerItemNode(ILayerNode *_item, bool _deep)
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)