Пример #1
0
 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();
 }