From 4cecce2273d45e42136f70d3ae6453aa37e1d934 Mon Sep 17 00:00:00 2001 From: "Eduardo M. Fleury" Date: Thu, 28 May 2009 20:27:11 -0300 Subject: QGraphicsAnchorLayout: Delete center constraints on item removal Each time an item is added to the layout, center constraits are created to ensure its internal anchors keep their size equal. To avoid memory leaks, we must delete them when the item is removed. Signed-off-by: Eduardo M. Fleury --- src/gui/graphicsview/qgraphicsanchorlayout.cpp | 24 +++++++++++---------- src/gui/graphicsview/qgraphicsanchorlayout_p.cpp | 27 ++++++++++++++++++++++++ src/gui/graphicsview/qgraphicsanchorlayout_p.h | 1 + 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/gui/graphicsview/qgraphicsanchorlayout.cpp b/src/gui/graphicsview/qgraphicsanchorlayout.cpp index 7cde4ec..ba3ba2a 100644 --- a/src/gui/graphicsview/qgraphicsanchorlayout.cpp +++ b/src/gui/graphicsview/qgraphicsanchorlayout.cpp @@ -61,14 +61,12 @@ QGraphicsAnchorLayout::~QGraphicsAnchorLayout() } } + d->removeCenterConstraints(this, QGraphicsAnchorLayoutPrivate::Horizontal); + d->removeCenterConstraints(this, QGraphicsAnchorLayoutPrivate::Vertical); d->deleteLayoutEdges(); - // ### make something better here - qDeleteAll(d->itemCenterConstraints[0]); - d->itemCenterConstraints[0].clear(); - qDeleteAll(d->itemCenterConstraints[1]); - d->itemCenterConstraints[1].clear(); - + Q_ASSERT(d->itemCenterConstraints[0].isEmpty()); + Q_ASSERT(d->itemCenterConstraints[1].isEmpty()); Q_ASSERT(d->items.isEmpty()); Q_ASSERT(d->m_vertexList.isEmpty()); } @@ -187,11 +185,15 @@ void QGraphicsAnchorLayout::removeAt(int index) Q_D(QGraphicsAnchorLayout); QGraphicsLayoutItem *item = d->items.value(index); - if (item) { - d->items.remove(index); - d->removeAnchors(item); - item->setParentLayoutItem(0); - } + if (!item) + return; + + d->removeCenterConstraints(item, QGraphicsAnchorLayoutPrivate::Horizontal); + d->removeCenterConstraints(item, QGraphicsAnchorLayoutPrivate::Vertical); + d->removeAnchors(item); + d->items.remove(index); + + item->setParentLayoutItem(0); invalidate(); } diff --git a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp index b0ffea4..8158f48 100644 --- a/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp +++ b/src/gui/graphicsview/qgraphicsanchorlayout_p.cpp @@ -225,6 +225,33 @@ void QGraphicsAnchorLayoutPrivate::createItemEdges(QGraphicsLayoutItem *item) itemCenterConstraints[Vertical].append(c); } +void QGraphicsAnchorLayoutPrivate::removeCenterConstraints(QGraphicsLayoutItem *item, + Orientation orientation) +{ + // Remove the item center constraints associated to this item + // ### This is a temporary solution. We should probably use a better + // data structure to hold items and/or their associated constraints + // so that we can remove those easily + + AnchorVertex *first = internalVertex(item, orientation == Horizontal ? + QGraphicsAnchorLayout::Left : + QGraphicsAnchorLayout::Top); + AnchorVertex *second = internalVertex(item, orientation == Horizontal ? + QGraphicsAnchorLayout::HCenter : + QGraphicsAnchorLayout::VCenter); + + Q_ASSERT(first && second); + AnchorData *internalAnchor = graph[orientation].edgeData(first, second); + + // Look for our anchor in all item center constraints, then remove it + for (int i = 0; i < itemCenterConstraints[orientation].size(); ++i) { + if (itemCenterConstraints[orientation][i]->variables.contains(internalAnchor)) { + delete itemCenterConstraints[orientation].takeAt(i); + break; + } + } +} + void QGraphicsAnchorLayoutPrivate::addAnchor(QGraphicsLayoutItem *firstItem, QGraphicsAnchorLayout::Edge firstEdge, QGraphicsLayoutItem *secondItem, diff --git a/src/gui/graphicsview/qgraphicsanchorlayout_p.h b/src/gui/graphicsview/qgraphicsanchorlayout_p.h index 27855e6..6370f4a 100644 --- a/src/gui/graphicsview/qgraphicsanchorlayout_p.h +++ b/src/gui/graphicsview/qgraphicsanchorlayout_p.h @@ -233,6 +233,7 @@ public: void createLayoutEdges(); void deleteLayoutEdges(); void createItemEdges(QGraphicsLayoutItem *item); + void removeCenterConstraints(QGraphicsLayoutItem *item, Orientation orientation); // Anchor Manipulation methods void addAnchor(QGraphicsLayoutItem *firstItem, -- cgit v0.12