diff options
author | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2018-08-21 00:01:31 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2018-08-21 00:01:31 +0200 |
commit | e33080767e73c1fe9156a5423ff4a7c3e00e8470 (patch) | |
tree | 3bfb5c17674bf475943fb807b9a063728ea65047 /src/qml/qml | |
parent | 36ea464b3dcce6319c5252553d48dd5ac6ba8f41 (diff) | |
parent | e47bd1fc0e6fc2b2e3ca82c48ccb2f8f7dd5ee92 (diff) |
Merge dev into 5.12
Change-Id: Ib4dd56aa31ea0f2026b61dbae061d0b333426d0f
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qqml.h | 32 | ||||
-rw-r--r-- | src/qml/qml/qqmlcomponent_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 8 | ||||
-rw-r--r-- | src/qml/qml/qqmlpropertycache.cpp | 10 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetype.cpp | 60 |
5 files changed, 71 insertions, 41 deletions
diff --git a/src/qml/qml/qqml.h b/src/qml/qml/qqml.h index 2a8e236905..05a9f70247 100644 --- a/src/qml/qml/qqml.h +++ b/src/qml/qml/qqml.h @@ -496,6 +496,38 @@ int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor, return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } +template<typename T, int metaObjectRevision> +int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor, + const char *qmlName, QQmlCustomParser *parser) +{ + QML_GETTYPENAMES + + QQmlPrivate::RegisterType type = { + 1, + + qRegisterNormalizedMetaType<T *>(pointerName.constData()), + qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()), + sizeof(T), QQmlPrivate::createInto<T>, + QString(), + + uri, versionMajor, versionMinor, qmlName, &T::staticMetaObject, + + QQmlPrivate::attachedPropertiesFunc<T>(), + QQmlPrivate::attachedPropertiesMetaObject<T>(), + + QQmlPrivate::StaticCastSelector<T,QQmlParserStatus>::cast(), + QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueSource>::cast(), + QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueInterceptor>::cast(), + + nullptr, nullptr, + + parser, + metaObjectRevision + }; + + return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); +} + template<typename T, typename E> int qmlRegisterCustomExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, QQmlCustomParser *parser) diff --git a/src/qml/qml/qqmlcomponent_p.h b/src/qml/qml/qqmlcomponent_p.h index 9b2db4bccf..4d9e4c6c15 100644 --- a/src/qml/qml/qqmlcomponent_p.h +++ b/src/qml/qml/qqmlcomponent_p.h @@ -88,7 +88,7 @@ public: void initializeObjectWithInitialProperties(QV4::QmlContext *qmlContext, const QV4::Value &valuemap, QObject *toCreate); static void setInitialProperties(QV4::ExecutionEngine *engine, QV4::QmlContext *qmlContext, const QV4::Value &o, const QV4::Value &v); - void incubateObject( + virtual void incubateObject( QQmlIncubator *incubationTask, QQmlComponent *component, QQmlEngine *engine, diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index e487aec4ab..26187ca086 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -220,13 +220,15 @@ void QQmlEnginePrivate::registerBaseTypes(const char *uri, int versionMajor, int qmlRegisterType<QObject>(uri,versionMajor,versionMinor,"QtObject"); qmlRegisterType<QQmlBind>(uri, versionMajor, versionMinor,"Binding"); qmlRegisterType<QQmlBind,8>(uri, versionMajor, (versionMinor < 8 ? 8 : versionMinor), "Binding"); //Only available in >=2.8 - qmlRegisterType<QQmlConnections,1>(uri, versionMajor, (versionMinor < 3 ? 3 : versionMinor), "Connections"); //Only available in >=2.3 - qmlRegisterType<QQmlConnections>(uri, versionMajor, versionMinor,"Connections"); + qmlRegisterCustomType<QQmlConnections>(uri, versionMajor, 0, "Connections", new QQmlConnectionsParser); + if (!strcmp(uri, "QtQuick")) + qmlRegisterCustomType<QQmlConnections,1>(uri, versionMajor, 7, "Connections", new QQmlConnectionsParser); //Only available in QtQuick >=2.7 + else + qmlRegisterCustomType<QQmlConnections,1>(uri, versionMajor, 3, "Connections", new QQmlConnectionsParser); //Only available in QtQml >=2.3 #if QT_CONFIG(qml_animation) qmlRegisterType<QQmlTimer>(uri, versionMajor, versionMinor,"Timer"); #endif qmlRegisterType<QQmlInstantiator>(uri, versionMajor, (versionMinor < 1 ? 1 : versionMinor), "Instantiator"); //Only available in >=2.1 - qmlRegisterCustomType<QQmlConnections>(uri, versionMajor, versionMinor,"Connections", new QQmlConnectionsParser); qmlRegisterType<QQmlInstanceModel>(); qmlRegisterType<QQmlLoggingCategory>(uri, versionMajor, 8, "LoggingCategory"); //Only available in >=2.8 diff --git a/src/qml/qml/qqmlpropertycache.cpp b/src/qml/qml/qqmlpropertycache.cpp index 88eda9c020..0388215630 100644 --- a/src/qml/qml/qqmlpropertycache.cpp +++ b/src/qml/qml/qqmlpropertycache.cpp @@ -1360,19 +1360,21 @@ template <typename StringVisitor> int visitEnumerations(const QMetaObject &mo, StringVisitor visitString) { const QMetaObjectPrivate *const priv = reinterpret_cast<const QMetaObjectPrivate*>(mo.d.data); - const int intsPerEnumerator = 4; + const int intsPerEnumerator = priv->revision >= 8 ? 5 : 4; int fieldCount = priv->enumeratorCount * intsPerEnumerator; for (int i = 0; i < priv->enumeratorCount; ++i) { const uint *enumeratorData = mo.d.data + priv->enumeratorData + i * intsPerEnumerator; - const uint keyCount = enumeratorData[2]; + const uint keyCount = enumeratorData[intsPerEnumerator == 5 ? 3 : 2]; fieldCount += keyCount * 2; visitString(enumeratorData[0]); // name + if (intsPerEnumerator == 5) + visitString(enumeratorData[1]); // enum name - const uint keyOffset = enumeratorData[3]; + const uint keyOffset = enumeratorData[intsPerEnumerator == 5 ? 4 : 3]; for (uint j = 0; j < keyCount; ++j) { visitString(mo.d.data[keyOffset + 2 * j]); @@ -1412,7 +1414,7 @@ bool QQmlPropertyCache::determineMetaObjectSizes(const QMetaObject &mo, int *fie int *stringCount) { const QMetaObjectPrivate *priv = reinterpret_cast<const QMetaObjectPrivate*>(mo.d.data); - if (priv->revision != 7) { + if (priv->revision < 7 || priv->revision > 8) { return false; } diff --git a/src/qml/qml/qqmlvaluetype.cpp b/src/qml/qml/qqmlvaluetype.cpp index 270414a676..2b21591017 100644 --- a/src/qml/qml/qqmlvaluetype.cpp +++ b/src/qml/qml/qqmlvaluetype.cpp @@ -67,8 +67,7 @@ struct QQmlValueTypeFactoryImpl QQmlValueTypeFactoryImpl::QQmlValueTypeFactoryImpl() { - for (unsigned int ii = 0; ii < QVariant::UserType; ++ii) - valueTypes[ii] = nullptr; + std::fill_n(valueTypes, int(QVariant::UserType), nullptr); // See types wrapped in qqmlmodelindexvaluetype_p.h qRegisterMetaType<QItemSelectionRange>(); @@ -521,38 +520,33 @@ void QQmlEasingValueType::setBezierCurve(const QVariantList &customCurveVariant) if (customCurveVariant.isEmpty()) return; - QVariantList variantList = customCurveVariant; - if ((variantList.count() % 6) == 0) { - bool allRealsOk = true; - QVector<qreal> reals; - const int variantListCount = variantList.count(); - reals.reserve(variantListCount); - for (int i = 0; i < variantListCount; i++) { - bool ok; - const qreal real = variantList.at(i).toReal(&ok); - reals.append(real); - if (!ok) - allRealsOk = false; - } - if (allRealsOk) { - QEasingCurve newEasingCurve(QEasingCurve::BezierSpline); - for (int i = 0; i < reals.count() / 6; i++) { - const qreal c1x = reals.at(i * 6); - const qreal c1y = reals.at(i * 6 + 1); - const qreal c2x = reals.at(i * 6 + 2); - const qreal c2y = reals.at(i * 6 + 3); - const qreal c3x = reals.at(i * 6 + 4); - const qreal c3y = reals.at(i * 6 + 5); - - const QPointF c1(c1x, c1y); - const QPointF c2(c2x, c2y); - const QPointF c3(c3x, c3y); - - newEasingCurve.addCubicBezierSegment(c1, c2, c3); - v = newEasingCurve; - } - } + if ((customCurveVariant.count() % 6) != 0) + return; + + auto convert = [](const QVariant &v, qreal &r) { + bool ok; + r = v.toReal(&ok); + return ok; + }; + + QEasingCurve newEasingCurve(QEasingCurve::BezierSpline); + for (int i = 0, ei = customCurveVariant.size(); i < ei; i += 6) { + qreal c1x, c1y, c2x, c2y, c3x, c3y; + if (!convert(customCurveVariant.at(i ), c1x)) return; + if (!convert(customCurveVariant.at(i + 1), c1y)) return; + if (!convert(customCurveVariant.at(i + 2), c2x)) return; + if (!convert(customCurveVariant.at(i + 3), c2y)) return; + if (!convert(customCurveVariant.at(i + 4), c3x)) return; + if (!convert(customCurveVariant.at(i + 5), c3y)) return; + + const QPointF c1(c1x, c1y); + const QPointF c2(c2x, c2y); + const QPointF c3(c3x, c3y); + + newEasingCurve.addCubicBezierSegment(c1, c2, c3); } + + v = newEasingCurve; } QVariantList QQmlEasingValueType::bezierCurve() const |