diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-10-13 16:25:57 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-10-17 08:47:42 +0000 |
commit | 71031b6e8c53a63f77542dbaaae05ca916287cfc (patch) | |
tree | a1bce4d24819124be179edc8cd04f994fc1da5be /src/quicktemplates2/qquickcontainer.cpp | |
parent | b8141609d2ee962b919e1f05f7bd12ebc2ca9d11 (diff) |
QQuickContainer: fix itemSiblingOrderChanged()
The problem was that QQuickContainer started already moving items while
QQmlObjectModel was creating items and QQuickRepeater was initializing
the order. Don't reorder items during the creation, but only after
component completion.
Task-number: QTBUG-61310
Change-Id: I13380c5ab6b3bddaad3fa03ef6fb028622b4cd11
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickcontainer.cpp')
-rw-r--r-- | src/quicktemplates2/qquickcontainer.cpp | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/src/quicktemplates2/qquickcontainer.cpp b/src/quicktemplates2/qquickcontainer.cpp index 919eff70..7cf73841 100644 --- a/src/quicktemplates2/qquickcontainer.cpp +++ b/src/quicktemplates2/qquickcontainer.cpp @@ -306,6 +306,24 @@ void QQuickContainerPrivate::removeItem(int index, QQuickItem *item) updatingCurrent = false; } +void QQuickContainerPrivate::reorderItems() +{ + Q_Q(QQuickContainer); + if (!contentItem) + return; + + QList<QQuickItem *> siblings = effectiveContentItem(contentItem)->childItems(); + + int to = 0; + for (int i = 0; i < siblings.count(); ++i) { + QQuickItem* sibling = siblings.at(i); + if (QQuickItemPrivate::get(sibling)->isTransparentForPositioner()) + continue; + int index = contentModel->indexOf(sibling, nullptr); + q->moveItem(index, to++); + } +} + void QQuickContainerPrivate::_q_currentIndexChanged() { Q_Q(QQuickContainer); @@ -329,18 +347,11 @@ void QQuickContainerPrivate::itemParentChanged(QQuickItem *item, QQuickItem *par void QQuickContainerPrivate::itemSiblingOrderChanged(QQuickItem *) { - // reorder the restacked items (eg. by a Repeater) - Q_Q(QQuickContainer); - QList<QQuickItem *> siblings = effectiveContentItem(contentItem)->childItems(); + if (!componentComplete) + return; - int to = 0; - for (int i = 0; i < siblings.count(); ++i) { - QQuickItem* sibling = siblings.at(i); - if (QQuickItemPrivate::get(sibling)->isTransparentForPositioner()) - continue; - int index = contentModel->indexOf(sibling, nullptr); - q->moveItem(index, to++); - } + // reorder the restacked items (eg. by a Repeater) + reorderItems(); } void QQuickContainerPrivate::itemDestroyed(QQuickItem *item) @@ -682,6 +693,13 @@ QQuickItem *QQuickContainer::currentItem() const return itemAt(d->currentIndex); } +void QQuickContainer::componentComplete() +{ + Q_D(QQuickContainer); + QQuickControl::componentComplete(); + d->reorderItems(); +} + void QQuickContainer::itemChange(ItemChange change, const ItemChangeData &data) { Q_D(QQuickContainer); |