From 45594322fe91eadcd9b2d7b1d76c1a6662bc1472 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 21 Sep 2020 10:40:27 +0200 Subject: Use factory functions and ctors for creating value types As you can extend value types with QML_EXTENDED we may as well allow a factory function in the extended type. Furthermore, if the original type allows construction from QJSValue, we may just use that. In turn, we can get rid of the value type providers now. Change-Id: I9124ea47537eab6c33d7451080ab2fff942eaa7b Reviewed-by: Fabian Kosmale --- src/qml/qml/qqmlglobal.cpp | 67 +++++++--------------------------------------- 1 file changed, 10 insertions(+), 57 deletions(-) (limited to 'src/qml/qml/qqmlglobal.cpp') diff --git a/src/qml/qml/qqmlglobal.cpp b/src/qml/qml/qqmlglobal.cpp index 4d3c81037e..e3a5df382e 100644 --- a/src/qml/qml/qqmlglobal.cpp +++ b/src/qml/qml/qqmlglobal.cpp @@ -48,16 +48,6 @@ QT_BEGIN_NAMESPACE -QQmlValueTypeProvider::QQmlValueTypeProvider() - : next(nullptr) -{ -} - -QQmlValueTypeProvider::~QQmlValueTypeProvider() -{ - QQml_removeValueTypeProvider(this); -} - bool QQmlValueTypeProvider::initValueType(int type, QVariant& dst) { const QMetaType metaType(type); @@ -67,15 +57,16 @@ bool QQmlValueTypeProvider::initValueType(int type, QVariant& dst) return true; } -bool QQmlValueTypeProvider::createValueType(int type, const QJSValue &s, QVariant *data) +bool QQmlValueTypeProvider::createValueType(int type, const QJSValue &s, QVariant &data) { - Q_ASSERT(data); - - QQmlValueTypeProvider *p = this; - do { - if (p->create(type, s, data)) + const QQmlType qmlType = QQmlMetaType::qmlType(type, QQmlMetaType::TypeIdCategory::MetaType); + if (auto valueTypeFunction = qmlType.createValueTypeFunction()) { + QVariant result = valueTypeFunction(s); + if (result.userType() == type) { + data = std::move(result); return true; - } while ((p = p->next)); + } + } return false; } @@ -109,49 +100,11 @@ bool QQmlValueTypeProvider::writeValueType(int type, const void *src, QVariant& return true; } -bool QQmlValueTypeProvider::create(int, const QJSValue &, QVariant *) { return false; } - -struct ValueTypeProviderList { - QQmlValueTypeProvider nullProvider; - QQmlValueTypeProvider *head = &nullProvider; -}; - -Q_GLOBAL_STATIC(ValueTypeProviderList, valueTypeProviders) - -Q_QML_PRIVATE_EXPORT void QQml_addValueTypeProvider(QQmlValueTypeProvider *newProvider) -{ - if (ValueTypeProviderList *providers = valueTypeProviders()) { - newProvider->next = providers->head; - providers->head = newProvider; - } -} - -Q_QML_PRIVATE_EXPORT void QQml_removeValueTypeProvider(QQmlValueTypeProvider *oldProvider) -{ - if (ValueTypeProviderList *providers = valueTypeProviders()) { - QQmlValueTypeProvider *prev = providers->head; - if (prev == oldProvider) { - providers->head = oldProvider->next; - return; - } - - // singly-linked list removal - for (; prev; prev = prev->next) { - if (prev->next != oldProvider) - continue; // this is not the provider you're looking for - prev->next = oldProvider->next; - return; - } - - qWarning("QQml_removeValueTypeProvider: was asked to remove provider %p but it was not found", oldProvider); - } -} +Q_GLOBAL_STATIC(QQmlValueTypeProvider, valueTypeProvider) Q_AUTOTEST_EXPORT QQmlValueTypeProvider *QQml_valueTypeProvider() { - if (ValueTypeProviderList *providers = valueTypeProviders()) - return providers->head; - return nullptr; + return valueTypeProvider(); } QQmlColorProvider::~QQmlColorProvider() {} -- cgit v1.2.3