1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-02 05:15:33 +00:00
openmw/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_LayerItem.cpp
2010-07-08 00:23:28 +02:00

213 lines
5.2 KiB
C++

/*!
@file
@author Albert Semenov
@date 11/2007
@module
*/
/*
This file is part of MyGUI.
MyGUI is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MyGUI is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
*/
#include "MyGUI_Precompiled.h"
#include "MyGUI_LayerItem.h"
#include <algorithm>
namespace MyGUI
{
LayerItem::LayerItem() :
mLayer(nullptr),
mLayerNode(nullptr),
mSaveLayerNode(nullptr),
mTexture(nullptr)
{
}
void LayerItem::addChildItem(LayerItem* _item)
{
mLayerItems.push_back(_item);
if (mLayerNode != nullptr)
{
_item->attachToLayerItemNode(mLayerNode, false);
}
}
void LayerItem::removeChildItem(LayerItem* _item)
{
VectorLayerItem::iterator item = std::remove(mLayerItems.begin(), mLayerItems.end(), _item);
MYGUI_ASSERT(item != mLayerItems.end(), "item not found");
mLayerItems.erase(item);
}
void LayerItem::addChildNode(LayerItem* _item)
{
mLayerNodes.push_back(_item);
if (mLayerNode != nullptr)
{
// ñîçäàåì îâåðëàïïåäó íîâûé àéòåì
ILayerNode* child_node = mLayerNode->createChildItemNode();
_item->attachToLayerItemNode(child_node, true);
}
}
void LayerItem::removeChildNode(LayerItem* _item)
{
VectorLayerItem::iterator item = std::remove(mLayerNodes.begin(), mLayerNodes.end(), _item);
MYGUI_ASSERT(item != mLayerNodes.end(), "item not found");
mLayerNodes.erase(item);
}
void LayerItem::addRenderItem(ISubWidget* _item)
{
mDrawItems.push_back(_item);
}
void LayerItem::removeAllRenderItems()
{
detachFromLayerItemNode(false);
mDrawItems.clear();
}
void LayerItem::setRenderItemTexture(ITexture* _texture)
{
mTexture = _texture;
if (mLayerNode)
{
ILayerNode* node = mLayerNode;
// ïîçæå ñäåëàòü äåòà÷ áåç òåêñòà
detachFromLayerItemNode(false);
attachToLayerItemNode(node, false);
}
}
void LayerItem::saveLayerItem()
{
mSaveLayerNode = mLayerNode;
}
void LayerItem::restoreLayerItem()
{
mLayerNode = mSaveLayerNode;
if (mLayerNode)
{
attachToLayerItemNode(mLayerNode, false);
}
}
void LayerItem::attachItemToNode(ILayer* _layer, ILayerNode* _node)
{
mLayer = _layer;
mLayerNode = _node;
attachToLayerItemNode(_node, true);
}
void LayerItem::detachFromLayer()
{
// ìû óæå îòäåòà÷åíû â äîñêó
if (nullptr == mLayer) return;
// òàêîãî áûòü íå äîëæíî
MYGUI_ASSERT(mLayerNode, "_item->mLayerNode == nullptr");
// îòïèñûâàåìñÿ îò ïèêêèíãà
mLayerNode->detachLayerItem(this);
// ïðè äåòà÷å îáíóëèòüñÿ
ILayerNode * save = mLayerNode;
// ôèçè÷åñêè îòñîåäèíÿåì
detachFromLayerItemNode(true);
// îòñîåäèíÿåì ëååð è îáíóëÿåì ó ðóòîâîãî âèäæåòà
mLayer->destroyChildItemNode(save);
mLayerNode = nullptr;
mLayer = nullptr;
}
void LayerItem::upLayerItem()
{
if (mLayerNode) mLayerNode->getLayer()->upChildItemNode(mLayerNode);
}
void LayerItem::attachToLayerItemNode(ILayerNode* _item, bool _deep)
{
MYGUI_DEBUG_ASSERT(nullptr != _item, "attached item must be valid");
// ñîõðàíÿåì, ÷òîáû ïîñëåäóþùèå äåòè ìîãëè ïðèàòòà÷èòüñÿ
mLayerNode = _item;
for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
{
(*skin)->createDrawItem(mTexture, _item);
}
for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item)
{
(*item)->attachToLayerItemNode(_item, _deep);
}
for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item)
{
// ñîçäàåì îâåðëàïïåäó íîâûé àéòåì
if (_deep)
{
ILayerNode* child_node = _item->createChildItemNode();
(*item)->attachToLayerItemNode(child_node, _deep);
}
}
}
void LayerItem::detachFromLayerItemNode(bool _deep)
{
for (VectorLayerItem::iterator item = mLayerItems.begin(); item != mLayerItems.end(); ++item)
{
(*item)->detachFromLayerItemNode(_deep);
}
for (VectorLayerItem::iterator item = mLayerNodes.begin(); item != mLayerNodes.end(); ++item)
{
if (_deep)
{
ILayerNode* node = (*item)->mLayerNode;
(*item)->detachFromLayerItemNode(_deep);
if (node)
{
node->getLayer()->destroyChildItemNode(node);
}
}
}
// ìû óæå îòàòòà÷åíû
ILayerNode* node = mLayerNode;
if (node)
{
//for (VectorWidgetPtr::iterator widget = mWidgetChildSkin.begin(); widget != mWidgetChildSkin.end(); ++widget) (*widget)->_detachFromLayerItemKeeperByStyle(_deep);
for (VectorSubWidget::iterator skin = mDrawItems.begin(); skin != mDrawItems.end(); ++skin)
{
(*skin)->destroyDrawItem();
}
// ïðè ãëóáîêîé î÷èñòêå, åñëè ìû îâåðëàïïåä, òî äëÿ íàñ ñîçäàâàëè àéòåì
/*if (_deep && !this->isRootWidget() && mWidgetStyle == WidgetStyle::Overlapped)
{
node->destroyItemNode();
}*/
// î÷èùàåì
mLayerNode = nullptr;
}
}
} // namespace MyGUI