MyGUI  3.2.1
MyGUI_LayerItem.cpp
Go to the documentation of this file.
00001 /*
00002  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
00003  * Distributed under the MIT License
00004  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
00005  */
00006 
00007 #include "MyGUI_Precompiled.h"
00008 #include "MyGUI_LayerItem.h"
00009 #include <algorithm>
00010 
00011 namespace MyGUI
00012 {
00013 
00014     LayerItem::LayerItem() :
00015         mLayer(nullptr),
00016         mLayerNode(nullptr),
00017         mSaveLayerNode(nullptr),
00018         mTexture(nullptr)
00019     {
00020     }
00021 
00022     LayerItem::~LayerItem()
00023     {
00024     }
00025 
00026     void LayerItem::addChildItem(LayerItem* _item)
00027     {
00028         mLayerItems.push_back(_item);
00029         if (mLayerNode != nullptr)
00030         {
00031             _item->attachToLayerItemNode(mLayerNode, false);
00032         }
00033     }
00034 
00035     void LayerItem::removeChildItem(LayerItem* _item)
00036     {
00037         VectorLayerItem::iterator item = std::remove(mLayerItems.begin(), mLayerItems.end(), _item);
00038         MYGUI_ASSERT(item != mLayerItems.end(), "item not found");
00039         mLayerItems.erase(item);
00040     }
00041 
00042     void LayerItem::addChildNode(LayerItem* _item)
00043     {
00044         mLayerNodes.push_back(_item);
00045         if (mLayerNode != nullptr)
00046         {
00047             // создаем оверлаппеду новый айтем
00048             ILayerNode* child_node = mLayerNode->createChildItemNode();
00049             _item->attachToLayerItemNode(child_node, true);
00050         }
00051     }
00052 
00053     void LayerItem::removeChildNode(LayerItem* _item)
00054     {
00055         VectorLayerItem::iterator item = std::remove(mLayerNodes.begin(), mLayerNodes.end(), _item);
00056         MYGUI_ASSERT(item != mLayerNodes.end(), "item not found");
00057         mLayerNodes.erase(item);
00058     }
00059 
00060     void LayerItem::addRenderItem(ISubWidget* _item)
00061     {
00062         mDrawItems.push_back(_item);
00063     }
00064 
00065     void LayerItem::removeAllRenderItems()
00066     {
00067         detachFromLayerItemNode(false);
00068         mDrawItems.clear();
00069     }
00070 
00071     void LayerItem::setRenderItemTexture(ITexture* _texture)
00072     {
00073         if (mTexture == _texture)
00074             return;
00075 
00076         mTexture = _texture;
00077         if (mLayerNode)
00078         {
00079             ILayerNode* node = mLayerNode;
00080             // позже сделать детач без текста
00081             detachFromLayerItemNode(false);
00082             attachToLayerItemNode(node, false);
00083         }
00084     }
00085 
00086     void LayerItem::saveLayerItem()
00087     {
00088         mSaveLayerNode = mLayerNode;
00089     }
00090 
00091     void LayerItem::restoreLayerItem()
00092     {
00093         mLayerNode = mSaveLayerNode;
00094         if (mLayerNode)
00095         {
00096             attachToLayerItemNode(mLayerNode, false);
00097         }
00098     }
00099 
00100     void LayerItem::attachItemToNode(ILayer* _layer, ILayerNode* _node)
00101     {
00102         mLayer = _layer;
00103         mLayerNode = _node;
00104 
00105         attachToLayerItemNode(_node, true);
00106     }
00107 
00108     void LayerItem::detachFromLayer()
00109     {
00110         // мы уже отдетачены в доску
00111         if (nullptr == mLayer)
00112             return;
00113 
00114         // такого быть не должно
00115         MYGUI_ASSERT(mLayerNode, "mLayerNode == nullptr");
00116 
00117         // отписываемся от пиккинга
00118         mLayerNode->detachLayerItem(this);
00119 
00120         // при детаче обнулиться
00121         ILayerNode* save = mLayerNode;
00122 
00123         // физически отсоединяем
00124         detachFromLayerItemNode(true);
00125 
00126         // отсоединяем леер и обнуляем у рутового виджета
00127         mLayer->destroyChildItemNode(save);
00128         mLayerNode = nullptr;
00129         mLayer = nullptr;
00130     }
00131 
00132     void LayerItem::upLayerItem()
00133     {
00134         MyGUI::ILayerNode* node = mLayerNode;
00135         while (node)
00136         {
00137             node->getLayer()->upChildItemNode(node);
00138             node = node->getParent();
00139         }
00140     }
00141 
00142     void LayerItem::attachToLayerItemNode(ILayerNode* _item, bool _deep)
00143     {
00144         MYGUI_DEBUG_ASSERT(nullptr != _item, "attached item must be valid");
00145 
00146         // сохраняем, чтобы последующие дети могли приаттачиться
00147         mLayerNode = _item;
00148 
00149         for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
00150         {
00151             (*skin)->createDrawItem(mTexture, _item);
00152         }
00153 
00154         for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item)
00155         {
00156             (*item)->attachToLayerItemNode(_item, _deep);
00157         }
00158 
00159         for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item)
00160         {
00161             // создаем оверлаппеду новый айтем
00162             if (_deep)
00163             {
00164                 ILayerNode* child_node = _item->createChildItemNode();
00165                 (*item)->attachToLayerItemNode(child_node, _deep);
00166             }
00167         }
00168     }
00169 
00170     void LayerItem::detachFromLayerItemNode(bool _deep)
00171     {
00172         for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item)
00173         {
00174             (*item)->detachFromLayerItemNode(_deep);
00175         }
00176 
00177         for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item)
00178         {
00179             if (_deep)
00180             {
00181                 ILayerNode* node = (*item)->mLayerNode;
00182                 (*item)->detachFromLayerItemNode(_deep);
00183                 if (node)
00184                 {
00185                     node->getLayer()->destroyChildItemNode(node);
00186                 }
00187             }
00188         }
00189 
00190         // мы уже отаттачены
00191         ILayerNode* node = mLayerNode;
00192         if (node)
00193         {
00194             //for (VectorWidgetPtr::iterator widget = mWidgetChildSkin.begin(); widget != mWidgetChildSkin.end(); ++widget) (*widget)->_detachFromLayerItemKeeperByStyle(_deep);
00195             for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
00196             {
00197                 (*skin)->destroyDrawItem();
00198             }
00199 
00200             // при глубокой очистке, если мы оверлаппед, то для нас создавали айтем
00201             /*if (_deep && !this->isRootWidget() && mWidgetStyle == WidgetStyle::Overlapped)
00202             {
00203                 node->destroyItemNode();
00204             }*/
00205             // очищаем
00206             mLayerNode = nullptr;
00207         }
00208     }
00209 
00210     ILayer* LayerItem::getLayer() const
00211     {
00212         return mLayer;
00213     }
00214 
00215     ILayerNode* LayerItem::getLayerNode() const
00216     {
00217         return mLayerNode;
00218     }
00219 
00220 } // namespace MyGUI