diff options
author | Jochen Becher <jochen_becher@gmx.de> | 2017-12-28 10:46:45 +0100 |
---|---|---|
committer | Jochen Becher <jochen_becher@gmx.de> | 2018-01-09 14:22:38 +0000 |
commit | 09bdb4f8cdf822ec25f0546f378fd139f742bb14 (patch) | |
tree | 4dcc065c4ae003f0eab473359b8c2f24983e2456 /src/libs/modelinglib | |
parent | a3f4a6baa64045b628bed3b09548563b5b79c8c3 (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')
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); |