• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • Examples
  • File List
  • Globals

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 
00026 namespace MyGUI
00027 {
00028 
00029     void LayerItem::addChildItem(LayerItem* _item)
00030     {
00031         mLayerItems.push_back(_item);
00032         if (mLayerNode != nullptr)
00033         {
00034             _item->attachToLayerItemNode(mLayerNode, false);
00035         }
00036     }
00037 
00038     void LayerItem::removeChildItem(LayerItem* _item)
00039     {
00040         VectorLayerItem::iterator item = std::remove(mLayerItems.begin(), mLayerItems.end(), _item);
00041         MYGUI_ASSERT(item != mLayerItems.end(), "item not found");
00042         mLayerItems.erase(item);
00043     }
00044 
00045     void LayerItem::addChildNode(LayerItem* _item)
00046     {
00047         mLayerNodes.push_back(_item);
00048         if (mLayerNode != nullptr)
00049         {
00050             // создаем оверлаппеду новый айтем
00051             ILayerNode* child_node = mLayerNode->createChildItemNode();
00052             _item->attachToLayerItemNode(child_node, true);
00053         }
00054     }
00055 
00056     void LayerItem::removeChildNode(LayerItem* _item)
00057     {
00058         VectorLayerItem::iterator item = std::remove(mLayerNodes.begin(), mLayerNodes.end(), _item);
00059         MYGUI_ASSERT(item != mLayerNodes.end(), "item not found");
00060         mLayerNodes.erase(item);
00061     }
00062 
00063     void LayerItem::addRenderItem(ISubWidget* _item)
00064     {
00065         mDrawItems.push_back(_item);
00066     }
00067 
00068     void LayerItem::removeAllRenderItems()
00069     {
00070         detachFromLayerItemNode(false);
00071         mDrawItems.clear();
00072     }
00073 
00074     void LayerItem::setRenderItemTexture(const std::string& _texture)
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) return;
00112 
00113         // такого быть не должно
00114         MYGUI_ASSERT(mLayerNode, "_item->mLayerNode == nullptr");
00115 
00116         // отписываемся от пиккинга
00117         mLayerNode->detachLayerItem(this);
00118 
00119         // при детаче обнулиться
00120         ILayerNode * save = mLayerNode;
00121 
00122         // физически отсоединяем
00123         detachFromLayerItemNode(true);
00124 
00125         // отсоединяем леер и обнуляем у рутового виджета
00126         mLayer->destroyChildItemNode(save);
00127         mLayerNode = nullptr;
00128         mLayer = nullptr;
00129     }
00130 
00131     void LayerItem::upLayerItem()
00132     {
00133         if (mLayerNode) mLayerNode->getLayer()->upChildItemNode(mLayerNode);
00134     }
00135 
00136     void LayerItem::attachToLayerItemNode(ILayerNode* _item, bool _deep)
00137     {
00138         MYGUI_DEBUG_ASSERT(nullptr != _item, "attached item must be valid");
00139 
00140         // сохраняем, чтобы последующие дети могли приаттачиться
00141         mLayerNode = _item;
00142 
00143         for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
00144         {
00145             (*skin)->createDrawItem(mTexture, _item);
00146         }
00147 
00148         for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item)
00149         {
00150             (*item)->attachToLayerItemNode(_item, _deep);
00151         }
00152 
00153         for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item)
00154         {
00155             // создаем оверлаппеду новый айтем
00156             if (_deep)
00157             {
00158                 ILayerNode* child_node = _item->createChildItemNode();
00159                 (*item)->attachToLayerItemNode(child_node, _deep);
00160             }
00161         }
00162     }
00163 
00164     void LayerItem::detachFromLayerItemNode(bool _deep)
00165     {
00166 
00167         for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item)
00168         {
00169             (*item)->detachFromLayerItemNode(_deep);
00170         }
00171 
00172         for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item)
00173         {
00174             if (_deep)
00175             {
00176                 ILayerNode* node = (*item)->mLayerNode;
00177                 (*item)->detachFromLayerItemNode(_deep);
00178                 if (node)
00179                 {
00180                     node->getLayer()->destroyChildItemNode(node);
00181                 }
00182             }
00183         }
00184 
00185         // мы уже отаттачены
00186         ILayerNode* node = mLayerNode;
00187         if (node)
00188         {
00189 
00190             //for (VectorWidgetPtr::iterator widget = mWidgetChildSkin.begin(); widget != mWidgetChildSkin.end(); ++widget) (*widget)->_detachFromLayerItemKeeperByStyle(_deep);
00191             for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
00192             {
00193                 (*skin)->destroyDrawItem();
00194             }
00195 
00196             // при глубокой очистке, если мы оверлаппед, то для нас создавали айтем
00197             /*if (_deep && !this->isRootWidget() && mWidgetStyle == WidgetStyle::Overlapped)
00198             {
00199                 node->destroyItemNode();
00200             }*/
00201             // очищаем
00202             mLayerNode = nullptr;
00203         }
00204     }
00205 
00206 } // namespace MyGUI

Generated on Sun Jan 30 2011 for MyGUI by  doxygen 1.7.1