00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
00198 for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
00199 {
00200 (*skin)->destroyDrawItem();
00201 }
00202
00203
00204
00205
00206
00207
00208
00209 mLayerNode = nullptr;
00210 }
00211 }
00212
00213 }