aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/imports/layouts/qquickstacklayout.cpp22
-rw-r--r--src/imports/layouts/qquickstacklayout_p.h2
-rw-r--r--tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml1
3 files changed, 14 insertions, 11 deletions
diff --git a/src/imports/layouts/qquickstacklayout.cpp b/src/imports/layouts/qquickstacklayout.cpp
index bd2f93c630..d3d140abc8 100644
--- a/src/imports/layouts/qquickstacklayout.cpp
+++ b/src/imports/layouts/qquickstacklayout.cpp
@@ -171,6 +171,7 @@ void QQuickStackLayout::itemChange(QQuickItem::ItemChange change, const QQuickIt
QQuickLayout::itemChange(change, value);
if (change == ItemChildRemovedChange) {
+ m_cachedItemSizeHints.remove(value.item);
invalidate();
} else if (change == ItemChildAddedChange) {
invalidate();
@@ -254,11 +255,12 @@ void QQuickStackLayout::setAlignment(QQuickItem * /*item*/, Qt::Alignment /*alig
void QQuickStackLayout::invalidate(QQuickItem *childItem)
{
- const int indexOfChild = indexOf(childItem);
- if (indexOfChild >= 0 && indexOfChild < m_cachedItemSizeHints.count()) {
- m_cachedItemSizeHints[indexOfChild].min() = QSizeF();
- m_cachedItemSizeHints[indexOfChild].pref() = QSizeF();
- m_cachedItemSizeHints[indexOfChild].max() = QSizeF();
+ ensureLayoutItemsUpdated();
+ if (childItem) {
+ SizeHints &hints = m_cachedItemSizeHints[childItem];
+ hints.min() = QSizeF();
+ hints.pref() = QSizeF();
+ hints.max() = QSizeF();
}
for (int i = 0; i < Qt::NSizeHints; ++i)
@@ -284,7 +286,6 @@ void QQuickStackLayout::updateLayoutItems()
if (count != d->count) {
d->count = count;
emit countChanged();
- m_cachedItemSizeHints.resize(count);
}
for (int i = 0; i < count; ++i) {
QQuickItem *child = itemAt(i);
@@ -293,10 +294,13 @@ void QQuickStackLayout::updateLayoutItems()
}
}
-QQuickStackLayout::SizeHints &QQuickStackLayout::cachedItemSizeHints(int index) const {
- SizeHints &hints = m_cachedItemSizeHints[index];
+QQuickStackLayout::SizeHints &QQuickStackLayout::cachedItemSizeHints(int index) const
+{
+ QQuickItem *item = itemAt(index);
+ Q_ASSERT(item);
+ SizeHints &hints = m_cachedItemSizeHints[item]; // will create an entry if it doesn't exist
if (!hints.min().isValid())
- QQuickStackLayout::collectItemSizeHints(itemAt(index), hints.array);
+ QQuickStackLayout::collectItemSizeHints(item, hints.array);
return hints;
}
diff --git a/src/imports/layouts/qquickstacklayout_p.h b/src/imports/layouts/qquickstacklayout_p.h
index e46c608926..41aac01ec8 100644
--- a/src/imports/layouts/qquickstacklayout_p.h
+++ b/src/imports/layouts/qquickstacklayout_p.h
@@ -95,7 +95,7 @@ private:
QSizeF array[Qt::NSizeHints];
} SizeHints;
- mutable QVector<SizeHints> m_cachedItemSizeHints;
+ mutable QHash<QQuickItem*, SizeHints> m_cachedItemSizeHints;
mutable QSizeF m_cachedSizeHints[Qt::NSizeHints];
SizeHints &cachedItemSizeHints(int index) const;
};
diff --git a/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml b/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml
index 32b149336a..2536b9789f 100644
--- a/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml
+++ b/tests/auto/quick/qquicklayouts/data/tst_stacklayout.qml
@@ -255,7 +255,6 @@ Item {
function test_addAndRemoveItems()
{
- skip("There is a bug with the internal StackLayout cache that causes this to fail")
var stack = emtpy_StackLayout_Component.createObject(container)
stack.currentIndex = 2
compare(stack.implicitWidth, 0)