diff options
author | Martin Jones <martin.jones@nokia.com> | 2012-03-16 18:45:39 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-19 10:49:21 +0100 |
commit | 6deb3ceffa209d710570ffeb361e95c988e6e7cd (patch) | |
tree | c0d7972e3b03771667dc7def07b421bb3763f2dd /src | |
parent | f079f789c593996b0023afd6318d60d18ac66578 (diff) |
Resetting a model can cause a crash in views with header/footer.
Geometry listeners were called for deleted header/footer.
Change-Id: I47854178232f8a4ab5e19a931901b49741fec388
Reviewed-by: Bea Lam <bea.lam@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/items/qquickgridview.cpp | 25 | ||||
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 11 | ||||
-rw-r--r-- | src/quick/items/qquickitemview_p_p.h | 7 | ||||
-rw-r--r-- | src/quick/items/qquicklistview.cpp | 25 |
4 files changed, 43 insertions, 25 deletions
diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index dd7a3faa6f..1fab4a8c99 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -66,13 +66,22 @@ QT_BEGIN_NAMESPACE class FxGridItemSG : public FxViewItem { public: - FxGridItemSG(QQuickItem *i, QQuickGridView *v, bool own) : FxViewItem(i, own), view(v) { + FxGridItemSG(QQuickItem *i, QQuickGridView *v, bool own, bool trackGeometry) : FxViewItem(i, own, trackGeometry), view(v) { attached = static_cast<QQuickGridViewAttached*>(qmlAttachedPropertiesObject<QQuickGridView>(item)); if (attached) static_cast<QQuickGridViewAttached*>(attached)->setView(view); + if (trackGeometry) { + QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + itemPrivate->addItemChangeListener(QQuickItemViewPrivate::get(view), QQuickItemPrivate::Geometry); + } } - ~FxGridItemSG() {} + ~FxGridItemSG() { + if (trackGeom) { + QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + itemPrivate->removeItemChangeListener(QQuickItemViewPrivate::get(view), QQuickItemPrivate::Geometry); + } + } qreal position() const { return rowPos(); @@ -423,7 +432,7 @@ FxViewItem *QQuickGridViewPrivate::newViewItem(int modelIndex, QQuickItem *item) { Q_Q(QQuickGridView); Q_UNUSED(modelIndex); - return new FxGridItemSG(item, q, false); + return new FxGridItemSG(item, q, false, false); } void QQuickGridViewPrivate::initializeViewItem(FxViewItem *item) @@ -685,7 +694,7 @@ void QQuickGridViewPrivate::createHighlight() if (currentItem) { QQuickItem *item = createHighlightItem(); if (item) { - FxGridItemSG *newHighlight = new FxGridItemSG(item, q, true); + FxGridItemSG *newHighlight = new FxGridItemSG(item, q, true, true); if (autoHighlight) resetHighlightPosition(); highlightXAnimator = new QSmoothedAnimation; @@ -760,11 +769,11 @@ void QQuickGridViewPrivate::updateFooter() Q_Q(QQuickGridView); bool created = false; if (!footer) { - QQuickItem *item = createComponentItem(footerComponent, true); + QQuickItem *item = createComponentItem(footerComponent); if (!item) return; item->setZ(1); - footer = new FxGridItemSG(item, q, true); + footer = new FxGridItemSG(item, q, true, true); created = true; } @@ -799,11 +808,11 @@ void QQuickGridViewPrivate::updateHeader() Q_Q(QQuickGridView); bool created = false; if (!header) { - QQuickItem *item = createComponentItem(headerComponent, true); + QQuickItem *item = createComponentItem(headerComponent); if (!item) return; item->setZ(1); - header = new FxGridItemSG(item, q, true); + header = new FxGridItemSG(item, q, true, true); created = true; } diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 5089d230d7..50a3216bf0 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -45,11 +45,12 @@ QT_BEGIN_NAMESPACE -FxViewItem::FxViewItem(QQuickItem *i, bool own) +FxViewItem::FxViewItem(QQuickItem *i, bool own, bool trackGeometry) : item(i) , transitionableItem(0) , ownItem(own) , releaseAfterTransition(false) + , trackGeom(trackGeometry) { } @@ -2195,10 +2196,10 @@ bool QQuickItemViewPrivate::releaseItem(FxViewItem *item) QQuickItem *QQuickItemViewPrivate::createHighlightItem() { - return createComponentItem(highlightComponent, true, true); + return createComponentItem(highlightComponent, true); } -QQuickItem *QQuickItemViewPrivate::createComponentItem(QQmlComponent *component, bool receiveItemGeometryChanges, bool createDefault) +QQuickItem *QQuickItemViewPrivate::createComponentItem(QQmlComponent *component, bool createDefault) { Q_Q(QQuickItemView); @@ -2222,10 +2223,6 @@ QQuickItem *QQuickItemViewPrivate::createComponentItem(QQmlComponent *component, if (item) { QQml_setParent_noEvent(item, q->contentItem()); item->setParentItem(q->contentItem()); - if (receiveItemGeometryChanges) { - QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); - itemPrivate->addItemChangeListener(this, QQuickItemPrivate::Geometry); - } } return item; } diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index dfc0a8bc7e..7516761ee8 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -60,7 +60,7 @@ QT_MODULE(Quick) class FxViewItem { public: - FxViewItem(QQuickItem *, bool own); + FxViewItem(QQuickItem *, bool own, bool trackGeometry); virtual ~FxViewItem(); qreal itemX() const; @@ -92,6 +92,7 @@ public: int index; bool ownItem; bool releaseAfterTransition; + bool trackGeom; }; @@ -124,6 +125,8 @@ public: QQuickItemViewPrivate(); ~QQuickItemViewPrivate(); + static inline QQuickItemViewPrivate *get(QQuickItemView *o) { return o->d_func(); } + struct ChangeResult { QQmlNullableValue<qreal> visiblePos; bool changedFirstItem; @@ -191,7 +194,7 @@ public: virtual bool releaseItem(FxViewItem *item); QQuickItem *createHighlightItem(); - QQuickItem *createComponentItem(QQmlComponent *component, bool receiveItemGeometryChanges, bool createDefault = false); + QQuickItem *createComponentItem(QQmlComponent *component, bool createDefault = false); void updateCurrent(int modelIndex); void updateTrackedItem(); diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 9d9e3ae186..6f33545185 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -236,13 +236,22 @@ void QQuickViewSection::setLabelPositioning(int l) class FxListItemSG : public FxViewItem { public: - FxListItemSG(QQuickItem *i, QQuickListView *v, bool own) : FxViewItem(i, own), view(v) { + FxListItemSG(QQuickItem *i, QQuickListView *v, bool own, bool trackGeometry) : FxViewItem(i, own, trackGeometry), view(v) { attached = static_cast<QQuickListViewAttached*>(qmlAttachedPropertiesObject<QQuickListView>(item)); if (attached) static_cast<QQuickListViewAttached*>(attached)->setView(view); + if (trackGeometry) { + QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + itemPrivate->addItemChangeListener(QQuickItemViewPrivate::get(view), QQuickItemPrivate::Geometry); + } } - ~FxListItemSG() {} + ~FxListItemSG() { + if (trackGeom) { + QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + itemPrivate->removeItemChangeListener(QQuickItemViewPrivate::get(view), QQuickItemPrivate::Geometry); + } + } inline QQuickItem *section() const { return attached ? static_cast<QQuickListViewAttached*>(attached)->m_sectionItem : 0; @@ -536,7 +545,7 @@ FxViewItem *QQuickListViewPrivate::newViewItem(int modelIndex, QQuickItem *item) { Q_Q(QQuickListView); - FxListItemSG *listItem = new FxListItemSG(item, q, false); + FxListItemSG *listItem = new FxListItemSG(item, q, false, false); listItem->index = modelIndex; // initialise attached properties @@ -835,7 +844,7 @@ void QQuickListViewPrivate::createHighlight() if (currentItem) { QQuickItem *item = createHighlightItem(); if (item) { - FxListItemSG *newHighlight = new FxListItemSG(item, q, true); + FxListItemSG *newHighlight = new FxListItemSG(item, q, true, true); if (autoHighlight) { newHighlight->setSize(static_cast<FxListItemSG*>(currentItem)->itemSize()); @@ -1238,11 +1247,11 @@ void QQuickListViewPrivate::updateFooter() Q_Q(QQuickListView); bool created = false; if (!footer) { - QQuickItem *item = createComponentItem(footerComponent, true); + QQuickItem *item = createComponentItem(footerComponent); if (!item) return; item->setZ(1); - footer = new FxListItemSG(item, q, true); + footer = new FxListItemSG(item, q, true, true); created = true; } @@ -1269,11 +1278,11 @@ void QQuickListViewPrivate::updateHeader() Q_Q(QQuickListView); bool created = false; if (!header) { - QQuickItem *item = createComponentItem(headerComponent, true); + QQuickItem *item = createComponentItem(headerComponent); if (!item) return; item->setZ(1); - header = new FxListItemSG(item, q, true); + header = new FxListItemSG(item, q, true, true); created = true; } |