summaryrefslogtreecommitdiff
path: root/src/diagramdocument.cpp
diff options
context:
space:
mode:
authorLukáš Lalinský <lalinsky@gmail.com>2008-12-31 11:08:29 +0100
committerLukáš Lalinský <lalinsky@gmail.com>2008-12-31 11:08:29 +0100
commite40be8a9658095b5d7e87afdf4a95762885e7aab (patch)
tree0586c6a25e4f26c0f958ef25614fcc215ed74eef /src/diagramdocument.cpp
parentca579d4487f431baf791ccb0c2635fb339cdfacf (diff)
downloaddbmodel-e40be8a9658095b5d7e87afdf4a95762885e7aab.tar.xz
Update line layouts in a singleshot timer
Diffstat (limited to 'src/diagramdocument.cpp')
-rw-r--r--src/diagramdocument.cpp70
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;