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 "MyGUI_SharedLayer.h" 00010 #include "MyGUI_LayerNode.h" 00011 #include "MyGUI_RenderManager.h" 00012 00013 namespace MyGUI 00014 { 00015 00016 SharedLayer::SharedLayer() : 00017 mIsPick(false), 00018 mChildItem(nullptr), 00019 mOutOfDate(false) 00020 { 00021 mViewSize = RenderManager::getInstance().getViewSize(); 00022 } 00023 00024 SharedLayer::~SharedLayer() 00025 { 00026 MYGUI_ASSERT(mChildItem == nullptr, "Layer '" << getName() << "' must be empty before destroy"); 00027 } 00028 00029 void SharedLayer::deserialization(xml::ElementPtr _node, Version _version) 00030 { 00031 mName = _node->findAttribute("name"); 00032 if (_version >= Version(1, 2)) 00033 { 00034 MyGUI::xml::ElementEnumerator propert = _node->getElementEnumerator(); 00035 while (propert.next("Property")) 00036 { 00037 const std::string& key = propert->findAttribute("key"); 00038 const std::string& value = propert->findAttribute("value"); 00039 if (key == "Pick") 00040 mIsPick = utility::parseValue<bool>(value); 00041 } 00042 } 00043 else if (_version >= Version(1, 0)) 00044 { 00045 mIsPick = utility::parseBool(_node->findAttribute("pick")); 00046 } 00047 else 00048 { 00049 mIsPick = utility::parseBool(_node->findAttribute("peek")); 00050 } 00051 } 00052 00053 ILayerNode* SharedLayer::createChildItemNode() 00054 { 00055 if (mChildItem == nullptr) 00056 mChildItem = new SharedLayerNode(this); 00057 00058 mChildItem->addUsing(); 00059 00060 mOutOfDate = true; 00061 00062 return mChildItem; 00063 } 00064 00065 void SharedLayer::destroyChildItemNode(ILayerNode* _item) 00066 { 00067 // айтем рутовый, мы удаляем 00068 if (mChildItem == _item) 00069 { 00070 mChildItem->removeUsing(); 00071 if (0 == mChildItem->countUsing()) 00072 { 00073 delete mChildItem; 00074 mChildItem = nullptr; 00075 } 00076 00077 mOutOfDate = true; 00078 00079 return; 00080 } 00081 //MYGUI_EXCEPT("item node not found"); 00082 } 00083 00084 void SharedLayer::upChildItemNode(ILayerNode* _item) 00085 { 00086 // если есть отец, то пусть сам рулит 00087 ILayerNode* parent = _item->getParent(); 00088 if (parent != nullptr) 00089 parent->upChildItemNode(_item); 00090 00091 mOutOfDate = true; 00092 } 00093 00094 ILayerItem* SharedLayer::getLayerItemByPoint(int _left, int _top) const 00095 { 00096 if (!mIsPick) 00097 return nullptr; 00098 00099 if (mChildItem != nullptr) 00100 { 00101 ILayerItem* item = mChildItem->getLayerItemByPoint(_left, _top); 00102 if (item != nullptr) 00103 return item; 00104 } 00105 return nullptr; 00106 } 00107 00108 IntPoint SharedLayer::getPosition(int _left, int _top) const 00109 { 00110 return IntPoint(_left, _top); 00111 } 00112 00113 void SharedLayer::renderToTarget(IRenderTarget* _target, bool _update) 00114 { 00115 if (mChildItem != nullptr) 00116 mChildItem->renderToTarget(_target, _update); 00117 00118 mOutOfDate = false; 00119 } 00120 00121 void SharedLayer::resizeView(const IntSize& _viewSize) 00122 { 00123 if (mChildItem != nullptr) 00124 mChildItem->resizeView(_viewSize); 00125 00126 mViewSize = _viewSize; 00127 } 00128 00129 EnumeratorILayerNode SharedLayer::getEnumerator() const 00130 { 00131 static VectorILayerNode nodes; 00132 if (mChildItem == nullptr) 00133 { 00134 nodes.clear(); 00135 } 00136 else 00137 { 00138 if (nodes.empty()) 00139 nodes.push_back(mChildItem); 00140 else 00141 nodes[0] = mChildItem; 00142 } 00143 00144 return EnumeratorILayerNode(nodes); 00145 } 00146 00147 size_t SharedLayer::getLayerNodeCount() const 00148 { 00149 return mChildItem == nullptr ? 0 : 1; 00150 } 00151 00152 ILayerNode* SharedLayer::getLayerNodeAt(size_t _index) const 00153 { 00154 size_t count = getLayerNodeCount(); 00155 MYGUI_ASSERT_RANGE(_index, count, "SharedLayer::getLayerNodeAt"); 00156 00157 return mChildItem; 00158 } 00159 00160 const IntSize& SharedLayer::getSize() const 00161 { 00162 return mViewSize; 00163 } 00164 00165 bool SharedLayer::isOutOfDate() const 00166 { 00167 if (mChildItem->isOutOfDate()) 00168 return true; 00169 00170 return mOutOfDate; 00171 } 00172 00173 } // namespace MyGUI