aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickpositioners.cpp
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2012-03-07 18:20:06 +1000
committerQt by Nokia <qt-info@nokia.com>2012-03-10 03:49:01 +0100
commitfc741d3ac3f3b4da330100da10ce1a800cdb467b (patch)
tree220ea4a0fd7b3d20c77cbced4337341aacf0c4f4 /src/quick/items/qquickpositioners.cpp
parentf2e1be963f885a6030136591414cdbda26d50695 (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.cpp25
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);