aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/modelinglib
diff options
context:
space:
mode:
authorJochen Becher <[email protected]>2018-10-01 20:15:24 +0200
committerJochen Becher <[email protected]>2018-10-08 17:08:45 +0000
commite8625433bebeeaa960fd8d683f5d34197cf07ecc (patch)
treeb4df1abbf15309e7a850bd547a568264353106ac /src/libs/modelinglib
parentca69b8a8a8c7c71fc9c77317ff782fee6c166253 (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')
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp22
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.h1
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/items/classitem.cpp64
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/items/classitem.h1
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;