00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "MyGUI_Precompiled.h"
00025 #include "MyGUI_LayerItem.h"
00026 #include "MyGUI_OverlappedLayer.h"
00027 #include "MyGUI_LayerNode.h"
00028 #include "MyGUI_RenderManager.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 (!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 IntPoint OverlappedLayer::getPosition(int _left, int _top) const
00132 {
00133 return IntPoint(_left, _top);
00134 }
00135
00136 void OverlappedLayer::renderToTarget(IRenderTarget* _target, bool _update)
00137 {
00138 for (VectorILayerNode::iterator iter=mChildItems.begin(); iter!=mChildItems.end(); ++iter)
00139 {
00140 (*iter)->renderToTarget(_target, _update);
00141 }
00142 }
00143
00144 EnumeratorILayerNode OverlappedLayer::getEnumerator()
00145 {
00146 return EnumeratorILayerNode(mChildItems);
00147 }
00148
00149 void OverlappedLayer::dumpStatisticToLog()
00150 {
00151 static const char* spacer = " ";
00152 MYGUI_LOG(Info, spacer);
00153 MYGUI_LOG(Info, "Layer name='" << getName() << "'" << " type='" << getTypeName() << "'" << spacer);
00154 MYGUI_LOG(Info, "Count root nodes : " << mChildItems.size() << spacer);
00155
00156 for (VectorILayerNode::iterator iter=mChildItems.begin(); iter!=mChildItems.end(); ++iter)
00157 {
00158 (*iter)->dumpStatisticToLog(0);
00159 }
00160 }
00161
00162 const IntSize& OverlappedLayer::getSize() const
00163 {
00164 return RenderManager::getInstance().getViewSize();
00165 }
00166
00167 }