diff options
author | Jochen Becher <[email protected]> | 2018-10-01 20:15:24 +0200 |
---|---|---|
committer | Jochen Becher <[email protected]> | 2018-10-08 17:08:45 +0000 |
commit | e8625433bebeeaa960fd8d683f5d34197cf07ecc (patch) | |
tree | b4df1abbf15309e7a850bd547a568264353106ac /src/libs/modelinglib | |
parent | ca69b8a8a8c7c71fc9c77317ff782fee6c166253 (diff) |
ModelEditor: Show base class names
The names of bases classes that are not related on a diagram are listed
in the class' top left edge.
Change-Id: I60198a0401adacf5abb6e1f6bf7bb36e67c9c7ca
Reviewed-by: Tobias Hunger <[email protected]>
Diffstat (limited to 'src/libs/modelinglib')
4 files changed, 85 insertions, 3 deletions
diff --git a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp index 8be34efd8c4..f4dbd24c1a2 100644 --- a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp +++ b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp @@ -765,6 +765,7 @@ void DiagramSceneModel::onEndUpdateElement(int row, const MDiagram *diagram) if (diagram == m_diagram) { QGraphicsItem *item = m_graphicsItems.at(row); updateGraphicsItem(item, diagram->diagramElements().at(row)); + // TODO update all relations and their other end's (e.g. class name may have changed) recalcSceneRectSize(); } m_busyState = NotBusy; @@ -789,6 +790,15 @@ void DiagramSceneModel::onEndInsertElement(int row, const MDiagram *diagram) updateGraphicsItem(item, element); m_graphicsScene->invalidate(); updateGraphicsItem(item, element); + // if element is relation update ends + if (DRelation *dRelation = dynamic_cast<DRelation *>(element)) { + DElement *dEnd = m_diagramController->findElement(dRelation->endAUid(), diagram); + if (dEnd) + updateGraphicsItem(graphicsItem(dEnd), dEnd); + dEnd = m_diagramController->findElement(dRelation->endBUid(), diagram); + if (dEnd) + updateGraphicsItem(graphicsItem(dEnd), dEnd); + } recalcSceneRectSize(); } m_busyState = NotBusy; @@ -798,6 +808,12 @@ void DiagramSceneModel::onBeginRemoveElement(int row, const MDiagram *diagram) { QMT_CHECK(m_busyState == NotBusy); if (diagram == m_diagram) { + // if element is relation store end's uid + m_relationEndsUid.clear(); + if (DRelation *relation = dynamic_cast<DRelation *>(diagram->diagramElements().at(row))) { + m_relationEndsUid.append(relation->endAUid()); + m_relationEndsUid.append(relation->endBUid()); + } QGraphicsItem *item = m_graphicsItems.takeAt(row); deleteGraphicsItem(item, diagram->diagramElements().at(row)); recalcSceneRectSize(); @@ -810,6 +826,12 @@ void DiagramSceneModel::onEndRemoveElement(int row, const MDiagram *diagram) Q_UNUSED(row); Q_UNUSED(diagram); QMT_CHECK(m_busyState == RemoveElement); + // update elements from store (see above) + for (const Uid &end_uid : m_relationEndsUid) { + DElement *dEnd = m_diagramController->findElement(end_uid, diagram); + if (dEnd) + updateGraphicsItem(graphicsItem(dEnd), dEnd); + } m_busyState = NotBusy; } diff --git a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.h b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.h index 46b1641bd98..3a669da5d0b 100644 --- a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.h +++ b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.h @@ -190,6 +190,7 @@ private: OriginItem *m_originItem = nullptr; QGraphicsItem *m_focusItem = nullptr; QRectF m_sceneRect; + QList<Uid> m_relationEndsUid; }; } // namespace qmt diff --git a/src/libs/modelinglib/qmt/diagram_scene/items/classitem.cpp b/src/libs/modelinglib/qmt/diagram_scene/items/classitem.cpp index a6a2a37c46b..04b3acd77e2 100644 --- a/src/libs/modelinglib/qmt/diagram_scene/items/classitem.cpp +++ b/src/libs/modelinglib/qmt/diagram_scene/items/classitem.cpp @@ -27,6 +27,8 @@ #include "qmt/controller/namecontroller.h" #include "qmt/diagram/dclass.h" +#include "qmt/diagram/dinheritance.h" +#include "qmt/diagram_controller/diagramcontroller.h" #include "qmt/diagram_scene/diagramsceneconstants.h" #include "qmt/diagram_scene/diagramscenemodel.h" #include "qmt/diagram_scene/parts/contextlabelitem.h" @@ -41,6 +43,7 @@ #include "qmt/model/mclass.h" #include "qmt/model/mclassmember.h" #include "qmt/model/massociation.h" +#include "qmt/model/minheritance.h" #include "qmt/model_controller/modelcontroller.h" #include "qmt/stereotype/stereotypecontroller.h" #include "qmt/stereotype/stereotypeicon.h" @@ -71,6 +74,7 @@ static const qreal MINIMUM_AUTO_WIDTH = 80.0; static const qreal MINIMUM_AUTO_HEIGHT = 60.0; static const qreal BODY_VERT_BORDER = 4.0; static const qreal BODY_HORIZ_BORDER = 4.0; +static const qreal BODY_HORIZ_DISTANCE = 4.0; ClassItem::ClassItem(DClass *klass, DiagramSceneModel *diagramSceneModel, QGraphicsItem *parent) : ObjectItem("class", klass, diagramSceneModel, parent) @@ -130,6 +134,46 @@ void ClassItem::update() // stereotypes updateStereotypes(stereotypeIconId(), stereotypeIconDisplay(), style); + // base classes + DiagramController *diagramController = diagramSceneModel()->diagramController(); + ModelController *modelController = diagramController->modelController(); + MClass *klass = modelController->findElement<MClass>(diagramClass->modelUid()); + if (klass) { + // TODO cache relation's Uids and check for change + QList<QString> baseClasses; + for (const auto &handle : klass->relations()) { + if (MInheritance *mInheritance = dynamic_cast<MInheritance *>(handle.target())) { + if (mInheritance->base() != klass->uid()) { + DInheritance *dInheritance = diagramController->findDelegate<DInheritance>(mInheritance, diagramSceneModel()->diagram()); + if (dInheritance) { + DClass *dBaseClass = diagramController->findElement<DClass>(dInheritance->base(), diagramSceneModel()->diagram()); + if (dBaseClass) + continue; + } + MClass *mBaseClass = diagramController->modelController()->findElement<MClass>(mInheritance->base()); + if (mBaseClass) { + QString baseClassName; + baseClassName += mBaseClass->name(); + baseClasses.append(baseClassName); + } + } + } + } + if (!baseClasses.isEmpty()) { + if (!m_baseClasses) + m_baseClasses = new QGraphicsSimpleTextItem(this); + QFont font = style->smallFont(); + font.setItalic(true); + m_baseClasses->setFont(font); + m_baseClasses->setBrush(style->textBrush()); + m_baseClasses->setText(baseClasses.join('\n')); + } else if (m_baseClasses) { + m_baseClasses->scene()->removeItem(m_baseClasses); + delete m_baseClasses; + m_baseClasses = nullptr; + } + } + // namespace if (!suppressTextDisplay() && !diagramClass->umlNamespace().isEmpty()) { if (!m_namespace) @@ -487,10 +531,18 @@ QSizeF ClassItem::calcMinimumGeometry() const } height += BODY_VERT_BORDER; + double top_row_width = BODY_HORIZ_DISTANCE; + double top_row_height = 0; if (CustomIconItem *stereotypeIconItem = this->stereotypeIconItem()) { - width = std::max(width, stereotypeIconItem->boundingRect().width()); - height += stereotypeIconItem->boundingRect().height(); + top_row_width += stereotypeIconItem->boundingRect().width(); + top_row_height = stereotypeIconItem->boundingRect().height(); } + if (m_baseClasses) { + top_row_width += m_baseClasses->boundingRect().width(); + top_row_height = std::max(top_row_height, m_baseClasses->boundingRect().height()); + } + width = std::max(width, top_row_width); + height += top_row_height; if (StereotypesItem *stereotypesItem = this->stereotypesItem()) { width = std::max(width, stereotypesItem->boundingRect().width()); height += stereotypesItem->boundingRect().height(); @@ -604,10 +656,16 @@ void ClassItem::updateGeometry() } else { y += BODY_VERT_BORDER; } + double first_row_height = 0; + if (m_baseClasses) { + m_baseClasses->setPos(left + BODY_HORIZ_BORDER, y); + first_row_height = m_baseClasses->boundingRect().height(); + } if (CustomIconItem *stereotypeIconItem = this->stereotypeIconItem()) { stereotypeIconItem->setPos(right - stereotypeIconItem->boundingRect().width() - BODY_HORIZ_BORDER, y); - y += stereotypeIconItem->boundingRect().height(); + first_row_height = std::max(first_row_height, stereotypeIconItem->boundingRect().height()); } + y += first_row_height; if (StereotypesItem *stereotypesItem = this->stereotypesItem()) { stereotypesItem->setPos(-stereotypesItem->boundingRect().width() / 2.0, y); y += stereotypesItem->boundingRect().height(); diff --git a/src/libs/modelinglib/qmt/diagram_scene/items/classitem.h b/src/libs/modelinglib/qmt/diagram_scene/items/classitem.h index 9fa9dc40bdc..72c399042d0 100644 --- a/src/libs/modelinglib/qmt/diagram_scene/items/classitem.h +++ b/src/libs/modelinglib/qmt/diagram_scene/items/classitem.h @@ -79,6 +79,7 @@ private: CustomIconItem *m_customIcon = nullptr; QGraphicsRectItem *m_shape = nullptr; + QGraphicsSimpleTextItem *m_baseClasses = nullptr; QGraphicsSimpleTextItem *m_namespace = nullptr; ContextLabelItem *m_contextLabel = nullptr; QGraphicsLineItem *m_attributesSeparator = nullptr; |