aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJochen Becher <jochen_becher@gmx.de>2016-07-01 17:57:10 +0200
committerJochen Becher <jochen_becher@gmx.de>2016-07-04 13:56:04 +0000
commit1bb11c5b83eaa6d7a2c915a3baa4848a9f8a8035 (patch)
tree29a96d019485a0f020226372ed27916cd9d01629
parent222f89472f72f0412780e2ebae046ff4af8e6795 (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.h1
-rw-r--r--src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp10
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);