MyGUI
3.2.1
|
00001 /* 00002 * This source file is part of MyGUI. For the latest info, see http://mygui.info/ 00003 * Distributed under the MIT License 00004 * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT) 00005 */ 00006 00007 #include "MyGUI_Precompiled.h" 00008 #include "MyGUI_LayerItem.h" 00009 #include <algorithm> 00010 00011 namespace MyGUI 00012 { 00013 00014 LayerItem::LayerItem() : 00015 mLayer(nullptr), 00016 mLayerNode(nullptr), 00017 mSaveLayerNode(nullptr), 00018 mTexture(nullptr) 00019 { 00020 } 00021 00022 LayerItem::~LayerItem() 00023 { 00024 } 00025 00026 void LayerItem::addChildItem(LayerItem* _item) 00027 { 00028 mLayerItems.push_back(_item); 00029 if (mLayerNode != nullptr) 00030 { 00031 _item->attachToLayerItemNode(mLayerNode, false); 00032 } 00033 } 00034 00035 void LayerItem::removeChildItem(LayerItem* _item) 00036 { 00037 VectorLayerItem::iterator item = std::remove(mLayerItems.begin(), mLayerItems.end(), _item); 00038 MYGUI_ASSERT(item != mLayerItems.end(), "item not found"); 00039 mLayerItems.erase(item); 00040 } 00041 00042 void LayerItem::addChildNode(LayerItem* _item) 00043 { 00044 mLayerNodes.push_back(_item); 00045 if (mLayerNode != nullptr) 00046 { 00047 // создаем оверлаппеду новый айтем 00048 ILayerNode* child_node = mLayerNode->createChildItemNode(); 00049 _item->attachToLayerItemNode(child_node, true); 00050 } 00051 } 00052 00053 void LayerItem::removeChildNode(LayerItem* _item) 00054 { 00055 VectorLayerItem::iterator item = std::remove(mLayerNodes.begin(), mLayerNodes.end(), _item); 00056 MYGUI_ASSERT(item != mLayerNodes.end(), "item not found"); 00057 mLayerNodes.erase(item); 00058 } 00059 00060 void LayerItem::addRenderItem(ISubWidget* _item) 00061 { 00062 mDrawItems.push_back(_item); 00063 } 00064 00065 void LayerItem::removeAllRenderItems() 00066 { 00067 detachFromLayerItemNode(false); 00068 mDrawItems.clear(); 00069 } 00070 00071 void LayerItem::setRenderItemTexture(ITexture* _texture) 00072 { 00073 if (mTexture == _texture) 00074 return; 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) 00112 return; 00113 00114 // такого быть не должно 00115 MYGUI_ASSERT(mLayerNode, "mLayerNode == nullptr"); 00116 00117 // отписываемся от пиккинга 00118 mLayerNode->detachLayerItem(this); 00119 00120 // при детаче обнулиться 00121 ILayerNode* save = mLayerNode; 00122 00123 // физически отсоединяем 00124 detachFromLayerItemNode(true); 00125 00126 // отсоединяем леер и обнуляем у рутового виджета 00127 mLayer->destroyChildItemNode(save); 00128 mLayerNode = nullptr; 00129 mLayer = nullptr; 00130 } 00131 00132 void LayerItem::upLayerItem() 00133 { 00134 MyGUI::ILayerNode* node = mLayerNode; 00135 while (node) 00136 { 00137 node->getLayer()->upChildItemNode(node); 00138 node = node->getParent(); 00139 } 00140 } 00141 00142 void LayerItem::attachToLayerItemNode(ILayerNode* _item, bool _deep) 00143 { 00144 MYGUI_DEBUG_ASSERT(nullptr != _item, "attached item must be valid"); 00145 00146 // сохраняем, чтобы последующие дети могли приаттачиться 00147 mLayerNode = _item; 00148 00149 for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin) 00150 { 00151 (*skin)->createDrawItem(mTexture, _item); 00152 } 00153 00154 for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item) 00155 { 00156 (*item)->attachToLayerItemNode(_item, _deep); 00157 } 00158 00159 for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item) 00160 { 00161 // создаем оверлаппеду новый айтем 00162 if (_deep) 00163 { 00164 ILayerNode* child_node = _item->createChildItemNode(); 00165 (*item)->attachToLayerItemNode(child_node, _deep); 00166 } 00167 } 00168 } 00169 00170 void LayerItem::detachFromLayerItemNode(bool _deep) 00171 { 00172 for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item) 00173 { 00174 (*item)->detachFromLayerItemNode(_deep); 00175 } 00176 00177 for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item) 00178 { 00179 if (_deep) 00180 { 00181 ILayerNode* node = (*item)->mLayerNode; 00182 (*item)->detachFromLayerItemNode(_deep); 00183 if (node) 00184 { 00185 node->getLayer()->destroyChildItemNode(node); 00186 } 00187 } 00188 } 00189 00190 // мы уже отаттачены 00191 ILayerNode* node = mLayerNode; 00192 if (node) 00193 { 00194 //for (VectorWidgetPtr::iterator widget = mWidgetChildSkin.begin(); widget != mWidgetChildSkin.end(); ++widget) (*widget)->_detachFromLayerItemKeeperByStyle(_deep); 00195 for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin) 00196 { 00197 (*skin)->destroyDrawItem(); 00198 } 00199 00200 // при глубокой очистке, если мы оверлаппед, то для нас создавали айтем 00201 /*if (_deep && !this->isRootWidget() && mWidgetStyle == WidgetStyle::Overlapped) 00202 { 00203 node->destroyItemNode(); 00204 }*/ 00205 // очищаем 00206 mLayerNode = nullptr; 00207 } 00208 } 00209 00210 ILayer* LayerItem::getLayer() const 00211 { 00212 return mLayer; 00213 } 00214 00215 ILayerNode* LayerItem::getLayerNode() const 00216 { 00217 return mLayerNode; 00218 } 00219 00220 } // namespace MyGUI