MyGUI  3.2.1
MyGUI_SharedLayer.cpp
Go to the documentation of this file.
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