diff options
author | Lukáš Lalinský <lalinsky@gmail.com> | 2008-12-12 13:25:38 +0100 |
---|---|---|
committer | Lukáš Lalinský <lalinsky@gmail.com> | 2008-12-12 13:25:38 +0100 |
commit | 8f5d094db7182cef09fe4ee606e2182bf0e433b5 (patch) | |
tree | d6ad909f43a82eccf8c7ac82e49fa7566c066017 | |
parent | 0d706c18d9568286b18e1cef64286e84f2c3e557 (diff) | |
download | dbmodel-8f5d094db7182cef09fe4ee606e2182bf0e433b5.tar.gz dbmodel-8f5d094db7182cef09fe4ee606e2182bf0e433b5.tar.bz2 |
Store relationship cardinality
-rw-r--r-- | src/diagramitem.h | 3 | ||||
-rw-r--r-- | src/domutils.h | 34 | ||||
-rw-r--r-- | src/items/database/databaserelationship.cpp | 43 | ||||
-rw-r--r-- | src/items/database/databaserelationship.h | 36 | ||||
-rw-r--r-- | src/items/database/databaserelationshipproperties.cpp | 51 | ||||
-rw-r--r-- | src/items/database/databaserelationshipproperties.h | 2 | ||||
-rw-r--r-- | src/items/database/databasetable.h | 3 |
7 files changed, 166 insertions, 6 deletions
diff --git a/src/diagramitem.h b/src/diagramitem.h index 76b8a0e..e0ce662 100644 --- a/src/diagramitem.h +++ b/src/diagramitem.h @@ -54,6 +54,9 @@ public: static DiagramItemProperties *createPropertiesEditor(QWidget *parent = 0); +signals: + void propertyChanged(const QString &name, const QVariant &value); + public: QUuid m_id; }; diff --git a/src/domutils.h b/src/domutils.h index 045f0bb..3fc50d0 100644 --- a/src/domutils.h +++ b/src/domutils.h @@ -19,6 +19,8 @@ #include <QDomDocument> #include <QDomElement> +#include <QMetaEnum> +#include <QMetaObject> inline void appendStringElement(QDomDocument &doc, QDomElement &parent, const QString &name, const QString &value) @@ -40,4 +42,36 @@ readStringElement(QDomElement &parent, const QString &name, const QString &defau return defaultValue; } +inline const char * +enumNameFromValue(const QObject *obj, const char *enumerator, int value) +{ + const QMetaObject *metaObj = obj->metaObject(); + int enumeratorIndex = metaObj->indexOfEnumerator(enumerator); + return metaObj->enumerator(enumeratorIndex).valueToKey(value); +} + +inline int +enumValueFromName(const QObject *obj, const char *enumerator, const char *key) +{ + const QMetaObject *metaObj = obj->metaObject(); + int enumeratorIndex = metaObj->indexOfEnumerator(enumerator); + return metaObj->enumerator(enumeratorIndex).keyToValue(key); +} + +template <typename T> inline void +appendEnumElement(QDomDocument doc, QDomElement element, const QString &name, T value, const QObject *obj, const char *enumName) +{ + appendStringElement(doc, element, name, enumNameFromValue(obj, enumName, value)); +} + +template <typename T> inline T +readEnumElement(QDomElement &parent, const QString &name, T defaultValue, const QObject *obj, const char *enumName) +{ + QDomElement element = parent.firstChildElement(name); + if (!element.isNull()) { + return T(enumValueFromName(obj, enumName, element.text().toLatin1().constData())); + } + return defaultValue; +} + #endif diff --git a/src/items/database/databaserelationship.cpp b/src/items/database/databaserelationship.cpp index 5adda58..8b4ceda 100644 --- a/src/items/database/databaserelationship.cpp +++ b/src/items/database/databaserelationship.cpp @@ -22,13 +22,47 @@ #include "databaserelationshipproperties.h" #include "range.h" +class DatabaseRelationship::PrivateData +{ +public: + PrivateData() : + cardinality(ZeroOrMore), + onUpdateAction(NoAction), + onDeleteAction(NoAction) + {} + + Cardinality cardinality; + Action onUpdateAction; + Action onDeleteAction; +}; + DatabaseRelationship::DatabaseRelationship(DiagramItem *parent) - : DiagramConnection(parent) + : DiagramConnection(parent), d(new PrivateData) { setFlag(ItemIsSelectable); connect(this, SIGNAL(endPointChanged()), this, SLOT(updateLayout())); } +DatabaseRelationship::~DatabaseRelationship() +{ + delete d; +} + +DatabaseRelationship::Cardinality +DatabaseRelationship::cardinality() const +{ + return d->cardinality; +} + +void +DatabaseRelationship::setCardinality(Cardinality cardinality) +{ + if (d->cardinality != cardinality) { + d->cardinality = cardinality; + emit propertyChanged("cardinality", cardinality); + } +} + QRectF DatabaseRelationship::boundingRect() const { @@ -243,12 +277,19 @@ void DatabaseRelationship::loadFromXml(QDomElement element, DiagramDocument *document) { DiagramConnection::loadFromXml(element, document); + QDomElement relationshipeElement = element.firstChildElement("relationship"); + if (!relationshipeElement.isNull()) { + setCardinality(readEnumElement(relationshipeElement, "cardinality", ZeroOrMore, this, "Cardinality")); + } } void DatabaseRelationship::saveToXml(QDomDocument doc, QDomElement element) { DiagramConnection::saveToXml(doc, element); + QDomElement relationshipeElement = doc.createElement("relationship"); + element.appendChild(relationshipeElement); + appendEnumElement(doc, relationshipeElement, "cardinality", d->cardinality, this, "Cardinality"); } DiagramItemProperties * diff --git a/src/items/database/databaserelationship.h b/src/items/database/databaserelationship.h index b345f33..4a07e86 100644 --- a/src/items/database/databaserelationship.h +++ b/src/items/database/databaserelationship.h @@ -17,6 +17,7 @@ #ifndef DATABASERELATION_H #define DATABASERELATION_H +#include <QPair> #include <QGraphicsItem> #include <QPainter> #include "diagramconnection.h" @@ -25,9 +26,12 @@ class DatabaseRelationship : public DiagramConnection { Q_OBJECT + Q_ENUMS(Cardinality Action) + Q_PROPERTY(Cardinality cardinality READ cardinality WRITE setCardinality); public: DatabaseRelationship(DiagramItem *parent = 0); + ~DatabaseRelationship(); QRectF boundingRect() const; QPainterPath shape() const; @@ -53,11 +57,36 @@ public: //! Returns true if the foreign key on the child table is required (NOT NULL) bool isRequired(); + enum Cardinality { + ZeroOrMore, + OneOrMore, + ZeroOrOne, + One + }; + //! Returns the cardinality of the relationship - Pair<int, int> cardinality(); + Cardinality cardinality() const; //! Sets the relationship cardinality - void setCardinality(Pair<int, int> cardinality); + void setCardinality(Cardinality cardinality); + + //! List of columns in the child (referencing) table + QList<Column *> sourceColumns() const; + + //! List of columns in the parent (referenced) table + QList<Column *> targetColumns() const; + + enum Action { + NoAction, + Restrict, + Cascade, + SetNull, + SetDefault + }; + + Action onUpdateAction() const; + + Action onDeleteAction() const; static DiagramItemProperties *createPropertiesEditor(QWidget *parent = 0); @@ -68,6 +97,9 @@ protected: QVariant itemChange(GraphicsItemChange change, const QVariant &value); private: + class PrivateData; + PrivateData *const d; + QPolygonF m_line; QPolygonF m_arrowHead; }; diff --git a/src/items/database/databaserelationshipproperties.cpp b/src/items/database/databaserelationshipproperties.cpp index aca6fe9..94b2e78 100644 --- a/src/items/database/databaserelationshipproperties.cpp +++ b/src/items/database/databaserelationshipproperties.cpp @@ -14,10 +14,15 @@ // with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +#include <QComboBox> #include <QCheckBox> +#include <QHBoxLayout> #include <QGridLayout> #include <QLabel> #include <QLineEdit> +#include "commands.h" +#include "diagramdocument.h" +#include "databaserelationship.h" #include "databaserelationshipproperties.h" class DatabaseRelationshipProperties::PrivateData @@ -28,6 +33,7 @@ public: QWidget *nameEdit; QCheckBox *generateNameCheckBox; + QComboBox *cardinalityComboBox; }; DatabaseRelationshipProperties::DatabaseRelationshipProperties(QWidget *parent) @@ -52,7 +58,17 @@ DatabaseRelationshipProperties::createRelationshipPage() layout->addWidget(d->generateNameCheckBox, row, 2); row++; + d->cardinalityComboBox = new QComboBox(page); + d->cardinalityComboBox->addItem("Zero or more", DatabaseRelationship::ZeroOrMore); + d->cardinalityComboBox->addItem("One or more", DatabaseRelationship::OneOrMore); + d->cardinalityComboBox->addItem("Zero or one", DatabaseRelationship::ZeroOrOne); + d->cardinalityComboBox->addItem("Exactly one", DatabaseRelationship::One); + connect(d->cardinalityComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setRelationshipCardinality(int))); + QHBoxLayout *hbox = new QHBoxLayout(); + hbox->addWidget(d->cardinalityComboBox); + hbox->addStretch(); layout->addWidget(new QLabel(tr("Cardinality:"), page), row, 0); + layout->addLayout(hbox, row, 1, 1, 2); row++; layout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), row, 0, row, 3); @@ -63,4 +79,39 @@ DatabaseRelationshipProperties::createRelationshipPage() void DatabaseRelationshipProperties::switchCurrentItem(DiagramItem *oldItem, DiagramItem *newItem) { + if (oldItem) + disconnect(oldItem, 0, this, 0); + DatabaseRelationship *relationship = currentRelationship(); + if (relationship) { + int index = d->cardinalityComboBox->findData(relationship->cardinality()); + d->cardinalityComboBox->setCurrentIndex(index); + connect(relationship, SIGNAL(propertyChanged(const QString &, const QVariant &)), SLOT(updateProperty(const QString &, const QVariant &))); + } + else { + } +} + +void +DatabaseRelationshipProperties::updateProperty(const QString &name, const QVariant &value) +{ + if (name == "cardinality") { + int index = d->cardinalityComboBox->findData(value); + d->cardinalityComboBox->setCurrentIndex(index); + } +} + +DatabaseRelationship * +DatabaseRelationshipProperties::currentRelationship() +{ + return static_cast<DatabaseRelationship *>(currentItem()); +} + +void +DatabaseRelationshipProperties::setRelationshipCardinality(int index) +{ + DatabaseRelationship *relationship = currentRelationship(); + DatabaseRelationship::Cardinality cardinality = + DatabaseRelationship::Cardinality(d->cardinalityComboBox->itemData(index).toInt()); + relationship->document()->undoStack()->push( + new SetObjectPropertyCommand(relationship, "cardinality", cardinality)); } diff --git a/src/items/database/databaserelationshipproperties.h b/src/items/database/databaserelationshipproperties.h index 2cf8f29..0d758d2 100644 --- a/src/items/database/databaserelationshipproperties.h +++ b/src/items/database/databaserelationshipproperties.h @@ -32,6 +32,8 @@ protected: void switchCurrentItem(DiagramItem *oldItem, DiagramItem *newItem); protected slots: + void updateProperty(const QString &name, const QVariant &value); + void setRelationshipCardinality(int index); private: class PrivateData; diff --git a/src/items/database/databasetable.h b/src/items/database/databasetable.h index da03a1a..11d6005 100644 --- a/src/items/database/databasetable.h +++ b/src/items/database/databasetable.h @@ -59,9 +59,6 @@ public: static DiagramItemProperties *createPropertiesEditor(QWidget *parent = 0); -signals: - void propertyChanged(const QString &name, const QVariant &value); - protected slots: void updateLayout(); |