diff options
author | Bea Lam <bea.lam@nokia.com> | 2012-03-07 18:20:06 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-10 03:49:01 +0100 |
commit | fc741d3ac3f3b4da330100da10ce1a800cdb467b (patch) | |
tree | 220ea4a0fd7b3d20c77cbced4337341aacf0c4f4 /src/quick/items/qquickpositioners.cpp | |
parent | f2e1be963f885a6030136591414cdbda26d50695 (diff) |
Clean up transition objects for positioners
These must be cleaned up whenever items are removed from the internal
PositionedItem lists.
Change-Id: I56f64a29bd98c603b00faaead514fd43780c18de
Reviewed-by: Alan Alpert <alan.alpert@nokia.com>
Diffstat (limited to 'src/quick/items/qquickpositioners.cpp')
-rw-r--r-- | src/quick/items/qquickpositioners.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/src/quick/items/qquickpositioners.cpp b/src/quick/items/qquickpositioners.cpp index 4a4e6fc6d9..7c4cd18346 100644 --- a/src/quick/items/qquickpositioners.cpp +++ b/src/quick/items/qquickpositioners.cpp @@ -168,7 +168,8 @@ QQuickBasePositioner::~QQuickBasePositioner() d->unwatchChanges(positionedItems.at(i).item); for (int i = 0; i < unpositionedItems.count(); ++i) d->unwatchChanges(unpositionedItems.at(i).item); - positionedItems.clear(); + clearPositionedItems(&positionedItems); + clearPositionedItems(&unpositionedItems); } void QQuickBasePositioner::updatePolish() @@ -248,10 +249,10 @@ void QQuickBasePositioner::itemChange(ItemChange change, const ItemChangeData &v int idx = positionedItems.find(posItem); if (idx >= 0) { d->unwatchChanges(child); - positionedItems.remove(idx); + removePositionedItem(&positionedItems, idx); } else if ((idx = unpositionedItems.find(posItem)) >= 0) { d->unwatchChanges(child); - unpositionedItems.remove(idx); + removePositionedItem(&unpositionedItems, idx); } d->setPositioningDirty(); } @@ -394,6 +395,24 @@ void QQuickBasePositioner::positionItemY(qreal y, PositionedItem *target) } } +/* + Since PositionedItem values are stored by value, their internal transitionableItem pointers + must be cleaned up when a PositionedItem is removed from a QPODVector, otherwise the pointer + is never deleted since QPODVector doesn't invoke the destructor. + */ +void QQuickBasePositioner::removePositionedItem(QPODVector<PositionedItem,8> *items, int index) +{ + Q_ASSERT(index >= 0 && index < items->count()); + delete items->at(index).transitionableItem; + items->remove(index); +} +void QQuickBasePositioner::clearPositionedItems(QPODVector<PositionedItem,8> *items) +{ + for (int i=0; i<items->count(); i++) + delete items->at(i).transitionableItem; + items->clear(); +} + QQuickPositionerAttached *QQuickBasePositioner::qmlAttachedProperties(QObject *obj) { return new QQuickPositionerAttached(obj); |