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_SharedLayer.h"
00027 #include "MyGUI_LayerNode.h"
00028 #include "MyGUI_RenderManager.h"
00029
00030 namespace MyGUI
00031 {
00032
00033 SharedLayer::SharedLayer() :
00034 mIsPick(false),
00035 mChildItem(nullptr)
00036 {
00037 }
00038
00039 SharedLayer::~SharedLayer()
00040 {
00041 MYGUI_ASSERT(mChildItem == nullptr, "Layer '" << getName() << "' must be empty before destroy");
00042 }
00043
00044 void SharedLayer::deserialization(xml::ElementPtr _node, Version _version)
00045 {
00046 mName = _node->findAttribute("name");
00047 if (_version >= Version(1, 2))
00048 {
00049 MyGUI::xml::ElementEnumerator propert = _node->getElementEnumerator();
00050 while (propert.next("Property"))
00051 {
00052 const std::string& key = propert->findAttribute("key");
00053 const std::string& value = propert->findAttribute("value");
00054 if (key == "Pick") mIsPick = utility::parseValue<bool>(value);
00055 }
00056 }
00057 else
00058 {
00059 mIsPick = utility::parseBool(_version < Version(1, 0) ? _node->findAttribute("peek") : _node->findAttribute("pick"));
00060 }
00061 }
00062
00063 ILayerNode* SharedLayer::createChildItemNode()
00064 {
00065 if (mChildItem == nullptr)
00066 {
00067 mChildItem = new SharedLayerNode(this);
00068 }
00069
00070 mChildItem->addUsing();
00071 return mChildItem;
00072 }
00073
00074 void SharedLayer::destroyChildItemNode(ILayerNode* _item)
00075 {
00076
00077 if (mChildItem == _item)
00078 {
00079 mChildItem->removeUsing();
00080 if (0 == mChildItem->countUsing())
00081 {
00082 delete mChildItem;
00083 mChildItem = nullptr;
00084 }
00085 return;
00086 }
00087
00088 }
00089
00090 void SharedLayer::upChildItemNode(ILayerNode* _item)
00091 {
00092
00093 ILayerNode * parent = _item->getParent();
00094 if (parent != nullptr)
00095 {
00096 parent->upChildItemNode(_item);
00097 }
00098 }
00099
00100 ILayerItem * SharedLayer::getLayerItemByPoint(int _left, int _top)
00101 {
00102 if (!mIsPick) return nullptr;
00103 if (mChildItem != nullptr)
00104 {
00105 ILayerItem * item = mChildItem->getLayerItemByPoint(_left, _top);
00106 if (item != nullptr) return item;
00107 }
00108 return nullptr;
00109 }
00110
00111 IntPoint SharedLayer::getPosition(int _left, int _top) const
00112 {
00113 return IntPoint(_left, _top);
00114 }
00115
00116 void SharedLayer::renderToTarget(IRenderTarget* _target, bool _update)
00117 {
00118 if (mChildItem != nullptr) mChildItem->renderToTarget(_target, _update);
00119 }
00120
00121 EnumeratorILayerNode SharedLayer::getEnumerator()
00122 {
00123 static VectorILayerNode nodes;
00124 if (mChildItem == nullptr)
00125 {
00126 nodes.clear();
00127 }
00128 else
00129 {
00130 if (nodes.empty()) nodes.push_back(mChildItem);
00131 else nodes[0] = mChildItem;
00132 }
00133
00134 return EnumeratorILayerNode(nodes);
00135 }
00136
00137 void SharedLayer::dumpStatisticToLog()
00138 {
00139 static const char* spacer = " ";
00140 MYGUI_LOG(Info, spacer);
00141 MYGUI_LOG(Info, "Layer name='" << getName() << "'" << " type='" << getTypeName() << "'" << spacer);
00142 MYGUI_LOG(Info, "Count root nodes : " << (mChildItem == nullptr ? 0 : 1) << spacer);
00143
00144 if (mChildItem != nullptr)
00145 {
00146 mChildItem->dumpStatisticToLog(0);
00147 }
00148 }
00149
00150 const IntSize& SharedLayer::getSize() const
00151 {
00152 return RenderManager::getInstance().getViewSize();
00153 }
00154
00155 }