aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/modelinglib
diff options
context:
space:
mode:
authorJochen Becher <[email protected]>2017-07-29 17:34:08 +0200
committerJochen Becher <[email protected]>2017-08-02 11:13:58 +0000
commit90e40f932d89af9d9e59951d5320da4656db2600 (patch)
tree9a6dd1c00c031db3b0dc5082e9d03b737fb44464 /src/libs/modelinglib
parent4c469e0111e903c4ff692af0e81e3f63ca2192f9 (diff)
ModelEditor: Implement dragging end of custom relations
Change-Id: I38dff44cecd21d32393dfac76d581138dbb6a589 Reviewed-by: Tobias Hunger <[email protected]>
Diffstat (limited to 'src/libs/modelinglib')
-rw-r--r--src/libs/modelinglib/qmt/document_controller/documentcontroller.cpp1
-rw-r--r--src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp70
-rw-r--r--src/libs/modelinglib/qmt/tasks/diagramscenecontroller.h23
3 files changed, 67 insertions, 27 deletions
diff --git a/src/libs/modelinglib/qmt/document_controller/documentcontroller.cpp b/src/libs/modelinglib/qmt/document_controller/documentcontroller.cpp
index f6271ff14d3..626d490f51b 100644
--- a/src/libs/modelinglib/qmt/document_controller/documentcontroller.cpp
+++ b/src/libs/modelinglib/qmt/document_controller/documentcontroller.cpp
@@ -91,6 +91,7 @@ DocumentController::DocumentController(QObject *parent) :
// diagram scene controller
m_diagramSceneController->setModelController(m_modelController);
m_diagramSceneController->setDiagramController(m_diagramController);
+ m_diagramSceneController->setStereotypeController(m_stereotypeController);
// config controller
m_configController->setStereotypeController(m_stereotypeController);
diff --git a/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp b/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp
index 21fef7500bd..74ca11bef5a 100644
--- a/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp
+++ b/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp
@@ -31,13 +31,13 @@
#include "qmt/diagram_controller/diagramcontroller.h"
#include "qmt/diagram_controller/dselection.h"
#include "qmt/diagram/dannotation.h"
+#include "qmt/diagram/dassociation.h"
#include "qmt/diagram/dboundary.h"
#include "qmt/diagram/dclass.h"
-#include "qmt/diagram/dpackage.h"
+#include "qmt/diagram/dconnection.h"
#include "qmt/diagram/ditem.h"
+#include "qmt/diagram/dpackage.h"
#include "qmt/diagram/drelation.h"
-#include "qmt/diagram/dassociation.h"
-#include "qmt/diagram/dconnection.h"
#include "qmt/diagram/dswimlane.h"
#include "qmt/diagram_ui/diagram_mime_types.h"
#include "qmt/model_controller/modelcontroller.h"
@@ -55,6 +55,8 @@
#include "qmt/model/mobject.h"
#include "qmt/model/mpackage.h"
#include "qmt/model/msourceexpansion.h"
+#include "qmt/stereotype/customrelation.h"
+#include "qmt/stereotype/stereotypecontroller.h"
#include "qmt/tasks/alignonrastervisitor.h"
#include "qmt/tasks/isceneinspector.h"
#include "qmt/tasks/voidelementtasks.h"
@@ -74,8 +76,11 @@ static VoidElementTasks dummyElementTasks;
class DiagramSceneController::AcceptRelationVisitor : public MVoidConstVisitor
{
public:
- AcceptRelationVisitor(const MRelation *relation)
- : m_relation(relation)
+ AcceptRelationVisitor(StereotypeController *stereotypeController, const MRelation *relation,
+ RelationEnd relationEnd)
+ : m_stereotypeController(stereotypeController),
+ m_relation(relation),
+ m_relationEnd(relationEnd)
{
}
@@ -84,30 +89,49 @@ public:
void visitMObject(const MObject *object) override
{
Q_UNUSED(object);
- // TODO enhance with handling MConnection
- m_accepted = dynamic_cast<const MDependency *>(m_relation) != 0;
+ if (auto connection = dynamic_cast<const MConnection *>(m_relation)) {
+ CustomRelation customRelation = m_stereotypeController->findCustomRelation(connection->customRelationId());
+ if (!customRelation.isNull()) {
+ QMT_ASSERT(customRelation.element() == CustomRelation::Element::Relation, return);
+ CustomRelation::End customEnd = m_relationEnd == EndA ? customRelation.endA() : customRelation.endB();
+ QStringList endItems = customEnd.endItems();
+ if (endItems.isEmpty())
+ endItems = customRelation.endItems();
+ QString stereotypeIconId = m_stereotypeController->findStereotypeIconId(StereotypeIcon::ElementItem, object->stereotypes());
+ if (stereotypeIconId.isEmpty() && !m_variety.isEmpty())
+ stereotypeIconId = m_stereotypeController->findStereotypeIconId(StereotypeIcon::ElementItem, QStringList(m_variety));
+ m_accepted = endItems.contains(stereotypeIconId);
+ }
+ }
+ if (!m_accepted)
+ m_accepted = dynamic_cast<const MDependency *>(m_relation) != nullptr;
}
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;
+ m_accepted = dynamic_cast<const MInheritance *>(m_relation) != nullptr
+ || dynamic_cast<const MAssociation *>(m_relation) != nullptr;
+ if (!m_accepted)
+ visitMObject(klass);
+ }
+
+ void visitMItem(const MItem *item) override
+ {
+ m_variety = item->variety();
+ visitMObject(item);
}
private:
- const MRelation *m_relation = 0;
+ StereotypeController *m_stereotypeController = nullptr;
+ const MRelation *m_relation = nullptr;
+ RelationEnd m_relationEnd = EndA;
+ QString m_variety;
bool m_accepted = false;
};
DiagramSceneController::DiagramSceneController(QObject *parent)
: QObject(parent),
- m_modelController(0),
- m_diagramController(0),
- m_elementTasks(&dummyElementTasks),
- m_sceneInspector(0)
+ m_elementTasks(&dummyElementTasks)
{
}
@@ -139,6 +163,11 @@ void DiagramSceneController::setDiagramController(DiagramController *diagramCont
m_diagramController = diagramController;
}
+void DiagramSceneController::setStereotypeController(StereotypeController *stereotypeController)
+{
+ m_stereotypeController = stereotypeController;
+}
+
void DiagramSceneController::setElementTasks(IElementTasks *elementTasks)
{
m_elementTasks = elementTasks;
@@ -302,12 +331,12 @@ void DiagramSceneController::createConnection(const QString &customRelationId,
bool DiagramSceneController::relocateRelationEndA(DRelation *relation, DObject *targetObject)
{
- return relocateRelationEnd(relation, targetObject, &MRelation::endAUid, &MRelation::setEndAUid);
+ return relocateRelationEnd(relation, targetObject, EndA, &MRelation::endAUid, &MRelation::setEndAUid);
}
bool DiagramSceneController::relocateRelationEndB(DRelation *relation, DObject *targetObject)
{
- return relocateRelationEnd(relation, targetObject, &MRelation::endBUid, &MRelation::setEndBUid);
+ return relocateRelationEnd(relation, targetObject, EndB, &MRelation::endBUid, &MRelation::setEndBUid);
}
bool DiagramSceneController::isAddingAllowed(const Uid &modelElementKey, MDiagram *diagram)
@@ -770,6 +799,7 @@ DRelation *DiagramSceneController::addRelation(MRelation *modelRelation, const Q
}
bool DiagramSceneController::relocateRelationEnd(DRelation *relation, DObject *targetObject,
+ RelationEnd relationEnd,
Uid (MRelation::*endUid)() const,
void (MRelation::*setEndUid)(const Uid &))
{
@@ -779,7 +809,7 @@ bool DiagramSceneController::relocateRelationEnd(DRelation *relation, DObject *t
QMT_ASSERT(modelRelation, return false);
MObject *targetMObject = m_modelController->findObject(targetObject->modelUid());
QMT_ASSERT(targetMObject, return false);
- AcceptRelationVisitor visitor(modelRelation);
+ AcceptRelationVisitor visitor(m_stereotypeController, modelRelation, relationEnd);
targetMObject->accept(&visitor);
if (visitor.isAccepted()) {
MObject *currentTargetMObject = m_modelController->findObject((modelRelation->*endUid)());
diff --git a/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.h b/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.h
index 3a37791e1e0..4293557c92b 100644
--- a/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.h
+++ b/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.h
@@ -39,6 +39,7 @@ namespace qmt {
class Uid;
class ModelController;
class DiagramController;
+class StereotypeController;
class MObject;
class MPackage;
class MDiagram;
@@ -61,6 +62,11 @@ class QMT_EXPORT DiagramSceneController : public QObject
class AcceptRelationVisitor;
+ enum RelationEnd {
+ EndA,
+ EndB
+ };
+
public:
explicit DiagramSceneController(QObject *parent = 0);
~DiagramSceneController() override;
@@ -74,6 +80,8 @@ public:
void setModelController(ModelController *modelController);
DiagramController *diagramController() const { return m_diagramController; }
void setDiagramController(DiagramController *diagramController);
+ StereotypeController *stereotypeController() const { return m_stereotypeController; }
+ void setStereotypeController(StereotypeController *stereotypeController);
IElementTasks *elementTasks() const { return m_elementTasks; }
void setElementTasks(IElementTasks *elementTasks);
ISceneInspector *sceneInspector() const { return m_sceneInspector; }
@@ -132,13 +140,14 @@ private:
DObject *addObject(MObject *modelObject, const QPointF &pos, MDiagram *diagram);
DRelation *addRelation(MRelation *modelRelation, const QList<QPointF> &intermediatePoints,
MDiagram *diagram);
- bool relocateRelationEnd(DRelation *relation, DObject *targetObject, Uid (MRelation::*endUid)() const,
- void (MRelation::*setEndUid)(const Uid &));
-
- ModelController *m_modelController;
- DiagramController *m_diagramController;
- IElementTasks *m_elementTasks;
- ISceneInspector *m_sceneInspector;
+ bool relocateRelationEnd(DRelation *relation, DObject *targetObject, RelationEnd relationEnd,
+ Uid (MRelation::*endUid)() const, void (MRelation::*setEndUid)(const Uid &));
+
+ ModelController *m_modelController = nullptr;
+ DiagramController *m_diagramController = nullptr;
+ StereotypeController *m_stereotypeController = nullptr;
+ IElementTasks *m_elementTasks = nullptr;
+ ISceneInspector *m_sceneInspector = nullptr;
};
} // namespace qmt