ModelEditor: Refactor relationables into common parent class

Change-Id: Id863a5004cb903cbc2929745e818e5810ff70dd2
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Jochen Becher
2016-06-26 20:39:59 +02:00
parent 8100812531
commit 6ea47c98fb
10 changed files with 71 additions and 103 deletions

View File

@@ -227,23 +227,7 @@ void ClassItem::update()
} }
updateSelectionMarker(m_customIcon); updateSelectionMarker(m_customIcon);
updateRelationStarter();
// relation starters
if (isFocusSelected()) {
if (!m_relationStarter) {
m_relationStarter = new RelationStarter(this, diagramSceneModel(), 0);
scene()->addItem(m_relationStarter);
m_relationStarter->setZValue(RELATION_STARTER_ZVALUE);
m_relationStarter->addArrow(QLatin1String("inheritance"), ArrowItem::ShaftSolid, ArrowItem::HeadTriangle);
m_relationStarter->addArrow(QLatin1String("dependency"), ArrowItem::ShaftDashed, ArrowItem::HeadOpen);
m_relationStarter->addArrow(QLatin1String("association"), ArrowItem::ShaftSolid, ArrowItem::HeadFilledTriangle);
}
} else if (m_relationStarter) {
scene()->removeItem(m_relationStarter);
delete m_relationStarter;
m_relationStarter = 0;
}
updateAlignmentButtons(); updateAlignmentButtons();
updateGeometry(); updateGeometry();
} }
@@ -263,11 +247,6 @@ QSizeF ClassItem::minimumSize() const
return calcMinimumGeometry(); return calcMinimumGeometry();
} }
QPointF ClassItem::relationStartPos() const
{
return pos();
}
void ClassItem::relationDrawn(const QString &id, const QPointF &toScenePos, const QList<QPointF> &intermediatePoints) void ClassItem::relationDrawn(const QString &id, const QPointF &toScenePos, const QList<QPointF> &intermediatePoints)
{ {
DElement *targetElement = diagramSceneModel()->findTopmostElement(toScenePos); DElement *targetElement = diagramSceneModel()->findTopmostElement(toScenePos);
@@ -359,6 +338,13 @@ void ClassItem::setFromDisplayName(const QString &displayName)
} }
} }
void ClassItem::updateRelationStarterTools(RelationStarter *relationStarter)
{
relationStarter->addArrow("dependency", ArrowItem::ShaftDashed, ArrowItem::HeadOpen);
relationStarter->addArrow("inheritance", ArrowItem::ShaftSolid, ArrowItem::HeadTriangle);
relationStarter->addArrow("association", ArrowItem::ShaftSolid, ArrowItem::HeadFilledTriangle);
}
DClass::TemplateDisplay ClassItem::templateDisplay() const DClass::TemplateDisplay ClassItem::templateDisplay() const
{ {
auto diagramClass = dynamic_cast<DClass *>(object()); auto diagramClass = dynamic_cast<DClass *>(object());
@@ -535,10 +521,7 @@ void ClassItem::updateGeometry()
} }
updateSelectionMarkerGeometry(rect); updateSelectionMarkerGeometry(rect);
updateRelationStarterGeometry(rect);
if (m_relationStarter)
m_relationStarter->setPos(mapToScene(QPointF(right + 8.0, top)));
updateAlignmentButtonsGeometry(rect); updateAlignmentButtonsGeometry(rect);
updateDepth(); updateDepth();
} }

View File

