MyGUI
3.0.1
|
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