diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/jsruntime/qv4qmlcontext.cpp | 10 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 29 | ||||
-rw-r--r-- | src/qml/qml/qqmlprivate.h | 1 | ||||
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 28 | ||||
-rw-r--r-- | src/quick/items/qquickitemview_p_p.h | 2 |
5 files changed, 58 insertions, 12 deletions
diff --git a/src/qml/jsruntime/qv4qmlcontext.cpp b/src/qml/jsruntime/qv4qmlcontext.cpp index 6aa0130188..969d44ecf6 100644 --- a/src/qml/jsruntime/qv4qmlcontext.cpp +++ b/src/qml/jsruntime/qv4qmlcontext.cpp @@ -539,7 +539,6 @@ ReturnedValue QQmlContextWrapper::lookupIdObject(Lookup *l, ExecutionEngine *eng ReturnedValue QQmlContextWrapper::lookupScopeObjectProperty(Lookup *l, ExecutionEngine *engine, Value *base) { - Q_UNUSED(base) Scope scope(engine); Scoped<QmlContext> qmlContext(scope, engine->qmlContext()); if (!qmlContext) @@ -560,12 +559,15 @@ ReturnedValue QQmlContextWrapper::lookupScopeObjectProperty(Lookup *l, Execution }; ScopedValue obj(scope, QV4::QObjectWrapper::wrap(engine, scopeObject)); + + if (base) + *base = obj; + return QObjectWrapper::lookupGetterImpl(l, engine, obj, /*useOriginalProperty*/ true, revertLookup); } ReturnedValue QQmlContextWrapper::lookupContextObjectProperty(Lookup *l, ExecutionEngine *engine, Value *base) { - Q_UNUSED(base) Scope scope(engine); Scoped<QmlContext> qmlContext(scope, engine->qmlContext()); if (!qmlContext) @@ -590,6 +592,10 @@ ReturnedValue QQmlContextWrapper::lookupContextObjectProperty(Lookup *l, Executi }; ScopedValue obj(scope, QV4::QObjectWrapper::wrap(engine, contextObject)); + + if (base) + *base = obj; + return QObjectWrapper::lookupGetterImpl(l, engine, obj, /*useOriginalProperty*/ true, revertLookup); } diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index 29b19b433f..0f8a850584 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -1641,7 +1641,14 @@ void qmlClearTypeRegistrations() // Declared in qqml.h #endif } -static int registerAutoParentFunction(QQmlPrivate::RegisterAutoParent &autoparent) +static void unregisterAutoParentFunction(const QQmlPrivate::AutoParentFunction &function) +{ + QMutexLocker lock(metaTypeDataLock()); + QQmlMetaTypeData *data = metaTypeData(); + data->parentFunctions.removeOne(function); +} + +static int registerAutoParentFunction(const QQmlPrivate::RegisterAutoParent &autoparent) { QMutexLocker lock(metaTypeDataLock()); QQmlMetaTypeData *data = metaTypeData(); @@ -1950,6 +1957,26 @@ int QQmlPrivate::qmlregister(RegistrationType type, void *data) return dtype.index(); } +void QQmlPrivate::qmlunregister(RegistrationType type, quintptr data) +{ + switch (type) { + case AutoParentRegistration: + unregisterAutoParentFunction(reinterpret_cast<AutoParentFunction>(data)); + break; + case QmlUnitCacheHookRegistration: + QQmlMetaType::removeCachedUnitLookupFunction( + reinterpret_cast<QmlUnitCacheLookupFunction>(data)); + break; + case TypeRegistration: + case InterfaceRegistration: + case SingletonRegistration: + case CompositeRegistration: + case CompositeSingletonRegistration: + qmlUnregisterType(data); + break; + } +} + //From qqml.h bool qmlProtectModule(const char *uri, int majVersion) { diff --git a/src/qml/qml/qqmlprivate.h b/src/qml/qml/qqmlprivate.h index ae84803648..8a45de9f76 100644 --- a/src/qml/qml/qqmlprivate.h +++ b/src/qml/qml/qqmlprivate.h @@ -318,6 +318,7 @@ namespace QQmlPrivate }; int Q_QML_EXPORT qmlregister(RegistrationType, void *); + void Q_QML_EXPORT qmlunregister(RegistrationType, quintptr); } QT_END_NAMESPACE diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index c20f778a8f..95f1229b92 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1724,8 +1724,14 @@ void QQuickItemViewPrivate::refill() void QQuickItemViewPrivate::refill(qreal from, qreal to) { Q_Q(QQuickItemView); - if (!isValid() || !q->isComponentComplete()) + if (!model || !model->isValid() || !q->isComponentComplete()) return; + if (!model->count()) { + updateHeader(); + updateFooter(); + updateViewport(); + return; + } do { bufferPause.stop(); @@ -1881,15 +1887,21 @@ void QQuickItemViewPrivate::layout() prepareVisibleItemTransitions(); - for (QList<FxViewItem*>::Iterator it = releasePendingTransition.begin(); - it != releasePendingTransition.end(); ) { - FxViewItem *item = *it; - if (prepareNonVisibleItemTransition(item, viewBounds)) { - ++it; - } else { - releaseItem(item); + for (auto it = releasePendingTransition.begin(); it != releasePendingTransition.end(); ) { + auto old_count = releasePendingTransition.count(); + auto success = prepareNonVisibleItemTransition(*it, viewBounds); + // prepareNonVisibleItemTransition() may invalidate iterators while in fast flicking + // invisible animating items are kicked in or out the viewPort + // use old_count to test if the abrupt erasure occurs + if (old_count > releasePendingTransition.count()) { + continue; + } + if (!success) { + releaseItem(*it); it = releasePendingTransition.erase(it); + continue; } + ++it; } for (int i=0; i<visibleItems.count(); i++) diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index 170027de87..89c0de704b 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -287,7 +287,7 @@ public: : item(i), moveKey(k) {} }; QQuickItemViewTransitioner *transitioner; - QList<FxViewItem *> releasePendingTransition; + QVector<FxViewItem *> releasePendingTransition; mutable qreal minExtent; mutable qreal maxExtent; |