@@ -27,7 +27,6 @@
#include "objectitem.h" #include "objectitem.h"
#include "qmt/diagram_scene/capabilities/relationable.h"
#include "qmt/diagram/dclass.h" #include "qmt/diagram/dclass.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@@ -43,10 +42,9 @@ class DiagramSceneModel;
class CustomIconItem; class CustomIconItem;
class ContextLabelItem; class ContextLabelItem;
class TemplateParameterBox; class TemplateParameterBox;
class RelationStarter;
class Style; class Style;
class ClassItem : public ObjectItem, public IRelationable class ClassItem : public ObjectItem
{ {
Q_DECLARE_TR_FUNCTIONS(qmt::ClassItem) Q_DECLARE_TR_FUNCTIONS(qmt::ClassItem)
@@ -61,7 +59,6 @@ public:
QSizeF minimumSize() const override; QSizeF minimumSize() const override;
QPointF relationStartPos() const override;
void relationDrawn(const QString &id, const QPointF &toScenePos, void relationDrawn(const QString &id, const QPointF &toScenePos,
const QList<QPointF> &intermediatePoints) override; const QList<QPointF> &intermediatePoints) override;
@@ -70,6 +67,7 @@ protected:
bool handleSelectedContextMenuAction(const QString &id) override; bool handleSelectedContextMenuAction(const QString &id) override;
QString buildDisplayName() const override; QString buildDisplayName() const override;
void setFromDisplayName(const QString &displayName) override; void setFromDisplayName(const QString &displayName) override;
void updateRelationStarterTools(RelationStarter *relationStarter) override;
private: private:
DClass::TemplateDisplay templateDisplay() const; DClass::TemplateDisplay templateDisplay() const;
@@ -88,7 +86,6 @@ private:
QString m_methodsText; QString m_methodsText;
QGraphicsTextItem *m_methods = 0; QGraphicsTextItem *m_methods = 0;
TemplateParameterBox *m_templateParameterBox = 0; TemplateParameterBox *m_templateParameterBox = 0;
RelationStarter *m_relationStarter = 0;
}; };
} // namespace qmt } // namespace qmt

View File

