summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukáš Lalinský <lalinsky@gmail.com>2008-12-12 13:25:38 +0100
committerLukáš Lalinský <lalinsky@gmail.com>2008-12-12 13:25:38 +0100
commit8f5d094db7182cef09fe4ee606e2182bf0e433b5 (patch)
treed6ad909f43a82eccf8c7ac82e49fa7566c066017
parent0d706c18d9568286b18e1cef64286e84f2c3e557 (diff)
downloaddbmodel-8f5d094db7182cef09fe4ee606e2182bf0e433b5.tar.gz
dbmodel-8f5d094db7182cef09fe4ee606e2182bf0e433b5.tar.bz2
Store relationship cardinality
-rw-r--r--src/diagramitem.h3
-rw-r--r--src/domutils.h34
-rw-r--r--src/items/database/databaserelationship.cpp43
-rw-r--r--src/items/database/databaserelationship.h36
-rw-r--r--src/items/database/databaserelationshipproperties.cpp51
-rw-r--r--src/items/database/databaserelationshipproperties.h2
-rw-r--r--src/items/database/databasetable.h3
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();