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
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
00191 for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
00192 {
00193 (*skin)->destroyDrawItem();
00194 }
00195
00196
00197
00198
00199
00200
00201
00202 mLayerNode = nullptr;
00203 }
00204 }
00205
00206 }