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