@@ -217,23 +217,6 @@ QList<ILatchable::Latch> ComponentItem::verticalLatches(ILatchable::Action actio
return ObjectItem::verticalLatches(action, grabbedItem); return ObjectItem::verticalLatches(action, grabbedItem);
} }
QPointF ComponentItem::relationStartPos() const
{
return pos();
}
void ComponentItem::relationDrawn(const QString &id, const QPointF &toScenePos, const QList<QPointF> &intermediatePoints)
{
DElement *targetElement = diagramSceneModel()->findTopmostElement(toScenePos);
if (targetElement) {
if (id == QStringLiteral("dependency")) {
auto dependantObject = dynamic_cast<DObject *>(targetElement);
if (dependantObject)
diagramSceneModel()->diagramSceneController()->createDependency(object(), dependantObject, intermediatePoints, diagramSceneModel()->diagram());
}
}
}
bool ComponentItem::hasPlainShape() const bool ComponentItem::hasPlainShape() const
{ {
auto diagramComponent = dynamic_cast<DComponent *>(object()); auto diagramComponent = dynamic_cast<DComponent *>(object());

View File

@@ -27,8 +27,6 @@
#include "objectitem.h" #include "objectitem.h"
#include "qmt/diagram_scene/capabilities/relationable.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QGraphicsRectItem; class QGraphicsRectItem;
class QGraphicsSimpleTextItem; class QGraphicsSimpleTextItem;
@@ -43,7 +41,7 @@ class CustomIconItem;
class ContextLabelItem; class ContextLabelItem;
class RelationStarter; class RelationStarter;
class ComponentItem : public ObjectItem, public IRelationable class ComponentItem : public ObjectItem
{ {
public: public:
ComponentItem(DComponent *component, DiagramSceneModel *diagramSceneModel, ComponentItem(DComponent *component, DiagramSceneModel *diagramSceneModel,
@@ -60,10 +58,6 @@ public:
QList<Latch> horizontalLatches(Action action, bool grabbedItem) const override; QList<Latch> horizontalLatches(Action action, bool grabbedItem) const override;
QList<Latch> verticalLatches(Action action, bool grabbedItem) const override; QList<Latch> verticalLatches(Action action, bool grabbedItem) const override;
QPointF relationStartPos() const override;
void relationDrawn(const QString &id, const QPointF &toScenePos, const
QList<QPointF> &intermediatePoints) override;
private: private:
bool hasPlainShape() const; bool hasPlainShape() const;
QSizeF calcMinimumGeometry() const; QSizeF calcMinimumGeometry() const;

View File

@@ -175,23 +175,6 @@ QList<ILatchable::Latch> ItemItem::verticalLatches(ILatchable::Action action, bo
return ObjectItem::verticalLatches(action, grabbedItem); return ObjectItem::verticalLatches(action, grabbedItem);
} }
QPointF ItemItem::relationStartPos() const
{
return pos();
}
void ItemItem::relationDrawn(const QString &id, const QPointF &toScenePos, const QList<QPointF> &intermediatePoints)
{
DElement *targetElement = diagramSceneModel()->findTopmostElement(toScenePos);
if (targetElement) {
if (id == QStringLiteral("dependency")) {
auto dependantObject = dynamic_cast<DObject *>(targetElement);
if (dependantObject)
diagramSceneModel()->diagramSceneController()->createDependency(object(), dependantObject, intermediatePoints, diagramSceneModel()->diagram());
}
}
}
QSizeF ItemItem::calcMinimumGeometry() const QSizeF ItemItem::calcMinimumGeometry() const
{ {
double width = 0.0; double width = 0.0;

View File

@@ -27,8 +27,6 @@
#include "objectitem.h" #include "objectitem.h"
#include "qmt/diagram_scene/capabilities/relationable.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QGraphicsRectItem; class QGraphicsRectItem;
class QGraphicsSimpleTextItem; class QGraphicsSimpleTextItem;
@@ -43,7 +41,7 @@ class CustomIconItem;
class ContextLabelItem; class ContextLabelItem;
class RelationStarter; class RelationStarter;
class ItemItem : public ObjectItem, public IRelationable class ItemItem : public ObjectItem
{ {
public: public:
ItemItem(DItem *item, DiagramSceneModel *diagramSceneModel, QGraphicsItem *parent = 0); ItemItem(DItem *item, DiagramSceneModel *diagramSceneModel, QGraphicsItem *parent = 0);
@@ -59,10 +57,6 @@ public:
QList<Latch> horizontalLatches(Action action, bool grabbedItem) const override; QList<Latch> horizontalLatches(Action action, bool grabbedItem) const override;
QList<Latch> verticalLatches(Action action, bool grabbedItem) const override; QList<Latch> verticalLatches(Action action, bool grabbedItem) const override;
QPointF relationStartPos() const override;
void relationDrawn(const QString &id, const QPointF &toScenePos,
const QList<QPointF> &intermediatePoints) override;
private: private:
QSizeF calcMinimumGeometry() const; QSizeF calcMinimumGeometry() const;
void updateGeometry(); void updateGeometry();

View File

@@ -34,6 +34,7 @@
#include "qmt/diagram_scene/parts/alignbuttonsitem.h" #include "qmt/diagram_scene/parts/alignbuttonsitem.h"
#include "qmt/diagram_scene/parts/editabletextitem.h" #include "qmt/diagram_scene/parts/editabletextitem.h"
#include "qmt/diagram_scene/parts/rectangularselectionitem.h" #include "qmt/diagram_scene/parts/rectangularselectionitem.h"
#include "qmt/diagram_scene/parts/relationstarter.h"
#include "qmt/diagram_scene/parts/customiconitem.h" #include "qmt/diagram_scene/parts/customiconitem.h"
#include "qmt/diagram_scene/parts/stereotypesitem.h" #include "qmt/diagram_scene/parts/stereotypesitem.h"
#include "qmt/infrastructure/contextmenuaction.h" #include "qmt/infrastructure/contextmenuaction.h"
@@ -301,6 +302,23 @@ QList<ILatchable::Latch> ObjectItem::verticalLatches(ILatchable::Action action,
return result; return result;
} }
QPointF ObjectItem::relationStartPos() const
{
return pos();
}
void ObjectItem::relationDrawn(const QString &id, const QPointF &toScenePos, const QList<QPointF> &intermediatePoints)
{
DElement *targetElement = diagramSceneModel()->findTopmostElement(toScenePos);
if (targetElement) {
if (id == QLatin1String("dependency")) {
auto dependantObject = dynamic_cast<DObject *>(targetElement);
if (dependantObject)
diagramSceneModel()->diagramSceneController()->createDependency(object(), dependantObject, intermediatePoints, diagramSceneModel()->diagram());
}
}
}
void ObjectItem::align(IAlignable::AlignType alignType, const QString &identifier) void ObjectItem::align(IAlignable::AlignType alignType, const QString &identifier)
{ {
Q_UNUSED(identifier); // avoid warning in release mode Q_UNUSED(identifier); // avoid warning in release mode
@@ -569,6 +587,34 @@ void ObjectItem::updateSelectionMarkerGeometry(const QRectF &objectRect)
m_selectionMarker->setRect(objectRect); m_selectionMarker->setRect(objectRect);
} }
void ObjectItem::updateRelationStarter()
{
if (isFocusSelected()) {
if (!m_relationStarter) {
m_relationStarter = new RelationStarter(this, diagramSceneModel(), 0);
scene()->addItem(m_relationStarter);
m_relationStarter->setZValue(RELATION_STARTER_ZVALUE);
updateRelationStarterTools(m_relationStarter);
}
} else if (m_relationStarter) {
scene()->removeItem(m_relationStarter);
delete m_relationStarter;
m_relationStarter = 0;
}
}
void ObjectItem::updateRelationStarterTools(RelationStarter *relationStarter)
{
relationStarter->addArrow(QLatin1String("dependency"), ArrowItem::ShaftDashed, ArrowItem::HeadOpen);
}
void ObjectItem::updateRelationStarterGeometry(const QRectF &objectRect)
{
if (m_relationStarter)
m_relationStarter->setPos(mapToScene(QPointF(objectRect.right() + 8.0, objectRect.top())));
}
void ObjectItem::updateAlignmentButtons() void ObjectItem::updateAlignmentButtons()
{ {
if (isFocusSelected() && m_diagramSceneModel->hasMultiObjectsSelection()) { if (isFocusSelected() && m_diagramSceneModel->hasMultiObjectsSelection()) {

View File

@@ -32,6 +32,7 @@
#include "qmt/diagram_scene/capabilities/moveable.h" #include "qmt/diagram_scene/capabilities/moveable.h"
#include "qmt/diagram_scene/capabilities/selectable.h" #include "qmt/diagram_scene/capabilities/selectable.h"
#include "qmt/diagram_scene/capabilities/latchable.h" #include "qmt/diagram_scene/capabilities/latchable.h"
#include "qmt/diagram_scene/capabilities/relationable.h"
#include "qmt/diagram_scene/capabilities/alignable.h" #include "qmt/diagram_scene/capabilities/alignable.h"
#include "qmt/diagram_scene/capabilities/editable.h" #include "qmt/diagram_scene/capabilities/editable.h"
@@ -51,6 +52,7 @@ class StereotypesItem;
class CustomIconItem; class CustomIconItem;
class EditableTextItem; class EditableTextItem;
class RectangularSelectionItem; class RectangularSelectionItem;
class RelationStarter;
class AlignButtonsItem; class AlignButtonsItem;
class Style; class Style;
@@ -66,6 +68,7 @@ class ObjectItem :
public IMoveable, public IMoveable,
public ISelectable, public ISelectable,
public ILatchable, public ILatchable,
public IRelationable,
public IAlignable, public IAlignable,
public IEditable public IEditable
{ {
@@ -113,6 +116,10 @@ public:
QList<Latch> horizontalLatches(Action action, bool grabbedItem) const override; QList<Latch> horizontalLatches(Action action, bool grabbedItem) const override;
QList<Latch> verticalLatches(Action action, bool grabbedItem) const override; QList<Latch> verticalLatches(Action action, bool grabbedItem) const override;
QPointF relationStartPos() const override;
void relationDrawn(const QString &id, const QPointF &toScenePos,
const QList<QPointF> &intermediatePoints) override;
void align(AlignType alignType, const QString &identifier) override; void align(AlignType alignType, const QString &identifier) override;
bool isEditable() const override; bool isEditable() const override;
@@ -139,6 +146,9 @@ protected:
void updateSelectionMarker(CustomIconItem *customIconItem); void updateSelectionMarker(CustomIconItem *customIconItem);
void updateSelectionMarker(ResizeFlags resizeFlags); void updateSelectionMarker(ResizeFlags resizeFlags);
void updateSelectionMarkerGeometry(const QRectF &objectRect); void updateSelectionMarkerGeometry(const QRectF &objectRect);
void updateRelationStarter();
virtual void updateRelationStarterTools(RelationStarter *relationStarter);
void updateRelationStarterGeometry(const QRectF &objectRect);
void updateAlignmentButtons(); void updateAlignmentButtons();
void updateAlignmentButtonsGeometry(const QRectF &objectRect); void updateAlignmentButtonsGeometry(const QRectF &objectRect);
@@ -169,6 +179,7 @@ private:
CustomIconItem *m_stereotypeIcon = 0; CustomIconItem *m_stereotypeIcon = 0;
EditableTextItem *m_nameItem = 0; EditableTextItem *m_nameItem = 0;
RectangularSelectionItem *m_selectionMarker = 0; RectangularSelectionItem *m_selectionMarker = 0;
RelationStarter *m_relationStarter = 0;
AlignButtonsItem *m_horizontalAlignButtons = 0; AlignButtonsItem *m_horizontalAlignButtons = 0;
AlignButtonsItem *m_verticalAlignButtons = 0; AlignButtonsItem *m_verticalAlignButtons = 0;
}; };

View File

@@ -190,23 +190,6 @@ QList<ILatchable::Latch> PackageItem::verticalLatches(ILatchable::Action action,
return ObjectItem::verticalLatches(action, grabbedItem); return ObjectItem::verticalLatches(action, grabbedItem);
} }
QPointF PackageItem::relationStartPos() const
{
return pos();
}
void PackageItem::relationDrawn(const QString &id, const QPointF &toScenePos, const QList<QPointF> &intermediatePoints)
{
DElement *targetElement = diagramSceneModel()->findTopmostElement(toScenePos);
if (targetElement) {
if (id == QStringLiteral("dependency")) {
auto dependantObject = dynamic_cast<DObject *>(targetElement);
if (dependantObject)
diagramSceneModel()->diagramSceneController()->createDependency(object(), dependantObject, intermediatePoints, diagramSceneModel()->diagram());
}
}
}
PackageItem::ShapeGeometry PackageItem::calcMinimumGeometry() const PackageItem::ShapeGeometry PackageItem::calcMinimumGeometry() const
{ {
double width = 0.0; double width = 0.0;

View File

@@ -27,8 +27,6 @@
#include "objectitem.h" #include "objectitem.h"
#include "qmt/diagram_scene/capabilities/relationable.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QGraphicsPolygonItem; class QGraphicsPolygonItem;
class QGraphicsSimpleTextItem; class QGraphicsSimpleTextItem;
@@ -42,7 +40,7 @@ class CustomIconItem;
class ContextLabelItem; class ContextLabelItem;
class RelationStarter; class RelationStarter;
class PackageItem : public ObjectItem, public IRelationable class PackageItem : public ObjectItem
{ {
class ShapeGeometry; class ShapeGeometry;
@@ -60,10 +58,6 @@ public:
QList<Latch> horizontalLatches(Action action, bool grabbedItem) const override; QList<Latch> horizontalLatches(Action action, bool grabbedItem) const override;
QList<Latch> verticalLatches(Action action, bool grabbedItem) const override; QList<Latch> verticalLatches(Action action, bool grabbedItem) const override;
QPointF relationStartPos() const override;
void relationDrawn(const QString &id, const QPointF &toScenePos,
const QList<QPointF> &intermediatePoints) override;
private: private:
ShapeGeometry calcMinimumGeometry() const; ShapeGeometry calcMinimumGeometry() const;
void updateGeometry(); void updateGeometry();