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 00024 #include "MyGUI_Precompiled.h" 00025 #include "MyGUI_Common.h" 00026 #include "MyGUI_LayerItem.h" 00027 #include "MyGUI_OverlappedLayer.h" 00028 #include "MyGUI_LayerNode.h" 00029 00030 namespace MyGUI 00031 { 00032 00033 OverlappedLayer::OverlappedLayer() : 00034 mIsPick(false) 00035 { 00036 } 00037 00038 OverlappedLayer::~OverlappedLayer() 00039 { 00040 MYGUI_ASSERT(mChildItems.empty(), "Layer '" << getName() << "' must be empty before destroy"); 00041 } 00042 00043 void OverlappedLayer::deserialization(xml::ElementPtr _node, Version _version) 00044 { 00045 mName = _node->findAttribute("name"); 00046 if (_version >= Version(1, 2)) 00047 { 00048 MyGUI::xml::ElementEnumerator propert = _node->getElementEnumerator(); 00049 while (propert.next("Property")) 00050 { 00051 const std::string& key = propert->findAttribute("key"); 00052 const std::string& value = propert->findAttribute("value"); 00053 if (key == "Pick") mIsPick = utility::parseValue<bool>(value); 00054 } 00055 } 00056 else 00057 { 00058 mIsPick = utility::parseBool(_version < Version(1, 0) ? _node->findAttribute("peek") : _node->findAttribute("pick")); 00059 } 00060 } 00061 00062 ILayerNode * OverlappedLayer::createChildItemNode() 00063 { 00064 // создаем рутовый айтем 00065 ILayerNode * node = new LayerNode(this); 00066 mChildItems.push_back(node); 00067 00068 return node; 00069 } 00070 00071 void OverlappedLayer::destroyChildItemNode(ILayerNode* _item) 00072 { 00073 // если есть отец, то русть сам и удаляет 00074 ILayerNode * parent = _item->getParent(); 00075 if (parent) 00076 { 00077 parent->destroyChildItemNode(_item); 00078 return; 00079 } 00080 00081 // айтем рутовый, мы удаляем 00082 for (VectorILayerNode::iterator iter=mChildItems.begin(); iter!=mChildItems.end(); ++iter) 00083 { 00084 if ((*iter) == _item) 00085 { 00086 delete _item; 00087 mChildItems.erase(iter); 00088 return; 00089 } 00090 } 00091 MYGUI_EXCEPT("item node not found"); 00092 } 00093 00094 void OverlappedLayer::upChildItemNode(ILayerNode* _item) 00095 { 00096 // если есть отец, то пусть сам рулит 00097 ILayerNode* parent = _item->getParent(); 00098 if (parent != nullptr) 00099 { 00100 parent->upChildItemNode(_item); 00101 return; 00102 } 00103 00104 if ((2 > mChildItems.size()) || (mChildItems.back() == _item)) return; 00105 for (VectorILayerNode::iterator iter=mChildItems.begin(); iter!=mChildItems.end(); ++iter) 00106 { 00107 if ((*iter) == _item) 00108 { 00109 mChildItems.erase(iter); 00110 mChildItems.push_back(_item); 00111 return; 00112 } 00113 } 00114 00115 MYGUI_EXCEPT("item node not found"); 00116 } 00117 00118 ILayerItem * OverlappedLayer::getLayerItemByPoint(int _left, int _top) 00119 { 00120 if (false == mIsPick) return nullptr; 00121 VectorILayerNode::reverse_iterator iter = mChildItems.rbegin(); 00122 while (iter != mChildItems.rend()) 00123 { 00124 ILayerItem * item = (*iter)->getLayerItemByPoint(_left, _top); 00125 if (item != nullptr) return item; 00126 ++iter; 00127 } 00128 return nullptr; 00129 } 00130 00131 void OverlappedLayer::renderToTarget(IRenderTarget* _target, bool _update) 00132 { 00133 for (VectorILayerNode::iterator iter=mChildItems.begin(); iter!=mChildItems.end(); ++iter) 00134 { 00135 (*iter)->renderToTarget(_target, _update); 00136 } 00137 } 00138 00139 EnumeratorILayerNode OverlappedLayer::getEnumerator() 00140 { 00141 return EnumeratorILayerNode(mChildItems); 00142 } 00143 00144 } // namespace MyGUI