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