aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlglobal.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-09-21 10:40:27 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-10-02 13:21:09 +0200
commit45594322fe91eadcd9b2d7b1d76c1a6662bc1472 (patch)
treed14e743f40351ca7a660984616b2500aa83032f5 /src/qml/qml/qqmlglobal.cpp
parentd621027babff9a30d56ab6af871a465108c9eaba (diff)
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 <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlglobal.cpp')
-rw-r--r--src/qml/qml/qqmlglobal.cpp67
1 files changed, 10 insertions, 57 deletions
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() {}