diff options
author | Jochen Becher <jochen_becher@gmx.de> | 2016-07-01 17:57:10 +0200 |
---|---|---|
committer | Jochen Becher <jochen_becher@gmx.de> | 2016-07-04 13:56:04 +0000 |
commit | 1bb11c5b83eaa6d7a2c915a3baa4848a9f8a8035 (patch) | |
tree | 29a96d019485a0f020226372ed27916cd9d01629 | |
parent | 222f89472f72f0412780e2ebae046ff4af8e6795 (diff) |
ModelEditor: Avoid corrupt diagrams after moving end of relation
Change-Id: If0a2a62d3ef7e59242b244d6892e83bb71315164
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
-rw-r--r-- | src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.h | 1 | ||||
-rw-r--r-- | src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp | 10 |
2 files changed, 11 insertions, 0 deletions
diff --git a/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.h b/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.h index 24675e7971..1f688198a4 100644 --- a/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.h +++ b/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.h @@ -87,6 +87,7 @@ public: void setModelController(ModelController *modelController); UndoController *undoController() const { return m_undoController; } void setUndoController(UndoController *undoController); + QList<MDiagram *> allDiagrams() const { return m_allDiagrams; } private: MDiagram *findDiagram(const Uid &diagramKey) const; diff --git a/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp b/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp index f66400dd28..3bd2510668 100644 --- a/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp +++ b/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp @@ -724,8 +724,18 @@ bool DiagramSceneController::relocateRelationEnd(DRelation *relation, DObject *t MObject *currentTargetMObject = m_modelController->findObject((modelRelation->*endUid)()); QMT_CHECK(currentTargetMObject); m_modelController->undoController()->beginMergeSequence(tr("Relocate Relation")); + // move relation into new target if it was a child of the old target if (currentTargetMObject == modelRelation->owner()) m_modelController->moveRelation(targetMObject, modelRelation); + // remove relation on all diagrams where the new targe element does not exist + foreach (MDiagram *diagram, m_diagramController->allDiagrams()) { + if (DElement *diagramRelation = m_diagramController->findDelegate(modelRelation, diagram)) { + if (!m_diagramController->findDelegate(targetMObject, diagram)) { + m_diagramController->removeElement(diagramRelation, diagram); + } + } + } + // update end of relation m_modelController->startUpdateRelation(modelRelation); (modelRelation->*setEndUid)(targetMObject->uid()); m_modelController->finishUpdateRelation(modelRelation, false); |