void undo() { bool removed = false; for (int i = 0; i < m_clonedElements.count(); ++i) { Clone &clone = m_clonedElements[i]; QMT_CHECK(!clone.m_clonedElement); MObject *owner = m_modelController->findObject<MObject>(clone.m_ownerKey); QMT_CHECK(owner); switch (clone.m_elementType) { case TypeObject: { MObject *object = m_modelController->findObject<MObject>(clone.m_elementKey); QMT_CHECK(object); clone.m_indexOfElement = owner->children().indexOf(object); QMT_CHECK(clone.m_indexOfElement >= 0); emit m_modelController->beginRemoveObject(clone.m_indexOfElement, owner); MCloneDeepVisitor visitor; object->accept(&visitor); clone.m_clonedElement = visitor.cloned(); m_modelController->unmapObject(object); owner->removeChild(object); emit m_modelController->endRemoveObject(clone.m_indexOfElement, owner); removed = true; break; } case TypeRelation: { MRelation *relation = m_modelController->findRelation<MRelation>(clone.m_elementKey); QMT_CHECK(relation); clone.m_indexOfElement = owner->relations().indexOf(relation); QMT_CHECK(clone.m_indexOfElement >= 0); emit m_modelController->beginRemoveRelation(clone.m_indexOfElement, owner); MCloneDeepVisitor visitor; relation->accept(&visitor); clone.m_clonedElement = visitor.cloned(); m_modelController->unmapRelation(relation); owner->removeRelation(relation); emit m_modelController->endRemoveRelation(clone.m_indexOfElement, owner); removed = true; break; } default: QMT_CHECK(false); break; } } if (removed) { emit m_modelController->modified(); } m_modelController->verifyModelIntegrity(); UndoCommand::undo(); }