void OverlappedLayer::destroyChildItemNode(ILayerNode* _item) { // если есть отец, то русть сам и удаляет ILayerNode* parent = _item->getParent(); if (parent) { parent->destroyChildItemNode(_item); mOutOfDate = true; return; } // айтем рутовый, мы удаляем for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter) { if ((*iter) == _item) { delete _item; mChildItems.erase(iter); mOutOfDate = true; return; } } MYGUI_EXCEPT("item node not found"); }
void OverlappedLayer::upChildItemNode(ILayerNode* _item) { // если есть отец, то пусть сам рулит ILayerNode* parent = _item->getParent(); if (parent != nullptr) { parent->upChildItemNode(_item); mOutOfDate = true; return; } if ((2 > mChildItems.size()) || (mChildItems.back() == _item)) return; for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter) { if ((*iter) == _item) { mChildItems.erase(iter); mChildItems.push_back(_item); mOutOfDate = true; return; } } MYGUI_EXCEPT("item node not found"); }
void SharedLayer::upChildItemNode(ILayerNode* _item) { // если есть отец, то пусть сам рулит ILayerNode* parent = _item->getParent(); if (parent != nullptr) { parent->upChildItemNode(_item); } }
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; } }
// поправить на виджет и проверять на рутовость void LayerManager::attachToLayerNode(const std::string& _name, Widget* _item) { MYGUI_ASSERT(nullptr != _item, "pointer must be valid"); MYGUI_ASSERT(_item->isRootWidget(), "attached widget must be root"); // сначала отсоединяем _item->detachFromLayer(); // а теперь аттачим for (VectorLayer::iterator iter = mLayerNodes.begin(); iter != mLayerNodes.end(); ++iter) { if (_name == (*iter)->getName()) { ILayerNode* node = (*iter)->createChildItemNode(); node->attachLayerItem(_item); return; } } MYGUI_LOG(Error, "Layer '" << _name << "' is not found"); //MYGUI_EXCEPT("Layer '" << _name << "' is not found"); }