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()
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();
}
}
}
+/*
+ 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);
QPODVector<PositionedItem,8> positionedItems;
QPODVector<PositionedItem,8> unpositionedItems;//Still 'in' the positioner, just not positioned
+
void positionItem(qreal x, qreal y, PositionedItem *target);
void positionItemX(qreal, PositionedItem *target);
void positionItemY(qreal, PositionedItem *target);
+ void removePositionedItem(QPODVector<PositionedItem,8> *items, int index);
+ void clearPositionedItems(QPODVector<PositionedItem,8> *items);
+
private:
Q_DISABLE_COPY(QQuickBasePositioner)
Q_DECLARE_PRIVATE(QQuickBasePositioner)
void itemDestroyed(QQuickItem *item)
{
Q_Q(QQuickBasePositioner);
- q->positionedItems.removeOne(QQuickBasePositioner::PositionedItem(item));
+ int index = q->positionedItems.find(QQuickBasePositioner::PositionedItem(item));
+ if (index >= 0)
+ q->removePositionedItem(&q->positionedItems, index);
}
static Qt::LayoutDirection getLayoutDirection(const QQuickBasePositioner *positioner)