ModelEditor: Introduce custom relation type "Connection"

Change-Id: Iddd45508dcb2de1fa2b6d9b2b881b54a73172caf
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Jochen Becher
2016-08-23 21:47:12 +02:00
parent 82cb2b248e
commit ffb5dc756a
47 changed files with 1252 additions and 73 deletions

View File

@@ -31,6 +31,7 @@
#include "qmt/diagram/dboundary.h"
#include "qmt/diagram/dclass.h"
#include "qmt/diagram/dcomponent.h"
#include "qmt/diagram/dconnection.h"
#include "qmt/diagram/ddependency.h"
#include "qmt/diagram/ddiagram.h"
#include "qmt/diagram/ditem.h"
@@ -135,6 +136,11 @@ void AlignOnRasterVisitor::visitDAssociation(DAssociation *association)
visitDRelation(association);
}
void AlignOnRasterVisitor::visitDConnection(DConnection *connection)
{
visitDRelation(connection);
}
void AlignOnRasterVisitor::visitDAnnotation(DAnnotation *annotation)
{
IMoveable *moveable = m_sceneInspector->moveable(annotation, m_diagram);

View File

@@ -55,6 +55,7 @@ public:
void visitDInheritance(DInheritance *inheritance) override;
void visitDDependency(DDependency *dependency) override;
void visitDAssociation(DAssociation *association) override;
void visitDConnection(DConnection *connection) override;
void visitDAnnotation(DAnnotation *annotation) override;
void visitDBoundary(DBoundary *boundary) override;

View File

@@ -37,6 +37,7 @@
#include "qmt/diagram/ditem.h"
#include "qmt/diagram/drelation.h"
#include "qmt/diagram/dassociation.h"
#include "qmt/diagram/dconnection.h"
#include "qmt/diagram_ui/diagram_mime_types.h"
#include "qmt/model_controller/modelcontroller.h"
#include "qmt/model_controller/mselection.h"
@@ -45,6 +46,7 @@
#include "qmt/model/mcanvasdiagram.h"
#include "qmt/model/mclass.h"
#include "qmt/model/mcomponent.h"
#include "qmt/model/mconnection.h"
#include "qmt/model/mdependency.h"
#include "qmt/model/mdiagram.h"
#include "qmt/model/minheritance.h"
@@ -81,12 +83,14 @@ public:
void visitMObject(const MObject *object) override
{
Q_UNUSED(object);
// TODO enhance with handling MConnection
m_accepted = dynamic_cast<const MDependency *>(m_relation) != 0;
}
void visitMClass(const MClass *klass) override
{
Q_UNUSED(klass);
// TODO enhance with handling MConnection
m_accepted = dynamic_cast<const MDependency *>(m_relation) != 0
|| dynamic_cast<const MInheritance *>(m_relation) != 0
|| dynamic_cast<const MAssociation *>(m_relation) != 0;
@@ -257,6 +261,44 @@ void DiagramSceneController::createAssociation(DClass *endAClass, DClass *endBCl
emit newElementCreated(relation, diagram);
}
void DiagramSceneController::createConnection(const QString &customRelationId,
DObject *endAObject, DObject *endBObject,
const QList<QPointF> &intermediatePoints, MDiagram *diagram,
std::function<void (MConnection *, DConnection *)> custom)
{
m_diagramController->undoController()->beginMergeSequence(tr("Create Connection"));
MObject *endAModelObject = m_modelController->findObject<MObject>(endAObject->modelUid());
QMT_CHECK(endAModelObject);
MObject *endBModelObject = m_modelController->findObject<MObject>(endBObject->modelUid());
QMT_CHECK(endBModelObject);
// TODO allow self assignment with just one intermediate point and a nice round arrow
if (endAModelObject == endBModelObject && intermediatePoints.count() < 2)
return;
auto modelConnection = new MConnection();
modelConnection->setCustomRelationId(customRelationId);
modelConnection->setEndAUid(endAModelObject->uid());
MConnectionEnd endA = modelConnection->endA();
endA.setNavigable(true);
modelConnection->setEndA(endA);
modelConnection->setEndBUid(endBModelObject->uid());
m_modelController->addRelation(endAModelObject, modelConnection);
DRelation *relation = addRelation(modelConnection, intermediatePoints, diagram);
DConnection *diagramConnection = dynamic_cast<DConnection *>(relation);
QMT_CHECK(diagramConnection);
if (custom)
custom(modelConnection, diagramConnection);
m_diagramController->undoController()->endMergeSequence();
if (relation)
emit newElementCreated(relation, diagram);
}
bool DiagramSceneController::relocateRelationEndA(DRelation *relation, DObject *targetObject)
{
return relocateRelationEnd(relation, targetObject, &MRelation::endAUid, &MRelation::setEndAUid);

View File

@@ -44,11 +44,13 @@ class MPackage;
class MDiagram;
class MRelation;
class MAssociation;
class MConnection;
class DElement;
class DObject;
class DClass;
class DRelation;
class DAssociation;
class DConnection;
class DSelection;
class IElementTasks;
class ISceneInspector;
@@ -86,6 +88,9 @@ public:
void createAssociation(DClass *endAClass, DClass *endBClass,
const QList<QPointF> &intermediatePoints, MDiagram *diagram,
std::function<void (MAssociation*, DAssociation*)> custom = 0);
void createConnection(const QString &customRelationId, DObject *endAObject, DObject *endBObject,
const QList<QPointF> &intermediatePoints, MDiagram *diagram,
std::function<void (MConnection*, DConnection*)> custom = 0);
bool relocateRelationEndA(DRelation *relation, DObject *targetObject);
bool relocateRelationEndB(DRelation *relation, DObject *targetObject);