diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2019-08-13 17:11:48 +0200 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2019-09-12 17:41:17 +0200 |
commit | ba30971c7e3a89a79f0b91618bf95f515d8a16d1 (patch) | |
tree | f2e96693bf3ddafe07e22165dfd928a3a054e32c /src/quick/items/qquicklistview.cpp | |
parent | 6848770529007af3eccf269419e5fe9220670e59 (diff) |
qquicklistview: support required properties in sectionDelegate
This changes the accessibile properties in the sectionDelegate:
If the sectionDelegate contains requiredProperties, "section" will not
be injected into a newly created parent scope.
Instead, the section property of the delegate will be set if it exists.
Change-Id: I34b04d08d2f80af7ea53fd722f08be0f9aea6e72
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/quick/items/qquicklistview.cpp')
-rw-r--r-- | src/quick/items/qquicklistview.cpp | 29 |
1 files changed, 23 insertions, 6 deletions
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); +} + //---------------------------------------------------------------------------- /*! |