From e40be8a9658095b5d7e87afdf4a95762885e7aab Mon Sep 17 00:00:00 2001 From: Lukáš Lalinský Date: Wed, 31 Dec 2008 11:08:29 +0100 Subject: Update line layouts in a singleshot timer --- src/diagramdocument.cpp | 70 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 14 deletions(-) (limited to 'src/diagramdocument.cpp') 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 +#include #include #include #include #include +#include using namespace std; @@ -47,6 +49,10 @@ public: bool printing; Notation notation; + QTimer *updateTimer; + QList linesToAdd; + QSet objectsToUpdate; + QSet linesToUpdate; QMap 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 objectsToUpdate(d->objectsToUpdate); + d->objectsToUpdate.clear(); + updateLines(objectsToUpdate); +} + +void +DiagramDocument::updateLines(QSet objectsToUpdate) +{ + QSet 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 QList DiagramDocument::itemsByType() { @@ -195,7 +235,10 @@ DiagramDocument::itemMoved(DiagramItem *item) void DiagramDocument::itemHasMoved(DiagramItem *item) { - updatePositions(static_cast(item)); + DiagramObject *obj = static_cast(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() << source); undoStack()->push(new AddItemCommand(this, relation)); } delete m_line; -- cgit v1.2.3-54-g00ecf