summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan-Arve Sæther <jan-arve.saether@nokia.com>2009-06-03 10:58:07 (GMT)
committerEduardo M. Fleury <eduardo.fleury@openbossa.org>2009-07-22 18:04:23 (GMT)
commit072a9595a308df9b8e7a547c370ce54ab5af6ed4 (patch)
treebc95701fb6e200b1317cf8d6ea7ae490ecca71ce
parentb58d43e407029f19d313cdc2314cf114c572f692 (diff)
downloadQt-072a9595a308df9b8e7a547c370ce54ab5af6ed4.zip
Qt-072a9595a308df9b8e7a547c370ce54ab5af6ed4.tar.gz
Qt-072a9595a308df9b8e7a547c370ce54ab5af6ed4.tar.bz2
Some cleanup - improve dot dumper.
The previous dumper relied on traversal of the graph, which meant that it would not output the nodes that were not connected to the "main" graph. Due to this, we cannot rely on traversal, so instead we must iterate through all the vertices of the graph. As an added bonus the code gets simpler :-) There was also a problem with the previous dumper, since it dumped two "digraph" elements into one file. Graphwiz (win32) did not handle that. Instead just dump all the nodes and all the connections, both horizontal and vertical ones. The horizontal and vertical connections are never connected anyway, so the result will be two separate graphs when it is rendered by graphwiz. Also renamed firstVertex to rootVertex and simplified it.
-rw-r--r--src/gui/graphicsview/qgraph_p.h110
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout.cpp6
-rw-r--r--src/gui/graphicsview/qgraphicsanchorlayout_p.cpp6
3 files changed, 52 insertions, 70 deletions
diff --git a/src/gui/graphicsview/qgraph_p.h b/src/gui/graphicsview/qgraph_p.h
index e487eca..6f4d7bd 100644
--- a/src/gui/graphicsview/qgraph_p.h
+++ b/src/gui/graphicsview/qgraph_p.h
@@ -11,18 +11,18 @@ class Graph
public:
Graph() {}
- class iterator {
+ class const_iterator {
public:
- iterator(Graph *graph, bool begin) : g(graph){
+ const_iterator(const Graph *graph, bool begin) : g(graph){
if (begin) {
- row = g->m_graph.begin();
- //test if the graph is empty
- if (row != g->m_graph.end())
- {
- column = (*row)->begin();
- }
+ row = g->m_graph.constBegin();
+ //test if the graph is empty
+ if (row != g->m_graph.constEnd())
+ {
+ column = (*row)->constBegin();
+ }
} else {
- row = g->m_graph.end();
+ row = g->m_graph.constEnd();
}
}
@@ -30,24 +30,24 @@ public:
return column.key();
}
- inline bool operator==(const iterator &o) const { return !(*this != o); }
- inline bool operator!=(const iterator &o) const {
+ inline bool operator==(const const_iterator &o) const { return !(*this != o); }
+ inline bool operator!=(const const_iterator &o) const {
if (row == g->m_graph.end()) {
- return row != o.row;}
- else {
+ return row != o.row;
+ } else {
return row != o.row || column != o.column;
}
}
- inline iterator& operator=(const iterator &o) const { row = o.row; column = o.column; return *this;}
+ inline const_iterator& operator=(const const_iterator &o) const { row = o.row; column = o.column; return *this;}
// prefix
- iterator &operator++() {
- if (row != g->m_graph.end()) {
+ const_iterator &operator++() {
+ if (row != g->m_graph.constEnd()) {
++column;
- if (column == (*row)->end()) {
+ if (column == (*row)->constEnd()) {
++row;
- if (row != g->m_graph.end()) {
- column = (*row)->begin();
+ if (row != g->m_graph.constEnd()) {
+ column = (*row)->constBegin();
}
}
}
@@ -55,17 +55,17 @@ public:
}
private:
- Graph *g;
- Q_TYPENAME QHash<Vertex *, QHash<Vertex *, EdgeData *> * >::iterator row;
- Q_TYPENAME QHash<Vertex *, EdgeData *>::iterator column;
+ const Graph *g;
+ Q_TYPENAME QHash<Vertex *, QHash<Vertex *, EdgeData *> * >::const_iterator row;
+ Q_TYPENAME QHash<Vertex *, EdgeData *>::const_iterator column;
};
- iterator begin() {
- return iterator(this,true);
+ const_iterator constBegin() const {
+ return const_iterator(this,true);
}
- iterator end() {
- return iterator(this,false);
+ const_iterator constEnd() const {
+ return const_iterator(this,false);
}
EdgeData *edgeData(Vertex* first, Vertex* second) {
@@ -112,51 +112,35 @@ public:
userVertex = vertex;
}
+ QSet<Vertex*> vertices() const {
+ QSet<Vertex *> setOfVertices;
+ for (const_iterator it = constBegin(); it != constEnd(); ++it) {
+ setOfVertices.insert(*it);
+ }
+ return setOfVertices;
+ }
+
QString serializeToDot() { // traversal
- QString vertices;
+ QString strVertices;
QString edges;
- QQueue<Vertex *> queue;
- QSet<Vertex *> visited;
- bool ok;
- Vertex *v = firstVertex(&ok);
- if (ok) {
- queue.enqueue(v);
- }
- while (!queue.isEmpty()) {
- Vertex *v = queue.dequeue();
- vertices += QString::fromAscii("%1 [label=\"%2\"]\n").arg(v->toString()).arg(v->toString());
- visited.insert(v);
- // visit it here
- QList<Vertex *> vertices = adjacentVertices(v);
- for (int i = 0; i < vertices.count(); ++i) {
- Vertex *v1 = vertices.at(i);
+
+ QSet<Vertex *> setOfVertices = vertices();
+ for (Q_TYPENAME QSet<Vertex*>::const_iterator it = setOfVertices.begin(); it != setOfVertices.end(); ++it) {
+ Vertex *v = *it;
+ QList<Vertex*> adjacents = adjacentVertices(v);
+ for (int i = 0; i < adjacents.count(); ++i) {
+ Vertex *v1 = adjacents.at(i);
EdgeData *data = edgeData(v, v1);
- edges+=QString::fromAscii("%1->%2 [label=\"[%3,%4]\"]\n").arg(v->toString()).arg(v1->toString()).arg(data->minSize).arg(data->maxSize);
- if (!queue.contains(v1) && !visited.contains(v1)) {
- queue.enqueue(v1);
- } else {
- // a cycle....
- }
+ edges += QString::fromAscii("%1->%2 [label=\"[%3,%4]\"]\n").arg(v->toString()).arg(v1->toString()).arg(data->minSize).arg(data->maxSize);
}
+ strVertices += QString::fromAscii("%1 [label=\"%2\"]\n").arg(v->toString()).arg(v->toString());
}
- return QString::fromAscii("digraph anchorlayout {\nnode [shape=\"rect\"]\n%1%2}").arg(vertices).arg(edges);
+ return QString::fromAscii("%1\n%2\n").arg(strVertices).arg(edges);
}
- Vertex *firstVertex(bool *ok)
+ Vertex *rootVertex() const
{
- if (userVertex) {
- *ok = true;
- return userVertex;
- }
-
- Vertex *v = 0;
- *ok = false;
- Q_TYPENAME Graph::iterator it = Graph::begin();
- if (it != Graph::end()) {
- v = *it;
- *ok = true;
- }
- return v;
+ return userVertex;
}
protected:
diff --git a/src/gui/graphicsview/qgraphicsanchorlayout.cpp b/src/gui/graphicsview/qgraphicsanchorlayout.cpp
index ba3ba2a..1a72ace 100644
--- a/src/gui/graphicsview/qgraphicsanchorlayout.cpp
+++ b/src/gui/graphicsview/qgraphicsanchorlayout.cpp
@@ -254,10 +254,10 @@ void QGraphicsAnchorLayout::dumpGraph()
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
qWarning("Could not write to %s", file.fileName().toLocal8Bit().constData());
+ QString str = QString::fromAscii("digraph anchorlayout {\nnode [shape=\"rect\"]\n%1}");
QString dotContents = d->graph[0].serializeToDot();
- file.write(dotContents.toLocal8Bit());
- dotContents = d->graph[1].serializeToDot();
- file.write(dotContents.toLocal8Bit());
+ dotContents += d->graph[1].serializeToDot();
+ file.write(str.arg(dotContents).toLocal8Bit());
file.close();
}
diff --git a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp
index 644ed6b..add2db3 100644
--- a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp
+++ b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp
@@ -681,8 +681,7 @@ void QGraphicsAnchorLayoutPrivate::findPaths(Orientation orientation)
QSet<AnchorData *> visited;
- bool ok;
- AnchorVertex *root = graph[orientation].firstVertex(&ok);
+ AnchorVertex *root = graph[orientation].rootVertex();
graphPaths[orientation].insert(root, GraphPath());
@@ -889,8 +888,7 @@ void QGraphicsAnchorLayoutPrivate::calculateVertexPositions(
QSet<AnchorVertex *> visited;
// Get root vertex
- bool ok;
- AnchorVertex *root = graph[orientation].firstVertex(&ok);
+ AnchorVertex *root = graph[orientation].rootVertex();
qreal widgetMargin;
qreal layoutMargin;