aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-10-13 16:25:57 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2017-10-17 08:47:42 +0000
commit71031b6e8c53a63f77542dbaaae05ca916287cfc (patch)
treea1bce4d24819124be179edc8cd04f994fc1da5be
parentb8141609d2ee962b919e1f05f7bd12ebc2ca9d11 (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>
-rw-r--r--src/quicktemplates2/qquickcontainer.cpp40
-rw-r--r--src/quicktemplates2/qquickcontainer_p.h2
-rw-r--r--src/quicktemplates2/qquickcontainer_p_p.h1
-rw-r--r--tests/auto/controls/data/tst_container.qml30
4 files changed, 59 insertions, 14 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);
diff --git a/src/quicktemplates2/qquickcontainer_p.h b/src/quicktemplates2/qquickcontainer_p.h
index 6db45589..59f85b49 100644
--- a/src/quicktemplates2/qquickcontainer_p.h
+++ b/src/quicktemplates2/qquickcontainer_p.h
@@ -98,6 +98,8 @@ Q_SIGNALS:
protected:
QQuickContainer(QQuickContainerPrivate &dd, QQuickItem *parent);
+ void componentComplete() override;
+
void itemChange(ItemChange change, const ItemChangeData &data) override;
void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) override;
diff --git a/src/quicktemplates2/qquickcontainer_p_p.h b/src/quicktemplates2/qquickcontainer_p_p.h
index 38c6b3e4..bc892c7d 100644
--- a/src/quicktemplates2/qquickcontainer_p_p.h
+++ b/src/quicktemplates2/qquickcontainer_p_p.h
@@ -68,6 +68,7 @@ public:
void insertItem(int index, QQuickItem *item);
void moveItem(int from, int to);
void removeItem(int index, QQuickItem *item);
+ void reorderItems();
void _q_currentIndexChanged();
diff --git a/tests/auto/controls/data/tst_container.qml b/tests/auto/controls/data/tst_container.qml
index b8de2b08..7c5efc1f 100644
--- a/tests/auto/controls/data/tst_container.qml
+++ b/tests/auto/controls/data/tst_container.qml
@@ -128,7 +128,7 @@ TestCase {
}
Component {
- id: repeaterContainer
+ id: repeaterContainer1
Container {
id: container
Item { objectName: "0" }
@@ -143,9 +143,33 @@ TestCase {
}
}
+ Component {
+ id: repeaterContainer2
+ Container {
+ id: container
+ contentItem: Item {
+ Repeater {
+ model: container.contentModel
+ }
+ Rectangle { objectName: "extra" }
+ }
+ Rectangle { objectName: "0" }
+ Rectangle { objectName: "1" }
+ Rectangle { objectName: "2" }
+ Rectangle { objectName: "3" }
+ }
+ }
+
+ function test_repeater_data() {
+ return [
+ { tag: "1", component: repeaterContainer1 },
+ { tag: "2", component: repeaterContainer2 }
+ ]
+ }
+
// don't crash (QTBUG-61310)
- function test_repeater() {
- var control = createTemporaryObject(repeaterContainer)
+ function test_repeater(data) {
+ var control = createTemporaryObject(data.component)
verify(control)
compare(control.itemAt(0).objectName, "0")