summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukáš Lalinský <lalinsky@gmail.com>2008-12-07 13:56:43 +0100
committerLukáš Lalinský <lalinsky@gmail.com>2008-12-07 13:56:43 +0100
commit2124865820d4b1dfe68580c81972b86d02823d74 (patch)
tree2ae87ddcf8a425a76b6f5254f85f32bfc7e23f50
parentda6669aac999c8febf4c2c2c7029eb37357fab08 (diff)
downloaddbmodel-2124865820d4b1dfe68580c81972b86d02823d74.tar.gz
dbmodel-2124865820d4b1dfe68580c81972b86d02823d74.tar.bz2
Remove connections along with the object
-rw-r--r--src/commands.cpp35
-rw-r--r--src/commands.h19
-rw-r--r--src/diagramconnection.cpp5
-rw-r--r--src/diagramconnection.h2
-rw-r--r--src/diagramdocument.cpp38
-rw-r--r--src/diagramdocument.h6
6 files changed, 82 insertions, 23 deletions
diff --git a/src/commands.cpp b/src/commands.cpp
index b9960ef..7fcd005 100644
--- a/src/commands.cpp
+++ b/src/commands.cpp
@@ -17,6 +17,8 @@
#include <QDebug>
#include "commands.h"
#include "diagramdocument.h"
+#include "diagramconnection.h"
+#include "diagramitem.h"
#include "databasetable.h"
#include "column.h"
@@ -196,3 +198,36 @@ RemoveItemCommand::undo()
m_document->addItem(m_item);
m_owner = false;
}
+
+
+RemoveObjectCommand::RemoveObjectCommand(DiagramDocument *document, DiagramObject *object, QUndoCommand *parent)
+ : QUndoCommand(parent), m_document(document), m_object(object), m_owner(false)
+{
+ m_connections = document->findConnections(object);
+}
+
+RemoveObjectCommand::~RemoveObjectCommand()
+{
+ if (m_owner) {
+ qDeleteAll(m_connections);
+ delete m_object;
+ }
+}
+
+void
+RemoveObjectCommand::redo()
+{
+ foreach (DiagramConnection *connection, m_connections)
+ m_document->removeItem(connection);
+ m_document->removeItem(m_object);
+ m_owner = true;
+}
+
+void
+RemoveObjectCommand::undo()
+{
+ m_document->addItem(m_object);
+ foreach (DiagramConnection *connection, m_connections)
+ m_document->addItem(connection);
+ m_owner = false;
+}
diff --git a/src/commands.h b/src/commands.h
index 7769dfa..7b0739b 100644
--- a/src/commands.h
+++ b/src/commands.h
@@ -23,6 +23,9 @@
#include <QLatin1String>
class DatabaseTable;
+class DiagramConnection;
+class DiagramObject;
+class DiagramItem;
class Column;
#include "column.h"
@@ -118,10 +121,24 @@ public:
~RemoveItemCommand();
void undo();
void redo();
-private:
+protected:
DiagramDocument *m_document;
DiagramItem *m_item;
bool m_owner;
};
+class RemoveObjectCommand : public QUndoCommand
+{
+public:
+ RemoveObjectCommand(DiagramDocument *document, DiagramObject *object, QUndoCommand *parent = 0);
+ ~RemoveObjectCommand();
+ void undo();
+ void redo();
+protected:
+ DiagramDocument *m_document;
+ DiagramObject *m_object;
+ QList<DiagramConnection *> m_connections;
+ bool m_owner;
+};
+
#endif
diff --git a/src/diagramconnection.cpp b/src/diagramconnection.cpp
index a996994..5aae2bb 100644
--- a/src/diagramconnection.cpp
+++ b/src/diagramconnection.cpp
@@ -36,3 +36,8 @@ DiagramConnection::setTarget(DiagramObject *object)
m_objects[1] = object;
emit endPointChanged();
}
+
+void
+DiagramConnection::updatePositions()
+{
+}
diff --git a/src/diagramconnection.h b/src/diagramconnection.h
index 26810a7..1ad52e5 100644
--- a/src/diagramconnection.h
+++ b/src/diagramconnection.h
@@ -33,6 +33,8 @@ public:
void setSource(DiagramObject *object);
void setTarget(DiagramObject *object);
+ virtual void updatePositions();
+
signals:
void endPointChanged();
diff --git a/src/diagramdocument.cpp b/src/diagramdocument.cpp
index 6edd54e..2aa486d 100644
--- a/src/diagramdocument.cpp
+++ b/src/diagramdocument.cpp
@@ -15,6 +15,8 @@
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "diagramdocument.h"
+#include "diagramobject.h"
+#include "diagramconnection.h"
#include "databasetable.h"
#include "databaserelationship.h"
#include "column.h"
@@ -28,7 +30,6 @@ DiagramDocument::DiagramDocument(QObject *parent)
: QGraphicsScene(parent), m_mode(DiagramDocument::Select), m_line(NULL)
{
m_undoStack = new QUndoStack(this);
- //connect(this, SIGNAL(tableMoved(DatabaseTable *)), SLOT(updatePositions(DatabaseTable *)));
}
DiagramDocument::Mode
@@ -45,11 +46,10 @@ DiagramDocument::setMode(Mode mode)
}
void
-DiagramDocument::updatePositions(DatabaseTable *table)
+DiagramDocument::updatePositions(DiagramObject *object)
{
- foreach (DatabaseRelationship *relation, findTableRelations(table)) {
- relation->updatePositions();
- }
+ foreach (DiagramConnection *connection, findConnections(object))
+ connection->updatePositions();
}
template <class T> QList<T *>
@@ -57,9 +57,13 @@ DiagramDocument::itemsByType()
{
QList<T *> result;
foreach(QGraphicsItem *item, items()) {
- if (item->type() == T::Type) {
- result.append(static_cast<T *>(item));
+ T *typedItem = dynamic_cast<T *>(item);
+ if (typedItem) {
+ result.append(typedItem);
}
+/* if (item->type() == T::Type) {
+ result.append(static_cast<T *>(item));
+ }*/
}
return result;
}
@@ -165,24 +169,18 @@ DiagramDocument::deleteSelectedItems()
foreach (QGraphicsItem *item, selectedItems()) {
DatabaseTable *table = qgraphicsitem_cast<DatabaseTable *>(item);
if (table) {
- // FIXME
- foreach (DatabaseRelationship *relation, findTableRelations(table)) {
- removeItem(relation);
- }
- undoStack()->push(new RemoveItemCommand(this, table));
+ undoStack()->push(new RemoveObjectCommand(this, table));
}
}
}
-QList<DatabaseRelationship *>
-DiagramDocument::findTableRelations(DatabaseTable *table)
+QList<DiagramConnection *>
+DiagramDocument::findConnections(DiagramObject *object)
{
- QList<DatabaseRelationship *> result;
- foreach (DatabaseRelationship *relation, itemsByType<DatabaseRelationship>()) {
- if (relation->source() == table || relation->target() == table) {
- result << relation;
- }
- }
+ QList<DiagramConnection *> result;
+ foreach (DiagramConnection *connection, itemsByType<DiagramConnection>())
+ if (connection->source() == object || connection->target() == object)
+ result.append(connection);
return result;
}
diff --git a/src/diagramdocument.h b/src/diagramdocument.h
index 2c87fe0..79d38d9 100644
--- a/src/diagramdocument.h
+++ b/src/diagramdocument.h
@@ -26,7 +26,9 @@
class DatabaseTable;
class DatabaseRelationship;
+class DiagramConnection;
class DiagramItem;
+class DiagramObject;
class DiagramDocument : public QGraphicsScene
{
@@ -46,7 +48,6 @@ public:
DatabaseTable *selectedTable();
void deleteSelectedItems();
- QList<DatabaseRelationship *> findTableRelations(DatabaseTable *table);
void save(const QString &fileName);
void load(const QString &fileName);
@@ -59,6 +60,7 @@ public:
void itemMoved(DiagramItem *table);
void itemHasMoved(DiagramItem *table);
+ QList<DiagramConnection *> findConnections(DiagramObject *object);
template <class T> QList<T *> itemsByType();
signals:
@@ -67,7 +69,7 @@ signals:
friend class DatabaseTable;
protected slots:
- void updatePositions(DatabaseTable *table);
+ void updatePositions(DiagramObject *object);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);