//--------------------------------------------------------------------- void OverlayManager::destroyAllOverlayElementsImpl(ElementMap& elementMap) { ElementMap::iterator i; while ((i = elementMap.begin()) != elementMap.end()) { OverlayElement* element = i->second; // Get factory to delete FactoryMap::iterator fi = mFactories.find(element->getTypeName()); if (fi == mFactories.end()) { OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Cannot locate factory for element " + element->getName(), "OverlayManager::destroyAllOverlayElements"); } // remove from parent, if any OverlayContainer* parent; if ((parent = element->getParent()) != 0) { parent->_removeChild(element->getName()); } // children of containers will be auto-removed when container is destroyed. // destroy the element and remove it from the list fi->second->destroyOverlayElement(element); elementMap.erase(i); } }
//--------------------------------------------------------------------- OverlayElement* OverlayManager::createOverlayElementFromTemplate(const String& templateName, const String& typeName, const String& instanceName, bool isATemplate) { OverlayElement* newObj = NULL; if (templateName.empty()) { newObj = createOverlayElement(typeName, instanceName, isATemplate); } else { // no template OverlayElement* templateGui = getOverlayElement(templateName, true); String typeNameToCreate; if (typeName.empty()) { typeNameToCreate = templateGui->getTypeName(); } else { typeNameToCreate = typeName; } newObj = createOverlayElement(typeNameToCreate, instanceName, isATemplate); ((OverlayContainer*)newObj)->copyFromTemplate(templateGui); } return newObj; }
void OverlayContainer::copyFromTemplate(OverlayElement* templateOverlay) { OverlayElement::copyFromTemplate(templateOverlay); if (templateOverlay->isContainer() && isContainer()) { OverlayContainer::ChildIterator it = static_cast<OverlayContainer*>(templateOverlay)->getChildIterator(); while (it.hasMoreElements()) { OverlayElement* oldChildElement = it.getNext(); if (oldChildElement->isCloneable()) { OverlayElement* newChildElement = OverlayManager::getSingleton().createOverlayElement( oldChildElement->getTypeName(), mName+"/"+oldChildElement->getName()); newChildElement->copyFromTemplate(oldChildElement); addChild(static_cast<OverlayContainer*>(newChildElement)); } } } }