• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • Examples
  • File List
  • Globals

MyGUI_OverlappedLayer.cpp

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

Generated on Sun Jan 30 2011 for MyGUI by  doxygen 1.7.1