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