diff options
-rw-r--r-- | src/commands.cpp | 35 | ||||
-rw-r--r-- | src/commands.h | 19 | ||||
-rw-r--r-- | src/diagramconnection.cpp | 5 | ||||
-rw-r--r-- | src/diagramconnection.h | 2 | ||||
-rw-r--r-- | src/diagramdocument.cpp | 38 | ||||
-rw-r--r-- | src/diagramdocument.h | 6 |
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); |