summaryrefslogtreecommitdiff
path: root/src/items/database
diff options
context:
space:
mode:
authorLukáš Lalinský <lalinsky@gmail.com>2008-12-12 18:45:34 +0100
committerLukáš Lalinský <lalinsky@gmail.com>2008-12-12 18:45:34 +0100
commit2b09f7747c171c4c39538c844a616b60424f16a3 (patch)
tree7cbe6234224dd777916477659d237eb106e07e9f /src/items/database
parent3a309a16e62a622f1b2ef90871086b274353e9d6 (diff)
downloaddbmodel-2b09f7747c171c4c39538c844a616b60424f16a3.tar.xz
Support for relationship modality
Diffstat (limited to 'src/items/database')
-rw-r--r--src/items/database/database.pri3
-rw-r--r--src/items/database/databaserelationship.cpp69
-rw-r--r--src/items/database/databaserelationship.h16
-rw-r--r--src/items/database/databaserelationshipproperties.cpp115
-rw-r--r--src/items/database/databaserelationshipproperties.h8
-rw-r--r--src/items/database/databaserelationshipproperties.ui134
6 files changed, 291 insertions, 54 deletions
diff --git a/src/items/database/database.pri b/src/items/database/database.pri
index 9a7ebe9..5fd4397 100644
--- a/src/items/database/database.pri
+++ b/src/items/database/database.pri
@@ -21,3 +21,6 @@ HEADERS += \
databasetableproperties.h \
databaserelationship.h \
databaserelationshipproperties.h
+
+FORMS += \
+ databaserelationshipproperties.ui
diff --git a/src/items/database/databaserelationship.cpp b/src/items/database/databaserelationship.cpp
index 780c0bb..c51d9d7 100644
--- a/src/items/database/databaserelationship.cpp
+++ b/src/items/database/databaserelationship.cpp
@@ -26,7 +26,9 @@ class DatabaseRelationship::PrivateData
{
public:
PrivateData() :
- cardinality(ZeroOrMore),
+ cardinality(OneToMany),
+ childOptional(false),
+ parentOptional(false),
onUpdateAction(NoAction),
onDeleteAction(NoAction)
{
@@ -60,6 +62,8 @@ public:
}
Cardinality cardinality;
+ bool childOptional;
+ bool parentOptional;
Action onUpdateAction;
Action onDeleteAction;
@@ -68,20 +72,20 @@ public:
QPainterPath targetEnd;
QPolygonF line;
- QPainterPath crowsFootPath(Cardinality cardinality)
+ QPainterPath crowsFootPath(bool toMany, bool optional)
{
- switch (cardinality) {
- case ZeroOrMore:
+ if (toMany) {
+ if (optional) // 0..*
return paths[0];
- case OneOrMore:
+ else // 1..*
return paths[1];
- case ZeroOrOne:
+ }
+ else {
+ if (optional) // 0..1
return paths[2];
- case One:
+ else // 1..1
return paths[3];
}
- Q_ASSERT(false);
- return QPainterPath();
}
QPainterPath arrowHeadPath()
@@ -126,9 +130,37 @@ DatabaseRelationship::setCardinality(Cardinality cardinality)
}
bool
-DatabaseRelationship::isRequired() const
+DatabaseRelationship::isChildOptional() const
{
- return true; // FIXME
+ return d->childOptional;
+}
+
+void
+DatabaseRelationship::setChildOptional(bool optional)
+{
+ if (d->childOptional != optional) {
+ d->childOptional = optional;
+ emit propertyChanged("childOptional", optional);
+ updateLayout();
+ update();
+ }
+}
+
+bool
+DatabaseRelationship::isParentOptional() const
+{
+ return d->parentOptional;
+}
+
+void
+DatabaseRelationship::setParentOptional(bool optional)
+{
+ if (d->parentOptional != optional) {
+ d->parentOptional = optional;
+ emit propertyChanged("parentOptional", optional);
+ updateLayout();
+ update();
+ }
}
QRectF
@@ -337,8 +369,8 @@ DatabaseRelationship::updateLayout()
break;
case DiagramDocument::CrowsFoot:
d->fillEnds = false;
- d->targetEnd = d->crowsFootPath(d->cardinality);
- d->sourceEnd = d->crowsFootPath(isRequired() ? One : ZeroOrOne);
+ d->targetEnd = d->crowsFootPath(d->cardinality != OneToOne, isParentOptional());
+ d->sourceEnd = d->crowsFootPath(d->cardinality == ManyToMany, isChildOptional());
break;
}
@@ -368,7 +400,12 @@ 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"));
+ setCardinality(readEnumElement(relationshipeElement, "cardinality", OneToMany, this, "Cardinality"));
+ QDomElement modalityElement = relationshipeElement.firstChildElement("modality");
+ if (!modalityElement.isNull()) {
+ setChildOptional(readBoolElement(modalityElement, "child", false, "Optional", "Mandatory"));
+ setParentOptional(readBoolElement(modalityElement, "parent", false, "Optional", "Mandatory"));
+ }
}
}
@@ -379,6 +416,10 @@ DatabaseRelationship::saveToXml(QDomDocument doc, QDomElement element)
QDomElement relationshipeElement = doc.createElement("relationship");
element.appendChild(relationshipeElement);
appendEnumElement(doc, relationshipeElement, "cardinality", d->cardinality, this, "Cardinality");
+ QDomElement modalityElement = doc.createElement("modality");
+ relationshipeElement.appendChild(modalityElement);
+ appendBoolElement(doc, modalityElement, "child", d->childOptional, "Optional", "Mandatory");
+ appendBoolElement(doc, modalityElement, "parent", d->parentOptional, "Optional", "Mandatory");
}
DiagramItemProperties *
diff --git a/src/items/database/databaserelationship.h b/src/items/database/databaserelationship.h
index 9b5f0af..5d7e812 100644
--- a/src/items/database/databaserelationship.h
+++ b/src/items/database/databaserelationship.h
@@ -28,6 +28,8 @@ class DatabaseRelationship : public DiagramConnection
Q_OBJECT
Q_ENUMS(Cardinality Action)
Q_PROPERTY(Cardinality cardinality READ cardinality WRITE setCardinality);
+ Q_PROPERTY(bool childOptional READ isChildOptional WRITE setChildOptional);
+ Q_PROPERTY(bool parentOptional READ isParentOptional WRITE setParentOptional);
public:
DatabaseRelationship(DiagramItem *parent = 0);
@@ -54,14 +56,16 @@ public:
//! Returns true if the foreign key on the child table is also the primary key
bool isIdentifying() const;
- //! Returns true if the foreign key on the child table is required (NOT NULL)
- bool isRequired() const;
+ bool isChildOptional() const;
+ void setChildOptional(bool optional);
+
+ bool isParentOptional() const;
+ void setParentOptional(bool optional);
enum Cardinality {
- ZeroOrMore,
- OneOrMore,
- ZeroOrOne,
- One
+ OneToOne,
+ OneToMany,
+ ManyToMany,
};
//! Returns the cardinality of the relationship
diff --git a/src/items/database/databaserelationshipproperties.cpp b/src/items/database/databaserelationshipproperties.cpp
index 94b2e78..bcdc104 100644
--- a/src/items/database/databaserelationshipproperties.cpp
+++ b/src/items/database/databaserelationshipproperties.cpp
@@ -24,6 +24,7 @@
#include "diagramdocument.h"
#include "databaserelationship.h"
#include "databaserelationshipproperties.h"
+#include "ui_databaserelationshipproperties.h"
class DatabaseRelationshipProperties::PrivateData
{
@@ -34,6 +35,8 @@ public:
QWidget *nameEdit;
QCheckBox *generateNameCheckBox;
QComboBox *cardinalityComboBox;
+ Ui_DatabaseRelationshipForm ui;
+ QButtonGroup *cardinalityButtonGroup;
};
DatabaseRelationshipProperties::DatabaseRelationshipProperties(QWidget *parent)
@@ -46,32 +49,19 @@ QWidget *
DatabaseRelationshipProperties::createRelationshipPage()
{
QWidget *page = new QWidget(this);
- QGridLayout *layout = new QGridLayout(page);
-
- int row = 0;
- d->nameEdit = new QLineEdit(page);
- layout->addWidget(new QLabel(tr("Name:"), page), row, 0);
- layout->addWidget(d->nameEdit, row, 1);
- d->generateNameCheckBox = new QCheckBox(tr("Generated"), page);
- connect(d->generateNameCheckBox, SIGNAL(toggled(bool)), d->nameEdit, SLOT(setDisabled(bool)));
- d->generateNameCheckBox->setChecked(true);
- 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);
+ d->ui.setupUi(page);
+
+ connect(d->ui.automaticNameCheckBox, SIGNAL(toggled(bool)), d->ui.nameEdit, SLOT(setDisabled(bool)));
+
+ d->cardinalityButtonGroup = new QButtonGroup(this);
+ d->cardinalityButtonGroup->addButton(d->ui.cardinalityOneToOneRadioButton);
+ d->cardinalityButtonGroup->addButton(d->ui.cardinalityOneToManyRadioButton);
+ d->cardinalityButtonGroup->addButton(d->ui.cardinalityManyToManyRadioButton);
+ connect(d->cardinalityButtonGroup, SIGNAL(buttonClicked(QAbstractButton *)),
+ SLOT(setCardinality(QAbstractButton *)));
+
+ connect(d->ui.modalityChildCheckBox, SIGNAL(toggled(bool)), SLOT(setChildOptional(bool)));
+ connect(d->ui.modalityParentCheckBox, SIGNAL(toggled(bool)), SLOT(setParentOptional(bool)));
return page;
}
@@ -83,8 +73,9 @@ DatabaseRelationshipProperties::switchCurrentItem(DiagramItem *oldItem, DiagramI
disconnect(oldItem, 0, this, 0);
DatabaseRelationship *relationship = currentRelationship();
if (relationship) {
- int index = d->cardinalityComboBox->findData(relationship->cardinality());
- d->cardinalityComboBox->setCurrentIndex(index);
+ updateCardinality();
+ updateChildOptional();
+ updateParentOptional();
connect(relationship, SIGNAL(propertyChanged(const QString &, const QVariant &)), SLOT(updateProperty(const QString &, const QVariant &)));
}
else {
@@ -95,11 +86,47 @@ void
DatabaseRelationshipProperties::updateProperty(const QString &name, const QVariant &value)
{
if (name == "cardinality") {
- int index = d->cardinalityComboBox->findData(value);
- d->cardinalityComboBox->setCurrentIndex(index);
+ updateCardinality();
+ }
+ else if (name == "childOptional") {
+ updateChildOptional();
+ }
+ else if (name == "childOptional") {
+ updateParentOptional();
}
}
+void
+DatabaseRelationshipProperties::updateCardinality()
+{
+ DatabaseRelationship *relationship = currentRelationship();
+ switch (relationship->cardinality()) {
+ case DatabaseRelationship::OneToOne:
+ d->ui.cardinalityOneToOneRadioButton->setChecked(true);
+ break;
+ case DatabaseRelationship::OneToMany:
+ d->ui.cardinalityOneToManyRadioButton->setChecked(true);
+ break;
+ case DatabaseRelationship::ManyToMany:
+ d->ui.cardinalityManyToManyRadioButton->setChecked(true);
+ break;
+ }
+}
+
+void
+DatabaseRelationshipProperties::updateChildOptional()
+{
+ DatabaseRelationship *relationship = currentRelationship();
+ d->ui.modalityChildCheckBox->setChecked(relationship->isChildOptional());
+}
+
+void
+DatabaseRelationshipProperties::updateParentOptional()
+{
+ DatabaseRelationship *relationship = currentRelationship();
+ d->ui.modalityParentCheckBox->setChecked(relationship->isParentOptional());
+}
+
DatabaseRelationship *
DatabaseRelationshipProperties::currentRelationship()
{
@@ -107,11 +134,33 @@ DatabaseRelationshipProperties::currentRelationship()
}
void
-DatabaseRelationshipProperties::setRelationshipCardinality(int index)
+DatabaseRelationshipProperties::setCardinality(QAbstractButton *button)
{
+ DatabaseRelationship::Cardinality cardinality;
+ if (button == d->ui.cardinalityOneToOneRadioButton)
+ cardinality = DatabaseRelationship::OneToOne;
+ else if (button == d->ui.cardinalityOneToManyRadioButton)
+ cardinality = DatabaseRelationship::OneToMany;
+ else if (button == d->ui.cardinalityManyToManyRadioButton)
+ cardinality = DatabaseRelationship::ManyToMany;
+
DatabaseRelationship *relationship = currentRelationship();
- DatabaseRelationship::Cardinality cardinality =
- DatabaseRelationship::Cardinality(d->cardinalityComboBox->itemData(index).toInt());
relationship->document()->undoStack()->push(
new SetObjectPropertyCommand(relationship, "cardinality", cardinality));
}
+
+void
+DatabaseRelationshipProperties::setChildOptional(bool optional)
+{
+ DatabaseRelationship *relationship = currentRelationship();
+ relationship->document()->undoStack()->push(
+ new SetObjectPropertyCommand(relationship, "childOptional", optional));
+}
+
+void
+DatabaseRelationshipProperties::setParentOptional(bool optional)
+{
+ DatabaseRelationship *relationship = currentRelationship();
+ relationship->document()->undoStack()->push(
+ new SetObjectPropertyCommand(relationship, "parentOptional", optional));
+}
diff --git a/src/items/database/databaserelationshipproperties.h b/src/items/database/databaserelationshipproperties.h
index 0d758d2..7229139 100644
--- a/src/items/database/databaserelationshipproperties.h
+++ b/src/items/database/databaserelationshipproperties.h
@@ -19,6 +19,7 @@
#include "diagramitemproperties.h"
class DatabaseRelationship;
+class QAbstractButton;
class DatabaseRelationshipProperties : public DiagramItemProperties
{
@@ -30,10 +31,15 @@ public:
protected:
void switchCurrentItem(DiagramItem *oldItem, DiagramItem *newItem);
+ void updateCardinality();
+ void updateChildOptional();
+ void updateParentOptional();
protected slots:
void updateProperty(const QString &name, const QVariant &value);
- void setRelationshipCardinality(int index);
+ void setCardinality(QAbstractButton *button);
+ void setChildOptional(bool);
+ void setParentOptional(bool);
private:
class PrivateData;
diff --git a/src/items/database/databaserelationshipproperties.ui b/src/items/database/databaserelationshipproperties.ui
new file mode 100644
index 0000000..4bc8bac
--- /dev/null
+++ b/src/items/database/databaserelationshipproperties.ui
@@ -0,0 +1,134 @@
+<ui version="4.0" >
+ <class>DatabaseRelationshipForm</class>
+ <widget class="QWidget" name="DatabaseRelationshipForm" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>501</width>
+ <height>142</height>
+ </rect>
+ </property>
+ <layout class="QGridLayout" name="gridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>Name:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <layout class="QHBoxLayout" name="horizontalLayout" >
+ <item>
+ <widget class="QLineEdit" name="nameEdit" />
+ </item>
+ <item>
+ <widget class="QCheckBox" name="automaticNameCheckBox" >
+ <property name="text" >
+ <string>Automatic</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Cardinality:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <layout class="QHBoxLayout" name="horizontalLayout_2" >
+ <item>
+ <widget class="QRadioButton" name="cardinalityOneToOneRadioButton" >
+ <property name="text" >
+ <string>1:1</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="cardinalityOneToManyRadioButton" >
+ <property name="text" >
+ <string>1:N</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="cardinalityManyToManyRadioButton" >
+ <property name="text" >
+ <string>M:N</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Modality:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <layout class="QHBoxLayout" name="horizontalLayout_3" >
+ <item>
+ <widget class="QCheckBox" name="modalityParentCheckBox" >
+ <property name="text" >
+ <string>Parent is optional</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="modalityChildCheckBox" >
+ <property name="text" >
+ <string>Child is optional</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <spacer name="verticalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>418</width>
+ <height>27</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>