MyGUI  3.0.1
MyGUI_LayerItem.cpp
Go to the documentation of this file.
1 
7 /*
8  This file is part of MyGUI.
9 
10  MyGUI is free software: you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  MyGUI is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22 */
23 #include "MyGUI_Precompiled.h"
24 #include "MyGUI_LayerItem.h"
25 #include <algorithm>
26 
27 namespace MyGUI
28 {
29 
31  mLayer(nullptr),
32  mLayerNode(nullptr),
33  mSaveLayerNode(nullptr),
34  mTexture(nullptr)
35  {
36  }
37 
39  {
40  mLayerItems.push_back(_item);
41  if (mLayerNode != nullptr)
42  {
43  _item->attachToLayerItemNode(mLayerNode, false);
44  }
45  }
46 
48  {
49  VectorLayerItem::iterator item = std::remove(mLayerItems.begin(), mLayerItems.end(), _item);
50  MYGUI_ASSERT(item != mLayerItems.end(), "item not found");
51  mLayerItems.erase(item);
52  }
53 
55  {
56  mLayerNodes.push_back(_item);
57  if (mLayerNode != nullptr)
58  {
59  // создаем оверлаппеду новый айтем
60  ILayerNode* child_node = mLayerNode->createChildItemNode();
61  _item->attachToLayerItemNode(child_node, true);
62  }
63  }
64 
66  {
67  VectorLayerItem::iterator item = std::remove(mLayerNodes.begin(), mLayerNodes.end(), _item);
68  MYGUI_ASSERT(item != mLayerNodes.end(), "item not found");
69  mLayerNodes.erase(item);
70  }
71 
73  {
74  mDrawItems.push_back(_item);
75  }
76 
78  {
80  mDrawItems.clear();
81  }
82 
84  {
85  mTexture = _texture;
86  if (mLayerNode)
87  {
88  ILayerNode* node = mLayerNode;
89  // позже сделать детач без текста
91  attachToLayerItemNode(node, false);
92  }
93  }
94 
96  {
97  mSaveLayerNode = mLayerNode;
98  }
99 
101  {
102  mLayerNode = mSaveLayerNode;
103  if (mLayerNode)
104  {
105  attachToLayerItemNode(mLayerNode, false);
106  }
107  }
108 
110  {
111  mLayer = _layer;
112  mLayerNode = _node;
113 
114  attachToLayerItemNode(_node, true);
115  }
116 
118  {
119  // мы уже отдетачены в доску
120  if (nullptr == mLayer) return;
121 
122  // такого быть не должно
123  MYGUI_ASSERT(mLayerNode, "_item->mLayerNode == nullptr");
124 
125  // отписываемся от пиккинга
126  mLayerNode->detachLayerItem(this);
127 
128  // при детаче обнулиться
129  ILayerNode * save = mLayerNode;
130 
131  // физически отсоединяем
133 
134  // отсоединяем леер и обнуляем у рутового виджета
135  mLayer->destroyChildItemNode(save);
136  mLayerNode = nullptr;
137  mLayer = nullptr;
138  }
139 
141  {
142  if (mLayerNode) mLayerNode->getLayer()->upChildItemNode(mLayerNode);
143  }
144 
146  {
147  MYGUI_DEBUG_ASSERT(nullptr != _item, "attached item must be valid");
148 
149  // сохраняем, чтобы последующие дети могли приаттачиться
150  mLayerNode = _item;
151 
152  for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
153  {
154  (*skin)->createDrawItem(mTexture, _item);
155  }
156 
157  for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item)
158  {
159  (*item)->attachToLayerItemNode(_item, _deep);
160  }
161 
162  for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item)
163  {
164  // создаем оверлаппеду новый айтем
165  if (_deep)
166  {
167  ILayerNode* child_node = _item->createChildItemNode();
168  (*item)->attachToLayerItemNode(child_node, _deep);
169  }
170  }
171  }
172 
174  {
175  for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item)
176  {
177  (*item)->detachFromLayerItemNode(_deep);
178  }
179 
180  for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item)
181  {
182  if (_deep)
183  {
184  ILayerNode* node = (*item)->mLayerNode;
185  (*item)->detachFromLayerItemNode(_deep);
186  if (node)
187  {
188  node->getLayer()->destroyChildItemNode(node);
189  }
190  }
191  }
192 
193  // мы уже отаттачены
194  ILayerNode* node = mLayerNode;
195  if (node)
196  {
197  //for (VectorWidgetPtr::iterator widget = mWidgetChildSkin.begin(); widget != mWidgetChildSkin.end(); ++widget) (*widget)->_detachFromLayerItemKeeperByStyle(_deep);
198  for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
199  {
200  (*skin)->destroyDrawItem();
201  }
202 
203  // при глубокой очистке, если мы оверлаппед, то для нас создавали айтем
204  /*if (_deep && !this->isRootWidget() && mWidgetStyle == WidgetStyle::Overlapped)
205  {
206  node->destroyItemNode();
207  }*/
208  // очищаем
209  mLayerNode = nullptr;
210  }
211  }
212 
213 } // namespace MyGUI