diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/qml/qqmlcomponent.cpp | 5 | ||||
-rw-r--r-- | src/qml/qml/qqmlcomponent_p.h | 1 | ||||
-rw-r--r-- | src/quick/items/qquicklistview.cpp | 29 |
3 files changed, 29 insertions, 6 deletions
diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp index b72c745490..d651cbf636 100644 --- a/src/qml/qml/qqmlcomponent.cpp +++ b/src/qml/qml/qqmlcomponent.cpp @@ -345,6 +345,11 @@ RequiredProperties &QQmlComponentPrivate::requiredProperties() return state.creator->requiredProperties(); } +bool QQmlComponentPrivate::hadRequiredProperties() const +{ + return state.creator->componentHadRequiredProperties(); +} + void QQmlComponentPrivate::clear() { if (typeData) { diff --git a/src/qml/qml/qqmlcomponent_p.h b/src/qml/qml/qqmlcomponent_p.h index 8ae7672c19..a919eb45c0 100644 --- a/src/qml/qml/qqmlcomponent_p.h +++ b/src/qml/qml/qqmlcomponent_p.h @@ -108,6 +108,7 @@ public: int start; RequiredProperties& requiredProperties(); + bool hadRequiredProperties() const; QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit; struct ConstructionState { diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 146917c679..95a36ab4d4 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -49,6 +49,7 @@ #include <QtCore/qmath.h> #include <private/qquicksmoothedanimation_p_p.h> +#include <private/qqmlcomponent_p.h> #include "qplatformdefs.h" QT_BEGIN_NAMESPACE @@ -190,6 +191,8 @@ public: } friend class QQuickViewSection; + + static void setSectionHelper(QQmlContext *context, QQuickItem *sectionItem, const QString §ion); }; //---------------------------------------------------------------------------- @@ -992,14 +995,20 @@ QQuickItem * QQuickListViewPrivate::getSectionItem(const QString §ion) sectionCache[i] = nullptr; sectionItem->setVisible(true); QQmlContext *context = QQmlEngine::contextForObject(sectionItem)->parentContext(); - context->setContextProperty(QLatin1String("section"), section); + setSectionHelper(context, sectionItem, section); } else { QQmlContext *creationContext = sectionCriteria->delegate()->creationContext(); QQmlContext *context = new QQmlContext( creationContext ? creationContext : qmlContext(q)); - context->setContextProperty(QLatin1String("section"), section); - QObject *nobj = sectionCriteria->delegate()->beginCreate(context); + QQmlComponent* delegate = sectionCriteria->delegate(); + QQmlComponentPrivate* delegatePriv = QQmlComponentPrivate::get(delegate); + QObject *nobj = delegate->beginCreate(context); if (nobj) { + if (delegatePriv->hadRequiredProperties()) { + delegate->setInitialProperties(nobj, {{"section", section}}); + } else { + context->setContextProperty(QLatin1String("section"), section); + } QQml_setParent_noEvent(context, nobj); sectionItem = qobject_cast<QQuickItem *>(nobj); if (!sectionItem) { @@ -1069,7 +1078,7 @@ void QQuickListViewPrivate::updateInlineSection(FxListItemSG *listItem) listItem->setPosition(pos); } else { QQmlContext *context = QQmlEngine::contextForObject(listItem->section())->parentContext(); - context->setContextProperty(QLatin1String("section"), listItem->attached->m_section); + setSectionHelper(context, listItem->section(), listItem->attached->m_section); } } else if (listItem->section()) { qreal pos = listItem->position(); @@ -1125,7 +1134,7 @@ void QQuickListViewPrivate::updateStickySections() currentSectionItem = getSectionItem(currentSection); } else if (QString::compare(currentStickySection, currentSection, Qt::CaseInsensitive)) { QQmlContext *context = QQmlEngine::contextForObject(currentSectionItem)->parentContext(); - context->setContextProperty(QLatin1String("section"), currentSection); + setSectionHelper(context, currentSectionItem, currentSection); } currentStickySection = currentSection; if (!currentSectionItem) @@ -1159,7 +1168,7 @@ void QQuickListViewPrivate::updateStickySections() nextSectionItem = getSectionItem(nextSection); } else if (QString::compare(nextStickySection, nextSection, Qt::CaseInsensitive)) { QQmlContext *context = QQmlEngine::contextForObject(nextSectionItem)->parentContext(); - context->setContextProperty(QLatin1String("section"), nextSection); + setSectionHelper(context, nextSectionItem, nextSection); } nextStickySection = nextSection; if (!nextSectionItem) @@ -1754,6 +1763,14 @@ bool QQuickListViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExte } } +void QQuickListViewPrivate::setSectionHelper(QQmlContext *context, QQuickItem *sectionItem, const QString §ion) +{ + if (context->contextProperty(QLatin1String("section")).isValid()) + context->setContextProperty(QLatin1String("section"), section); + else + sectionItem->setProperty("section", section); +} + //---------------------------------------------------------------------------- /*! |