From 114e4b6ca9a1871f75dc5b9d443ab1e344eb99af Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Wed, 12 Aug 2009 17:53:54 -0300 Subject: QGraphicsAnchorLayout: fix restore simplification logic Patch from Jan-Arve. --- src/gui/graphicsview/qgraphicsanchorlayout_p.cpp | 44 +++++++----------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp index f0e0660..7e0541e 100644 --- a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp +++ b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp @@ -461,19 +461,16 @@ static void restoreSimplifiedAnchor(Graph &g, } prev = v1; } - g.removeEdge(before, after); } else if (edge->type == AnchorData::Parallel) { ParallelAnchorData* parallelEdge = static_cast(edge); AnchorData *parallelEdges[2] = {parallelEdge->firstEdge, - parallelEdge->secondEdge}; - // must remove the old anchor first - g.removeEdge(before, after); + parallelEdge->secondEdge}; for (int i = 0; i < 2; ++i) { AnchorData *data = parallelEdges[i]; - if (data->type != AnchorData::Normal) { - restoreSimplifiedAnchor(g, data, before, after); - } else { + if (data->type == AnchorData::Normal) { g.createEdge(before, after, data); + } else { + restoreSimplifiedAnchor(g, data, before, after); } } } @@ -483,32 +480,17 @@ void QGraphicsAnchorLayoutPrivate::restoreSimplifiedGraph(Orientation orientatio { Q_Q(QGraphicsAnchorLayout); Graph &g = graph[orientation]; - AnchorVertex *v = g.rootVertex(); - - if (!v) - return; - QSet visited; - QStack stack; - stack.push(v); - QGraphicsAnchorLayout::Edge layoutCenterEdge = pickEdge(QGraphicsAnchorLayout::HCenter, orientation); - // walk depth-first. - while (!stack.isEmpty()) { - v = stack.pop(); - QList vertices = g.adjacentVertices(v); - const int count = vertices.count(); - for (int i = 0; i < count; ++i) { - AnchorVertex *next = vertices.at(i); - if (next->m_item == q && next->m_edge == layoutCenterEdge) - continue; - if (visited.contains(next)) - continue; - - AnchorData *edge = g.edgeData(v, next); - if (edge->type != AnchorData::Normal) - restoreSimplifiedAnchor(g, edge, v, next); + QList > connections = g.connections(); + for (int i = 0; i < connections.count(); ++i) { + AnchorVertex *v1 = connections.at(i).first; + AnchorVertex *v2 = connections.at(i).second; + AnchorData *edge = g.edgeData(v1, v2); + if (edge->type != AnchorData::Normal) { + AnchorData *oldEdge = g.takeEdge(v1, v2); + restoreSimplifiedAnchor(g, edge, v1, v2); + delete oldEdge; } - visited.insert(v); } } -- cgit v0.12