aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/modelinglib
diff options
context:
space:
mode:
authorJochen Becher <jochen_becher@gmx.de>2017-12-28 10:46:45 +0100
committerJochen Becher <jochen_becher@gmx.de>2018-01-09 14:22:38 +0000
commit09bdb4f8cdf822ec25f0546f378fd139f742bb14 (patch)
tree4dcc065c4ae003f0eab473359b8c2f24983e2456 /src/libs/modelinglib
parenta3f4a6baa64045b628bed3b09548563b5b79c8c3 (diff)
ModelEditor: Implement new feature "add related elements"
Change-Id: Ifff6696204546a99af714d96078d1b2ff4cd6e3c Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src/libs/modelinglib')
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/items/objectitem.cpp6
-rw-r--r--src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp46
-rw-r--r--src/libs/modelinglib/qmt/tasks/diagramscenecontroller.h1
3 files changed, 53 insertions, 0 deletions
diff --git a/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.cpp b/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.cpp
index 1f6664498df..a53e0958b3e 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.cpp
+++ b/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.cpp
@@ -997,6 +997,7 @@ void ObjectItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
alignMenu.addAction(new ContextMenuAction(tr("Same Size"), "sameSize", &alignMenu));
alignMenu.setEnabled(m_diagramSceneModel->hasMultiObjectsSelection());
menu.addMenu(&alignMenu);
+ menu.addAction(new ContextMenuAction(tr("Add Related Elements"), "addRelatedElements", &menu));
QAction *selectedAction = menu.exec(event->screenPos());
if (selectedAction) {
@@ -1039,6 +1040,11 @@ void ObjectItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
align(IAlignable::AlignHeight, "height");
} else if (action->id() == "sameSize") {
align(IAlignable::AlignSize, "size");
+ } else if (action->id() == "addRelatedElements") {
+ DSelection selection = m_diagramSceneModel->selectedElements();
+ if (selection.isEmpty())
+ selection.append(m_object->uid(), m_diagramSceneModel->diagram()->uid());
+ m_diagramSceneModel->diagramSceneController()->addRelatedElements(selection, m_diagramSceneModel->diagram());
}
}
}
diff --git a/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp b/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp
index 246b5a18c6c..5794c4d9bbc 100644
--- a/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp
+++ b/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.cpp
@@ -60,6 +60,7 @@
#include "qmt/tasks/alignonrastervisitor.h"
#include "qmt/tasks/isceneinspector.h"
#include "qmt/tasks/voidelementtasks.h"
+#include "utils/asconst.h"
#include <QMenu>
#include <QFileInfo>
@@ -67,6 +68,8 @@
#include <QQueue>
#include <QPair>
+#include <cmath>
+
namespace qmt {
namespace {
@@ -438,6 +441,49 @@ void DiagramSceneController::dropNewModelElement(MObject *modelObject, MPackage
emit newElementCreated(element, diagram);
}
+void DiagramSceneController::addRelatedElements(const DSelection &selection, MDiagram *diagram)
+{
+ m_diagramController->undoController()->beginMergeSequence(tr("Add Related Element"));
+ foreach (const DSelection::Index &index, selection.indices()) {
+ DElement *delement = m_diagramController->findElement(index.elementKey(), diagram);
+ QMT_ASSERT(delement, return);
+ DObject *dobject = dynamic_cast<DObject *>(delement);
+ if (dobject && dobject->modelUid().isValid()) {
+ MObject *mobject = m_modelController->findElement<MObject>(delement->modelUid());
+ if (mobject) {
+ qreal dAngle = 360.0 / 11.5;
+ qreal dRadius = 100.0;
+ const QList<MRelation *> relations = m_modelController->findRelationsOfObject(mobject);
+ int count = 0;
+ for (MRelation *relation : relations) {
+ if (relation->endAUid() != mobject->uid() || relation->endBUid() != mobject->uid())
+ ++count;
+ }
+ if (count <= 12) {
+ dAngle = 360.0 / 12.0;
+ dRadius = 0.0;
+ }
+ qreal radius = 200.0;
+ qreal angle = 0.0;
+ for (MRelation *relation : relations) {
+ QPointF pos(dobject->pos());
+ pos += QPointF(radius * sin(angle / 180 * M_PI), -radius * cos(angle / 180 * M_PI));
+ bool added = false;
+ if (relation->endAUid() != mobject->uid())
+ added = addModelElement(relation->endAUid(), pos, diagram) != nullptr;
+ else if (relation->endBUid() != mobject->uid())
+ added = addModelElement(relation->endBUid(), pos, diagram) != nullptr;
+ if (added) {
+ radius += dRadius / (360.0 / dAngle);
+ angle += dAngle;
+ }
+ }
+ }
+ }
+ }
+ m_diagramController->undoController()->endMergeSequence();
+}
+
MPackage *DiagramSceneController::findSuitableParentPackage(DElement *topmostDiagramElement, MDiagram *diagram)
{
MPackage *parentPackage = nullptr;
diff --git a/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.h b/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.h
index d0483a03012..97717cbc21d 100644
--- a/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.h
+++ b/src/libs/modelinglib/qmt/tasks/diagramscenecontroller.h
@@ -108,6 +108,7 @@ public:
DElement *topMostElementAtPos, const QPointF &pos, MDiagram *diagram, const QPoint &viewPos, const QSize &viewSize);
void dropNewModelElement(MObject *modelObject, MPackage *parentPackage, const QPointF &pos,
MDiagram *diagram);
+ void addRelatedElements(const DSelection &selection, MDiagram *diagram);
MPackage *findSuitableParentPackage(DElement *topmostDiagramElement, MDiagram *diagram);
MDiagram *findDiagramBySearchId(MPackage *package, const QString &diagramName);