MyGUI
3.2.0
|
00001 00006 /* 00007 This file is part of MyGUI. 00008 00009 MyGUI is free software: you can redistribute it and/or modify 00010 it under the terms of the GNU Lesser General Public License as published by 00011 the Free Software Foundation, either version 3 of the License, or 00012 (at your option) any later version. 00013 00014 MyGUI is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License 00020 along with MyGUI. If not, see <http://www.gnu.org/licenses/>. 00021 */ 00022 #include "MyGUI_Precompiled.h" 00023 #include "MyGUI_LayerItem.h" 00024 #include <algorithm> 00025 00026 namespace MyGUI 00027 { 00028 00029 LayerItem::LayerItem() : 00030 mLayer(nullptr), 00031 mLayerNode(nullptr), 00032 mSaveLayerNode(nullptr), 00033 mTexture(nullptr) 00034 { 00035 } 00036 00037 LayerItem::~LayerItem() 00038 { 00039 } 00040 00041 void LayerItem::addChildItem(LayerItem* _item) 00042 { 00043 mLayerItems.push_back(_item); 00044 if (mLayerNode != nullptr) 00045 { 00046 _item->attachToLayerItemNode(mLayerNode, false); 00047 } 00048 } 00049 00050 void LayerItem::removeChildItem(LayerItem* _item) 00051 { 00052 VectorLayerItem::iterator item = std::remove(mLayerItems.begin(), mLayerItems.end(), _item); 00053 MYGUI_ASSERT(item != mLayerItems.end(), "item not found"); 00054 mLayerItems.erase(item); 00055 } 00056 00057 void LayerItem::addChildNode(LayerItem* _item) 00058 { 00059 mLayerNodes.push_back(_item); 00060 if (mLayerNode != nullptr) 00061 { 00062 // создаем оверлаппеду новый айтем 00063 ILayerNode* child_node = mLayerNode->createChildItemNode(); 00064 _item->attachToLayerItemNode(child_node, true); 00065 } 00066 } 00067 00068 void LayerItem::removeChildNode(LayerItem* _item) 00069 { 00070 VectorLayerItem::iterator item = std::remove(mLayerNodes.begin(), mLayerNodes.end(), _item); 00071 MYGUI_ASSERT(item != mLayerNodes.end(), "item not found"); 00072 mLayerNodes.erase(item); 00073 } 00074 00075 void LayerItem::addRenderItem(ISubWidget* _item) 00076 { 00077 mDrawItems.push_back(_item); 00078 } 00079 00080 void LayerItem::removeAllRenderItems() 00081 { 00082 detachFromLayerItemNode(false); 00083 mDrawItems.clear(); 00084 } 00085 00086 void LayerItem::setRenderItemTexture(ITexture* _texture) 00087 { 00088 mTexture = _texture; 00089 if (mLayerNode) 00090 { 00091 ILayerNode* node = mLayerNode; 00092 // позже сделать детач без текста 00093 detachFromLayerItemNode(false); 00094 attachToLayerItemNode(node, false); 00095 } 00096 } 00097 00098 void LayerItem::saveLayerItem() 00099 { 00100 mSaveLayerNode = mLayerNode; 00101 } 00102 00103 void LayerItem::restoreLayerItem() 00104 { 00105 mLayerNode = mSaveLayerNode; 00106 if (mLayerNode) 00107 { 00108 attachToLayerItemNode(mLayerNode, false); 00109 } 00110 } 00111 00112 void LayerItem::attachItemToNode(ILayer* _layer, ILayerNode* _node) 00113 { 00114 mLayer = _layer; 00115 mLayerNode = _node; 00116 00117 attachToLayerItemNode(_node, true); 00118 } 00119 00120 void LayerItem::detachFromLayer() 00121 { 00122 // мы уже отдетачены в доску 00123 if (nullptr == mLayer) return; 00124 00125 // такого быть не должно 00126 MYGUI_ASSERT(mLayerNode, "_item->mLayerNode == nullptr"); 00127 00128 // отписываемся от пиккинга 00129 mLayerNode->detachLayerItem(this); 00130 00131 // при детаче обнулиться 00132 ILayerNode* save = mLayerNode; 00133 00134 // физически отсоединяем 00135 detachFromLayerItemNode(true); 00136 00137 // отсоединяем леер и обнуляем у рутового виджета 00138 mLayer->destroyChildItemNode(save); 00139 mLayerNode = nullptr; 00140 mLayer = nullptr; 00141 } 00142 00143 void LayerItem::upLayerItem() 00144 { 00145 if (mLayerNode) mLayerNode->getLayer()->upChildItemNode(mLayerNode); 00146 } 00147 00148 void LayerItem::attachToLayerItemNode(ILayerNode* _item, bool _deep) 00149 { 00150 MYGUI_DEBUG_ASSERT(nullptr != _item, "attached item must be valid"); 00151 00152 // сохраняем, чтобы последующие дети могли приаттачиться 00153 mLayerNode = _item; 00154 00155 for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin) 00156 { 00157 (*skin)->createDrawItem(mTexture, _item); 00158 } 00159 00160 for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item) 00161 { 00162 (*item)->attachToLayerItemNode(_item, _deep); 00163 } 00164 00165 for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item) 00166 { 00167 // создаем оверлаппеду новый айтем 00168 if (_deep) 00169 { 00170 ILayerNode* child_node = _item->createChildItemNode(); 00171 (*item)->attachToLayerItemNode(child_node, _deep); 00172 } 00173 } 00174 } 00175 00176 void LayerItem::detachFromLayerItemNode(bool _deep) 00177 { 00178 for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item) 00179 { 00180 (*item)->detachFromLayerItemNode(_deep); 00181 } 00182 00183 for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item) 00184 { 00185 if (_deep) 00186 { 00187 ILayerNode* node = (*item)->mLayerNode; 00188 (*item)->detachFromLayerItemNode(_deep); 00189 if (node) 00190 { 00191 node->getLayer()->destroyChildItemNode(node); 00192 } 00193 } 00194 } 00195 00196 // мы уже отаттачены 00197 ILayerNode* node = mLayerNode; 00198 if (node) 00199 { 00200 //for (VectorWidgetPtr::iterator widget = mWidgetChildSkin.begin(); widget != mWidgetChildSkin.end(); ++widget) (*widget)->_detachFromLayerItemKeeperByStyle(_deep); 00201 for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin) 00202 { 00203 (*skin)->destroyDrawItem(); 00204 } 00205 00206 // при глубокой очистке, если мы оверлаппед, то для нас создавали айтем 00207 /*if (_deep && !this->isRootWidget() && mWidgetStyle == WidgetStyle::Overlapped) 00208 { 00209 node->destroyItemNode(); 00210 }*/ 00211 // очищаем 00212 mLayerNode = nullptr; 00213 } 00214 } 00215 00216 ILayer* LayerItem::getLayer() const 00217 { 00218 return mLayer; 00219 } 00220 00221 } // namespace MyGUI