diff options
author | Lukáš Lalinský <lalinsky@gmail.com> | 2008-12-31 11:08:29 +0100 |
---|---|---|
committer | Lukáš Lalinský <lalinsky@gmail.com> | 2008-12-31 11:08:29 +0100 |
commit | e40be8a9658095b5d7e87afdf4a95762885e7aab (patch) | |
tree | 0586c6a25e4f26c0f958ef25614fcc215ed74eef /src/diagramdocument.cpp | |
parent | ca579d4487f431baf791ccb0c2635fb339cdfacf (diff) | |
download | dbmodel-e40be8a9658095b5d7e87afdf4a95762885e7aab.tar.xz |
Update line layouts in a singleshot timer
Diffstat (limited to 'src/diagramdocument.cpp')
-rw-r--r-- | src/diagramdocument.cpp | 70 |
1 files changed, 56 insertions, 14 deletions
diff --git a/src/diagramdocument.cpp b/src/diagramdocument.cpp index 28a3eda..bab359b 100644 --- a/src/diagramdocument.cpp +++ b/src/diagramdocument.cpp @@ -24,10 +24,12 @@ #include "items/database/column.h" #include "commands.h" #include <QGraphicsItem> +#include <QTimer> #include <QDebug> #include <QFile> #include <QTextStream> #include <QStyle> +#include <QSet> using namespace std; @@ -47,6 +49,10 @@ public: bool printing; Notation notation; + QTimer *updateTimer; + QList<Line *> linesToAdd; + QSet<DiagramObject *> objectsToUpdate; + QSet<Line *> linesToUpdate; QMap<QString, int> counters; }; @@ -54,6 +60,10 @@ DiagramDocument::DiagramDocument(QObject *parent) : QGraphicsScene(parent), d(new DiagramDocumentPrivate), m_mode(DiagramDocument::Select), m_line(NULL) { m_undoStack = new QUndoStack(this); + d->updateTimer = new QTimer(); + d->updateTimer->setSingleShot(true); + d->updateTimer->setInterval(10); + connect(d->updateTimer, SIGNAL(timeout()), this, SLOT(_updateLines())); } DiagramDocument::Notation @@ -139,20 +149,50 @@ DiagramDocument::setMode(Mode mode) } void -DiagramDocument::updatePositions(DiagramObject *object) +DiagramDocument::updatePositions(DiagramObject *object, bool force) { - Connector *connector; - foreach (Line *connection, findConnections(object)) { - connector = connection->connector(0); - if (connector->isConnected()) - connector->hub()->update(); - connector = connection->connector(1); - if (connector->isConnected()) - connector->hub()->update(); - connection->updatePositions(); - } + d->objectsToUpdate.insert(object); + if (force) + d->updateTimer->start(0); + else + d->updateTimer->start(); } +void +DiagramDocument::updateLineLayout(Line *line) +{ + d->linesToUpdate.insert(line); +} + +void +DiagramDocument::_updateLines() +{ + QSet<DiagramObject *> objectsToUpdate(d->objectsToUpdate); + d->objectsToUpdate.clear(); + updateLines(objectsToUpdate); +} + +void +DiagramDocument::updateLines(QSet<DiagramObject *> objectsToUpdate) +{ + QSet<Hub *> hubsToUpdate; + foreach (DiagramObject *obj, objectsToUpdate) { + hubsToUpdate.insert(obj->hub()); + foreach (Connector *conn, obj->hub()->connectors()) { + hubsToUpdate.insert(conn->otherEnd()->hub()); + } + } + foreach (Hub *hub, hubsToUpdate) { + hub->update(); + } + foreach (Line *line, d->linesToUpdate) { + line->updateLayout(); + line->update(); // XXX why is this necessary? + } + d->linesToUpdate.clear(); +} + + template <class T> QList<T *> DiagramDocument::itemsByType() { @@ -195,7 +235,10 @@ DiagramDocument::itemMoved(DiagramItem *item) void DiagramDocument::itemHasMoved(DiagramItem *item) { - updatePositions(static_cast<DatabaseTable*>(item)); + DiagramObject *obj = static_cast<DiagramObject *>(item); + if (obj) { + updatePositions(obj); + } } void @@ -254,8 +297,7 @@ DiagramDocument::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) relation->createId(); relation->connector(0)->setHub(source->hub()); relation->connector(1)->setHub(target->hub()); - source->hub()->update(); - target->hub()->update(); + updateLines(QSet<DiagramObject *>() << source); undoStack()->push(new AddItemCommand(this, relation)); } delete m_line; |