diff options
-rw-r--r-- | src/qml/qml/qqml.h | 129 | ||||
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 10 | ||||
-rw-r--r-- | src/qml/qml/qqmlglobal.cpp | 13 | ||||
-rw-r--r-- | src/qml/qml/qqmlglobal_p.h | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmllocale.cpp | 8 | ||||
-rw-r--r-- | src/qml/qml/qqmllocale_p.h | 32 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 16 | ||||
-rw-r--r-- | src/qml/qml/qqmlprivate.h | 69 | ||||
-rw-r--r-- | src/qml/qml/qqmltype.cpp | 7 | ||||
-rw-r--r-- | src/qml/qml/qqmltype_p.h | 1 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetype.cpp | 28 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetype_p.h | 81 | ||||
-rw-r--r-- | src/quick/util/qquickglobal.cpp | 26 | ||||
-rw-r--r-- | src/quick/util/qquickvaluetypes.cpp | 32 | ||||
-rw-r--r-- | src/quick/util/qquickvaluetypes_p.h | 168 | ||||
-rw-r--r-- | tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | 78 | ||||
-rw-r--r-- | tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp | 33 | ||||
-rw-r--r-- | tests/auto/quick/qquicktext/tst_qquicktext.cpp | 14 |
18 files changed, 425 insertions, 324 deletions
diff --git a/src/qml/qml/qqml.h b/src/qml/qml/qqml.h index 4c3454e7b4..f399924447 100644 --- a/src/qml/qml/qqml.h +++ b/src/qml/qml/qqml.h @@ -166,13 +166,14 @@ int qmlRegisterAnonymousType(const char *uri, int versionMajor) { QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), 0, nullptr, nullptr, QString(), - uri, QTypeRevision::fromVersion(versionMajor, 0), nullptr, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, 0), nullptr, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc<T>(), QQmlPrivate::attachedPropertiesMetaObject<T>(), @@ -198,14 +199,15 @@ int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMin { QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T>>(), + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), 0, nullptr, nullptr, reason, - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc<T>(), QQmlPrivate::attachedPropertiesMetaObject<T>(), @@ -228,14 +230,15 @@ int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMin { QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), 0, nullptr, nullptr, reason, - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc<T>(), QQmlPrivate::attachedPropertiesMetaObject<T>(), @@ -265,14 +268,15 @@ int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int ve QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), 0, nullptr, nullptr, reason, - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), attached, attachedMetaObject, @@ -281,7 +285,7 @@ int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int ve QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueSource>::cast(), QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueInterceptor>::cast(), - QQmlPrivate::createParent<E>, &E::staticMetaObject, + QQmlPrivate::ExtendedType<E>::createParent, QQmlPrivate::ExtendedType<E>::staticMetaObject(), nullptr, QTypeRevision::zero() @@ -302,14 +306,15 @@ int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int ve QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), 0, nullptr, nullptr, reason, - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), attached, attachedMetaObject, @@ -318,7 +323,7 @@ int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int ve QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueSource>::cast(), QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueInterceptor>::cast(), - QQmlPrivate::createParent<E>, &E::staticMetaObject, + QQmlPrivate::ExtendedType<E>::createParent, QQmlPrivate::ExtendedType<E>::staticMetaObject(), nullptr, QTypeRevision::fromMinorVersion(metaObjectRevision) @@ -334,12 +339,13 @@ int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const c { QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), - sizeof(T), QQmlPrivate::createInto<T>, nullptr, + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), + sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc<T>(), QQmlPrivate::attachedPropertiesMetaObject<T>(), @@ -362,12 +368,13 @@ int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const c { QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), - sizeof(T), QQmlPrivate::createInto<T>, nullptr, + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), + sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc<T>(), QQmlPrivate::attachedPropertiesMetaObject<T>(), @@ -390,12 +397,13 @@ int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor) { QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), - sizeof(T), QQmlPrivate::createInto<T>, nullptr, + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), + sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), nullptr, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, versionMinor), nullptr, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc<T>(), QQmlPrivate::attachedPropertiesMetaObject<T>(), @@ -418,14 +426,15 @@ int qmlRegisterExtendedType(const char *uri, int versionMajor) { QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), 0, nullptr, nullptr, QString(), - uri, QTypeRevision::fromVersion(versionMajor, 0), nullptr, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, 0), nullptr, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc<T>(), QQmlPrivate::attachedPropertiesMetaObject<T>(), @@ -434,7 +443,7 @@ int qmlRegisterExtendedType(const char *uri, int versionMajor) QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueSource>::cast(), QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueInterceptor>::cast(), - QQmlPrivate::createParent<E>, &E::staticMetaObject, + QQmlPrivate::ExtendedType<E>::createParent, QQmlPrivate::ExtendedType<E>::staticMetaObject(), nullptr, QTypeRevision::zero() @@ -456,12 +465,13 @@ int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), - sizeof(T), QQmlPrivate::createInto<T>, nullptr, + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), + sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), attached, attachedMetaObject, @@ -470,7 +480,7 @@ int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueSource>::cast(), QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueInterceptor>::cast(), - QQmlPrivate::createParent<E>, &E::staticMetaObject, + QQmlPrivate::ExtendedType<E>::createParent, QQmlPrivate::ExtendedType<E>::staticMetaObject(), nullptr, QTypeRevision::zero() @@ -484,6 +494,8 @@ int qmlRegisterInterface(const char *uri, int versionMajor) { QQmlPrivate::RegisterInterface qmlInterface = { 0, + // An interface is not a QObject itself but is typically casted to one. + // Therefore, we still want the pointer. QMetaType::fromType<T *>(), QMetaType::fromType<QQmlListProperty<T> >(), qobject_interface_iid<T *>(), @@ -501,12 +513,13 @@ int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor, { QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), - sizeof(T), QQmlPrivate::createInto<T>, nullptr, + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), + sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc<T>(), QQmlPrivate::attachedPropertiesMetaObject<T>(), @@ -530,12 +543,13 @@ int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor, { QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), - sizeof(T), QQmlPrivate::createInto<T>, nullptr, + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), + sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc<T>(), QQmlPrivate::attachedPropertiesMetaObject<T>(), @@ -566,12 +580,13 @@ int qmlRegisterCustomExtendedType(const char *uri, int versionMajor, int version QQmlPrivate::RegisterType type = { 0, - QMetaType::fromType<T *>(), - QMetaType::fromType<QQmlListProperty<T> >(), - sizeof(T), QQmlPrivate::createInto<T>, nullptr, + QQmlPrivate::QmlMetaType<T>::self(), + QQmlPrivate::QmlMetaType<T>::list(), + sizeof(T), QQmlPrivate::Constructors<T>::createInto, nullptr, QString(), - uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, &T::staticMetaObject, + uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), attached, attachedMetaObject, @@ -580,7 +595,7 @@ int qmlRegisterCustomExtendedType(const char *uri, int versionMajor, int version QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueSource>::cast(), QQmlPrivate::StaticCastSelector<T,QQmlPropertyValueInterceptor>::cast(), - QQmlPrivate::createParent<E>, &E::staticMetaObject, + QQmlPrivate::ExtendedType<E>::createParent, QQmlPrivate::ExtendedType<E>::staticMetaObject(), parser, QTypeRevision::zero() @@ -659,8 +674,8 @@ inline int qmlRegisterSingletonType( typeName, nullptr, callback, - &T::staticMetaObject, - QMetaType::fromType<T *>(), + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), + QQmlPrivate::QmlMetaType<T>::self(), QTypeRevision::zero() }; @@ -684,8 +699,8 @@ inline int qmlRegisterSingletonType(const char *uri, int versionMajor, int versi typeName, nullptr, callback, - &T::staticMetaObject, - QMetaType::fromType<T *>(), + QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), + QQmlPrivate::QmlMetaType<T>::self(), QTypeRevision::zero() }; @@ -751,7 +766,7 @@ struct QmlTypeAndRevisionsRegistration<T, Resolved, Extended, false, false> { static void registerTypeAndRevisions(const char *uri, int versionMajor, QList<int> *qmlTypeIds) { QQmlPrivate::qmlRegisterTypeAndRevisions<Resolved, Extended>( - uri, versionMajor, &T::staticMetaObject, qmlTypeIds); + uri, versionMajor, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), qmlTypeIds); } }; @@ -760,7 +775,7 @@ struct QmlTypeAndRevisionsRegistration<T, Resolved, void, true, false> { static void registerTypeAndRevisions(const char *uri, int versionMajor, QList<int> *qmlTypeIds) { QQmlPrivate::qmlRegisterSingletonAndRevisions<Resolved>( - uri, versionMajor, &T::staticMetaObject, qmlTypeIds); + uri, versionMajor, QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), qmlTypeIds); } }; diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index 5965431512..bff726cb98 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -2300,9 +2300,13 @@ QQmlPropertyCache *QQmlEnginePrivate::rawPropertyCacheForType(int t, QTypeRevisi if (!type.isValid()) return nullptr; - return type.containsRevisionedAttributes() - ? QQmlMetaType::propertyCache(type, version) - : cache(type.metaObject(), version); + if (type.containsRevisionedAttributes()) + return QQmlMetaType::propertyCache(type, version); + + if (const QMetaObject *metaObject = type.metaObject()) + return cache(metaObject, version); + + return nullptr; } QQmlPropertyCache *QQmlEnginePrivate::findPropertyCacheInCompositeTypes(int t) const diff --git a/src/qml/qml/qqmlglobal.cpp b/src/qml/qml/qqmlglobal.cpp index cd08a5270c..0cc7c525c7 100644 --- a/src/qml/qml/qqmlglobal.cpp +++ b/src/qml/qml/qqmlglobal.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include <private/qqmlglobal_p.h> +#include <QtQml/private/qqmlmetatype_p.h> #include <QtQml/qqmlengine.h> #include <QtCore/qvariant.h> @@ -57,17 +58,6 @@ QQmlValueTypeProvider::~QQmlValueTypeProvider() QQml_removeValueTypeProvider(this); } -const QMetaObject *QQmlValueTypeProvider::metaObjectForMetaType(int type) -{ - QQmlValueTypeProvider *p = this; - do { - if (const QMetaObject *mo = p->getMetaObjectForMetaType(type)) - return mo; - } while ((p = p->next)); - - return nullptr; -} - bool QQmlValueTypeProvider::initValueType(int type, QVariant& dst) { const QMetaType metaType(type); @@ -179,7 +169,6 @@ bool QQmlValueTypeProvider::writeValueType(int type, const void *src, QVariant& return true; } -const QMetaObject *QQmlValueTypeProvider::getMetaObjectForMetaType(int) { return nullptr; } bool QQmlValueTypeProvider::create(int, int, const void *[], QVariant *) { return false; } bool QQmlValueTypeProvider::createFromString(int, const QString &, void *, size_t) { return false; } bool QQmlValueTypeProvider::variantFromString(int, const QString &, QVariant *) { return false; } diff --git a/src/qml/qml/qqmlglobal_p.h b/src/qml/qml/qqmlglobal_p.h index 3c03753d08..5fbf3d0e38 100644 --- a/src/qml/qml/qqmlglobal_p.h +++ b/src/qml/qml/qqmlglobal_p.h @@ -222,8 +222,6 @@ public: QQmlValueTypeProvider(); virtual ~QQmlValueTypeProvider(); - const QMetaObject *metaObjectForMetaType(int); - bool initValueType(int, QVariant&); QVariant createValueType(int, int, const void *[]); @@ -238,8 +236,6 @@ public: bool writeValueType(int, const void *, QVariant&); private: - virtual const QMetaObject *getMetaObjectForMetaType(int); - virtual bool create(int, int, const void *[], QVariant *); virtual bool createFromString(int, const QString &, void *, size_t); diff --git a/src/qml/qml/qqmllocale.cpp b/src/qml/qml/qqmllocale.cpp index bc227ad713..5109574654 100644 --- a/src/qml/qml/qqmllocale.cpp +++ b/src/qml/qml/qqmllocale.cpp @@ -823,14 +823,6 @@ V4_DEFINE_EXTENSION(QV4LocaleDataDeletable, localeV4Data); \sa Date, Number */ -QQmlLocale::QQmlLocale() -{ -} - -QQmlLocale::~QQmlLocale() -{ -} - QV4::ReturnedValue QQmlLocale::locale(ExecutionEngine *engine, const QString &localeName) { QLocale qlocale; diff --git a/src/qml/qml/qqmllocale_p.h b/src/qml/qml/qqmllocale_p.h index d7bff5a1b7..a1acb2bad8 100644 --- a/src/qml/qml/qqmllocale_p.h +++ b/src/qml/qml/qqmllocale_p.h @@ -91,35 +91,32 @@ private: }; -class Q_QML_PRIVATE_EXPORT QQmlLocale +namespace QQmlLocale { - Q_GADGET + Q_NAMESPACE QML_NAMED_ELEMENT(Locale) - QML_UNCREATABLE("Locale cannot be instantiated. Use Qt.locale().") QML_ADDED_IN_VERSION(2, 2) -public: - ~QQmlLocale(); - enum MeasurementSystem { MetricSystem = QLocale::MetricSystem, ImperialSystem = QLocale::ImperialSystem, ImperialUSSystem = QLocale::ImperialUSSystem, ImperialUKSystem = QLocale::ImperialUKSystem }; - Q_ENUM(MeasurementSystem) + Q_ENUM_NS(MeasurementSystem) + enum FormatType { LongFormat = QLocale::LongFormat, ShortFormat = QLocale::ShortFormat, NarrowFormat = QLocale::NarrowFormat }; - Q_ENUM(FormatType) + Q_ENUM_NS(FormatType) enum CurrencySymbolFormat { CurrencyIsoCode = QLocale::CurrencyIsoCode, CurrencySymbol = QLocale::CurrencySymbol, CurrencyDisplayName = QLocale::CurrencyDisplayName }; - Q_ENUM(CurrencySymbolFormat) + Q_ENUM_NS(CurrencySymbolFormat) // Qt defines Sunday as 7, but JS Date assigns Sunday 0 enum DayOfWeek { Sunday = 0, @@ -130,7 +127,7 @@ public: Friday = Qt::Friday, Saturday = Qt::Saturday }; - Q_ENUM(DayOfWeek) + Q_ENUM_NS(DayOfWeek) enum NumberOptions { DefaultNumberOptions = QLocale::DefaultNumberOptions, OmitGroupSeparator = QLocale::OmitGroupSeparator, @@ -140,17 +137,12 @@ public: IncludeTrailingZeroesAfterDot = QLocale::IncludeTrailingZeroesAfterDot, RejectTrailingZeroesAfterDot = QLocale::RejectTrailingZeroesAfterDot }; - Q_ENUM(NumberOptions) - - static QV4::ReturnedValue locale(QV4::ExecutionEngine *engine, const QString &localeName); - static QV4::ReturnedValue wrap(QV4::ExecutionEngine *engine, const QLocale &locale); - - static void registerStringLocaleCompare(QV4::ExecutionEngine *engine); - -private: - QQmlLocale(); + Q_ENUM_NS(NumberOptions) - static QV4::ReturnedValue method_localeCompare(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc); + QV4::ReturnedValue locale(QV4::ExecutionEngine *engine, const QString &localeName); + QV4::ReturnedValue wrap(QV4::ExecutionEngine *engine, const QLocale &locale); + void registerStringLocaleCompare(QV4::ExecutionEngine *engine); + QV4::ReturnedValue method_localeCompare(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc); }; namespace QV4 { diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index dea976c4ee..e3083ae278 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -400,13 +400,22 @@ bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *da QMetaType::TypeFlags flags) { if (!typeName.isEmpty()) { - if (typeName.at(0).isLower() - && !(flags & (QMetaType::PointerToGadget | QMetaType::IsGadget))) { + if (typeName.at(0).isLower() && (flags & QMetaType::PointerToQObject)) { QString failure(QCoreApplication::translate("qmlRegisterType", "Invalid QML %1 name \"%2\"; type names must begin with an uppercase letter")); data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType)).arg(typeName)); return false; } + if (typeName.at(0).isUpper() + && (flags & (QMetaType::IsGadget | QMetaType::PointerToGadget))) { + QString failure(QCoreApplication::translate("qmlRegisterType", "Invalid QML %1 name \"%2\"; value type names must begin with a lowercase letter")); + data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType)).arg(typeName)); + return false; + } + + // There can also be types that aren't even gadgets, and there can be types for namespaces. + // We cannot check those, but namespaces should be uppercase. + int typeNameLen = typeName.length(); for (int ii = 0; ii < typeNameLen; ++ii) { if (!(typeName.at(ii).isLetterOrNumber() || typeName.at(ii) == u'_')) { @@ -455,7 +464,8 @@ void addTypeToData(QQmlTypePrivate *type, QQmlMetaTypeData *data) if (type->typeId.isValid()) { data->idToType.insert(type->typeId.id(), type); - data->objects.insert(type->typeId.id()); + if (type->typeId.flags() & QMetaType::PointerToQObject) + data->objects.insert(type->typeId.id()); } if (type->listId.isValid()) { diff --git a/src/qml/qml/qqmlprivate.h b/src/qml/qml/qqmlprivate.h index e0de749fb3..91b8eb5283 100644 --- a/src/qml/qml/qqmlprivate.h +++ b/src/qml/qml/qqmlprivate.h @@ -182,23 +182,32 @@ namespace QQmlPrivate static constexpr CreateSingletonFunction createSingletonInstance = nullptr; }; - template<typename T, bool IsVoid = std::is_void<T>::value> + template<typename T, + bool IsObject = std::is_base_of<QObject, T>::value, + bool IsGadget = QtPrivate::IsGadgetHelper<T>::IsRealGadget> struct ExtendedType; - // void means "not an extended type" template<typename T> - struct ExtendedType<T, true> + struct ExtendedType<T, false, false> { static constexpr const CreateParentFunction createParent = nullptr; - static constexpr const QMetaObject *staticMetaObject = nullptr; + static const QMetaObject *staticMetaObject() { return nullptr; } }; - // If it's not void, we actually want an error if the ctor or the metaobject is missing. + // If it's a QObject, we actually want an error if the ctor or the metaobject is missing. template<typename T> - struct ExtendedType<T, false> + struct ExtendedType<T, true, false> { static constexpr const CreateParentFunction createParent = QQmlPrivate::createParent<T>; - static constexpr const QMetaObject *staticMetaObject = &T::staticMetaObject; + static const QMetaObject *staticMetaObject() { return &T::staticMetaObject; } + }; + + // If it's a Q_GADGET, we don't want the ctor. + template<typename T> + struct ExtendedType<T, false, true> + { + static constexpr const CreateParentFunction createParent = nullptr; + static const QMetaObject *staticMetaObject() { return &T::staticMetaObject; } }; template<class From, class To, int N> @@ -561,7 +570,7 @@ namespace QQmlPrivate }; template<class T> - struct QmlResolved<T, std::void_t<decltype(T::QmlForeignType::staticMetaObject)>> + struct QmlResolved<T, std::void_t<typename T::QmlForeignType>> { using Type = typename T::QmlForeignType; }; @@ -590,6 +599,38 @@ namespace QQmlPrivate static constexpr bool Value = bool(T::QmlIsInterface::yes); }; + template<class T, typename = std::void_t<>> + struct StaticMetaObject + { + static const QMetaObject *staticMetaObject() { return nullptr; } + }; + + template<class T> + struct StaticMetaObject<T, std::void_t<decltype(T::staticMetaObject)>> + { + static const QMetaObject *staticMetaObject() { return &T::staticMetaObject; } + }; + + template<class T> + struct QmlMetaType + { + static QMetaType self() + { + if constexpr (std::is_base_of_v<QObject, T>) + return QMetaType::fromType<T*>(); + else + return QMetaType::fromType<T>(); + } + + static QMetaType list() + { + if constexpr (std::is_base_of_v<QObject, T>) + return QMetaType::fromType<QQmlListProperty<T>>(); + else + return QMetaType(); + } + }; + template<typename T> void qmlRegisterSingletonAndRevisions(const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject, @@ -603,10 +644,10 @@ namespace QQmlPrivate Constructors<T>::createSingletonInstance, - &T::staticMetaObject, + StaticMetaObject<T>::staticMetaObject(), classInfoMetaObject, - QMetaType::fromType<T *>(), + QmlMetaType<T>::self(), qmlTypeIds }; @@ -620,15 +661,15 @@ namespace QQmlPrivate { RegisterTypeAndRevisions type = { 0, - QMetaType::fromType<T*>(), - QMetaType::fromType<QQmlListProperty<T>>(), + QmlMetaType<T>::self(), + QmlMetaType<T>::list(), int(sizeof(T)), Constructors<T>::createInto, nullptr, uri, QTypeRevision::fromMajorVersion(versionMajor), - &T::staticMetaObject, + StaticMetaObject<T>::staticMetaObject(), classInfoMetaObject, attachedPropertiesFunc<T>(), @@ -639,7 +680,7 @@ namespace QQmlPrivate StaticCastSelector<T, QQmlPropertyValueInterceptor>::cast(), ExtendedType<E>::createParent, - ExtendedType<E>::staticMetaObject, + ExtendedType<E>::staticMetaObject(), &qmlCreateCustomParser<T>, qmlTypeIds diff --git a/src/qml/qml/qqmltype.cpp b/src/qml/qml/qqmltype.cpp index 48fb2e2342..5a685ea646 100644 --- a/src/qml/qml/qqmltype.cpp +++ b/src/qml/qml/qqmltype.cpp @@ -536,6 +536,13 @@ QQmlType::ExtensionFunc QQmlType::extensionFunction() const return d->extraData.cd->extFunc; } +const QMetaObject *QQmlType::extensionMetaObject() const +{ + if (!d || d->regType != CppType) + return nullptr; + return d->extraData.cd->extMetaObject; +} + bool QQmlType::isExtendedType() const { if (!d) diff --git a/src/qml/qml/qqmltype_p.h b/src/qml/qml/qqmltype_p.h index 25e905309f..c1964cf597 100644 --- a/src/qml/qml/qqmltype_p.h +++ b/src/qml/qml/qqmltype_p.h @@ -115,6 +115,7 @@ public: bool isCreatable() const; typedef QObject *(*ExtensionFunc)(QObject *); ExtensionFunc extensionFunction() const; + const QMetaObject *extensionMetaObject() const; bool isExtendedType() const; QString noCreationReason() const; diff --git a/src/qml/qml/qqmlvaluetype.cpp b/src/qml/qml/qqmlvaluetype.cpp index d385013ff4..e996717051 100644 --- a/src/qml/qml/qqmlvaluetype.cpp +++ b/src/qml/qml/qqmlvaluetype.cpp @@ -149,14 +149,30 @@ const QMetaObject *QQmlValueTypeFactoryImpl::metaObjectForMetaType(int t) #endif if (t == qMetaTypeId<QQmlProperty>()) return &QQmlPropertyValueType::staticMetaObject; - if (const QMetaObject *mo = QQml_valueTypeProvider()->metaObjectForMetaType(t)) - return mo; break; } - QMetaType metaType(t); + const QMetaType metaType(t); + + // It doesn't have to be a gadget for a QML type to exist, but we don't want to + // call QObject pointers value types. Explicitly registered types also override + // the implicit use of gadgets. + if (!(metaType.flags() & QMetaType::PointerToQObject)) { + const QQmlType qmlType = QQmlMetaType::qmlType(t, QQmlMetaType::TypeIdCategory::MetaType); + + // Prefer the extension meta object. + // Extensions allow registration of non-gadget value types. + if (const QMetaObject *extensionMetaObject = qmlType.extensionMetaObject()) + return extensionMetaObject; + + if (const QMetaObject *qmlTypeMetaObject = qmlType.metaObject()) + return qmlTypeMetaObject; + } + + // If it _is_ a gadget, we can just use it. if (metaType.flags() & QMetaType::IsGadget) return metaType.metaObject(); + return nullptr; } @@ -525,9 +541,9 @@ int QQmlRectValueType::bottom() const } #if QT_CONFIG(easingcurve) -QQmlEasingValueType::Type QQmlEasingValueType::type() const +QQmlEasingEnums::Type QQmlEasingValueType::type() const { - return (QQmlEasingValueType::Type)v.type(); + return (QQmlEasingEnums::Type)v.type(); } qreal QQmlEasingValueType::amplitude() const @@ -545,7 +561,7 @@ qreal QQmlEasingValueType::period() const return v.period(); } -void QQmlEasingValueType::setType(QQmlEasingValueType::Type type) +void QQmlEasingValueType::setType(QQmlEasingEnums::Type type) { v.setType((QEasingCurve::Type)type); } diff --git a/src/qml/qml/qqmlvaluetype_p.h b/src/qml/qml/qqmlvaluetype_p.h index 73e6d37908..db2c1d5cbc 100644 --- a/src/qml/qml/qqmlvaluetype_p.h +++ b/src/qml/qml/qqmlvaluetype_p.h @@ -134,6 +134,7 @@ struct QQmlPointFValueType QML_VALUE_TYPE(point) QML_FOREIGN(QPointF) QML_ADDED_IN_VERSION(2, 0) + QML_EXTENDED(QQmlPointFValueType) public: Q_INVOKABLE QString toString() const; @@ -169,6 +170,7 @@ struct QQmlSizeFValueType QML_VALUE_TYPE(size) QML_FOREIGN(QSizeF) QML_ADDED_IN_VERSION(2, 0) + QML_EXTENDED(QQmlSizeFValueType) public: Q_INVOKABLE QString toString() const; @@ -210,6 +212,7 @@ struct QQmlRectFValueType QML_VALUE_TYPE(rect) QML_FOREIGN(QRectF) QML_ADDED_IN_VERSION(2, 0) + QML_EXTENDED(QQmlRectFValueType) public: Q_INVOKABLE QString toString() const; @@ -263,46 +266,44 @@ public: }; #if QT_CONFIG(easingcurve) -struct QQmlEasingEnums +namespace QQmlEasingEnums { - Q_GADGET - QML_NAMED_ELEMENT(Easing) - QML_ADDED_IN_VERSION(2, 0) - QML_UNCREATABLE("Use the Type enum.") - -public: - enum Type { - Linear = QEasingCurve::Linear, - InQuad = QEasingCurve::InQuad, OutQuad = QEasingCurve::OutQuad, - InOutQuad = QEasingCurve::InOutQuad, OutInQuad = QEasingCurve::OutInQuad, - InCubic = QEasingCurve::InCubic, OutCubic = QEasingCurve::OutCubic, - InOutCubic = QEasingCurve::InOutCubic, OutInCubic = QEasingCurve::OutInCubic, - InQuart = QEasingCurve::InQuart, OutQuart = QEasingCurve::OutQuart, - InOutQuart = QEasingCurve::InOutQuart, OutInQuart = QEasingCurve::OutInQuart, - InQuint = QEasingCurve::InQuint, OutQuint = QEasingCurve::OutQuint, - InOutQuint = QEasingCurve::InOutQuint, OutInQuint = QEasingCurve::OutInQuint, - InSine = QEasingCurve::InSine, OutSine = QEasingCurve::OutSine, - InOutSine = QEasingCurve::InOutSine, OutInSine = QEasingCurve::OutInSine, - InExpo = QEasingCurve::InExpo, OutExpo = QEasingCurve::OutExpo, - InOutExpo = QEasingCurve::InOutExpo, OutInExpo = QEasingCurve::OutInExpo, - InCirc = QEasingCurve::InCirc, OutCirc = QEasingCurve::OutCirc, - InOutCirc = QEasingCurve::InOutCirc, OutInCirc = QEasingCurve::OutInCirc, - InElastic = QEasingCurve::InElastic, OutElastic = QEasingCurve::OutElastic, - InOutElastic = QEasingCurve::InOutElastic, OutInElastic = QEasingCurve::OutInElastic, - InBack = QEasingCurve::InBack, OutBack = QEasingCurve::OutBack, - InOutBack = QEasingCurve::InOutBack, OutInBack = QEasingCurve::OutInBack, - InBounce = QEasingCurve::InBounce, OutBounce = QEasingCurve::OutBounce, - InOutBounce = QEasingCurve::InOutBounce, OutInBounce = QEasingCurve::OutInBounce, - InCurve = QEasingCurve::InCurve, OutCurve = QEasingCurve::OutCurve, - SineCurve = QEasingCurve::SineCurve, CosineCurve = QEasingCurve::CosineCurve, - BezierSpline = QEasingCurve::BezierSpline, - - Bezier = BezierSpline // Evil! Don't use this! - }; - Q_ENUM(Type) +Q_NAMESPACE +QML_NAMED_ELEMENT(Easing) +QML_ADDED_IN_VERSION(2, 0) + +enum Type { + Linear = QEasingCurve::Linear, + InQuad = QEasingCurve::InQuad, OutQuad = QEasingCurve::OutQuad, + InOutQuad = QEasingCurve::InOutQuad, OutInQuad = QEasingCurve::OutInQuad, + InCubic = QEasingCurve::InCubic, OutCubic = QEasingCurve::OutCubic, + InOutCubic = QEasingCurve::InOutCubic, OutInCubic = QEasingCurve::OutInCubic, + InQuart = QEasingCurve::InQuart, OutQuart = QEasingCurve::OutQuart, + InOutQuart = QEasingCurve::InOutQuart, OutInQuart = QEasingCurve::OutInQuart, + InQuint = QEasingCurve::InQuint, OutQuint = QEasingCurve::OutQuint, + InOutQuint = QEasingCurve::InOutQuint, OutInQuint = QEasingCurve::OutInQuint, + InSine = QEasingCurve::InSine, OutSine = QEasingCurve::OutSine, + InOutSine = QEasingCurve::InOutSine, OutInSine = QEasingCurve::OutInSine, + InExpo = QEasingCurve::InExpo, OutExpo = QEasingCurve::OutExpo, + InOutExpo = QEasingCurve::InOutExpo, OutInExpo = QEasingCurve::OutInExpo, + InCirc = QEasingCurve::InCirc, OutCirc = QEasingCurve::OutCirc, + InOutCirc = QEasingCurve::InOutCirc, OutInCirc = QEasingCurve::OutInCirc, + InElastic = QEasingCurve::InElastic, OutElastic = QEasingCurve::OutElastic, + InOutElastic = QEasingCurve::InOutElastic, OutInElastic = QEasingCurve::OutInElastic, + InBack = QEasingCurve::InBack, OutBack = QEasingCurve::OutBack, + InOutBack = QEasingCurve::InOutBack, OutInBack = QEasingCurve::OutInBack, + InBounce = QEasingCurve::InBounce, OutBounce = QEasingCurve::OutBounce, + InOutBounce = QEasingCurve::InOutBounce, OutInBounce = QEasingCurve::OutInBounce, + InCurve = QEasingCurve::InCurve, OutCurve = QEasingCurve::OutCurve, + SineCurve = QEasingCurve::SineCurve, CosineCurve = QEasingCurve::CosineCurve, + BezierSpline = QEasingCurve::BezierSpline, + + Bezier = BezierSpline // Evil! Don't use this! +}; +Q_ENUM_NS(Type) }; -struct QQmlEasingValueType : public QQmlEasingEnums +struct QQmlEasingValueType { QEasingCurve v; Q_GADGET @@ -310,18 +311,18 @@ struct QQmlEasingValueType : public QQmlEasingEnums QML_FOREIGN(QEasingCurve) QML_ADDED_IN_VERSION(2, 0) - Q_PROPERTY(Type type READ type WRITE setType FINAL) + Q_PROPERTY(QQmlEasingEnums::Type type READ type WRITE setType FINAL) Q_PROPERTY(qreal amplitude READ amplitude WRITE setAmplitude FINAL) Q_PROPERTY(qreal overshoot READ overshoot WRITE setOvershoot FINAL) Q_PROPERTY(qreal period READ period WRITE setPeriod FINAL) Q_PROPERTY(QVariantList bezierCurve READ bezierCurve WRITE setBezierCurve FINAL) public: - Type type() const; + QQmlEasingEnums::Type type() const; qreal amplitude() const; qreal overshoot() const; qreal period() const; - void setType(Type); + void setType(QQmlEasingEnums::Type); void setAmplitude(qreal); void setOvershoot(qreal); void setPeriod(qreal); diff --git a/src/quick/util/qquickglobal.cpp b/src/quick/util/qquickglobal.cpp index bf636407ed..9fe4c6c119 100644 --- a/src/quick/util/qquickglobal.cpp +++ b/src/quick/util/qquickglobal.cpp @@ -581,32 +581,6 @@ public: return QMatrix4x4(matVals); } - const QMetaObject *getMetaObjectForMetaType(int type) override - { - switch (type) { - case QMetaType::QColor: - return &QQuickColorValueType::staticMetaObject; - case QMetaType::QColorSpace: - return &QQuickColorSpaceValueType::staticMetaObject; - case QMetaType::QFont: - return &QQuickFontValueType::staticMetaObject; - case QMetaType::QVector2D: - return &QQuickVector2DValueType::staticMetaObject; - case QMetaType::QVector3D: - return &QQuickVector3DValueType::staticMetaObject; - case QMetaType::QVector4D: - return &QQuickVector4DValueType::staticMetaObject; - case QMetaType::QQuaternion: - return &QQuickQuaternionValueType::staticMetaObject; - case QMetaType::QMatrix4x4: - return &QQuickMatrix4x4ValueType::staticMetaObject; - default: - break; - } - - return nullptr; - } - bool create(int type, int argc, const void *argv[], QVariant *v) override { switch (type) { diff --git a/src/quick/util/qquickvaluetypes.cpp b/src/quick/util/qquickvaluetypes.cpp index 4f93302cc5..5bbfdbcbea 100644 --- a/src/quick/util/qquickvaluetypes.cpp +++ b/src/quick/util/qquickvaluetypes.cpp @@ -734,12 +734,12 @@ void QQuickFontValueType::setPixelSize(int size) } } -QQuickFontValueType::Capitalization QQuickFontValueType::capitalization() const +QQuickFontEnums::Capitalization QQuickFontValueType::capitalization() const { - return (QQuickFontValueType::Capitalization)v.capitalization(); + return (QQuickFontEnums::Capitalization)v.capitalization(); } -void QQuickFontValueType::setCapitalization(QQuickFontValueType::Capitalization c) +void QQuickFontValueType::setCapitalization(QQuickFontEnums::Capitalization c) { v.setCapitalization((QFont::Capitalization)c); } @@ -764,12 +764,12 @@ void QQuickFontValueType::setWordSpacing(qreal size) v.setWordSpacing(size); } -QQuickFontValueType::HintingPreference QQuickFontValueType::hintingPreference() const +QQuickFontEnums::HintingPreference QQuickFontValueType::hintingPreference() const { - return QQuickFontValueType::HintingPreference(v.hintingPreference()); + return QQuickFontEnums::HintingPreference(v.hintingPreference()); } -void QQuickFontValueType::setHintingPreference(QQuickFontValueType::HintingPreference hintingPreference) +void QQuickFontValueType::setHintingPreference(QQuickFontEnums::HintingPreference hintingPreference) { v.setHintingPreference(QFont::HintingPreference(hintingPreference)); } @@ -797,33 +797,33 @@ void QQuickFontValueType::setPreferShaping(bool enable) v.setStyleStrategy(static_cast<QFont::StyleStrategy>(v.styleStrategy() | QFont::PreferNoShaping)); } -QQuickColorSpaceValueType::NamedColorSpace QQuickColorSpaceValueType::namedColorSpace() const noexcept +QQuickColorSpaceEnums::NamedColorSpace QQuickColorSpaceValueType::namedColorSpace() const noexcept { if (const auto *p = QColorSpacePrivate::get(v)) - return (QQuickColorSpaceValueType::NamedColorSpace)p->namedColorSpace; - return QQuickColorSpaceValueType::Unknown; + return (QQuickColorSpaceEnums::NamedColorSpace)p->namedColorSpace; + return QQuickColorSpaceEnums::Unknown; } -void QQuickColorSpaceValueType::setNamedColorSpace(QQuickColorSpaceValueType::NamedColorSpace namedColorSpace) +void QQuickColorSpaceValueType::setNamedColorSpace(QQuickColorSpaceEnums::NamedColorSpace namedColorSpace) { v = { (QColorSpace::NamedColorSpace)namedColorSpace }; } -QQuickColorSpaceValueType::Primaries QQuickColorSpaceValueType::primaries() const noexcept +QQuickColorSpaceEnums::Primaries QQuickColorSpaceValueType::primaries() const noexcept { - return (QQuickColorSpaceValueType::Primaries)v.primaries(); + return (QQuickColorSpaceEnums::Primaries)v.primaries(); } -void QQuickColorSpaceValueType::setPrimaries(QQuickColorSpaceValueType::Primaries primariesId) +void QQuickColorSpaceValueType::setPrimaries(QQuickColorSpaceEnums::Primaries primariesId) { v.setPrimaries((QColorSpace::Primaries)primariesId); } -QQuickColorSpaceValueType::TransferFunction QQuickColorSpaceValueType::transferFunction() const noexcept +QQuickColorSpaceEnums::TransferFunction QQuickColorSpaceValueType::transferFunction() const noexcept { - return (QQuickColorSpaceValueType::TransferFunction)v.transferFunction(); + return (QQuickColorSpaceEnums::TransferFunction)v.transferFunction(); } -void QQuickColorSpaceValueType::setTransferFunction(QQuickColorSpaceValueType::TransferFunction transferFunction) +void QQuickColorSpaceValueType::setTransferFunction(QQuickColorSpaceEnums::TransferFunction transferFunction) { v.setTransferFunction((QColorSpace::TransferFunction)transferFunction, v.gamma()); } diff --git a/src/quick/util/qquickvaluetypes_p.h b/src/quick/util/qquickvaluetypes_p.h index 8859e12322..ed91d5d6be 100644 --- a/src/quick/util/qquickvaluetypes_p.h +++ b/src/quick/util/qquickvaluetypes_p.h @@ -84,6 +84,7 @@ class QQuickColorValueType QML_ADDED_IN_VERSION(2, 0) QML_FOREIGN(QColor) QML_VALUE_TYPE(color) + QML_EXTENDED(QQuickColorValueType) public: Q_INVOKABLE QString toString() const; @@ -125,6 +126,7 @@ class QQuickVector2DValueType QML_ADDED_IN_VERSION(2, 0) QML_FOREIGN(QVector2D) QML_VALUE_TYPE(vector2d) + QML_EXTENDED(QQuickVector2DValueType) public: Q_INVOKABLE QString toString() const; @@ -157,6 +159,7 @@ class QQuickVector3DValueType QML_ADDED_IN_VERSION(2, 0) QML_FOREIGN(QVector3D) QML_VALUE_TYPE(vector3d) + QML_EXTENDED(QQuickVector3DValueType) public: Q_INVOKABLE QString toString() const; @@ -194,6 +197,7 @@ class QQuickVector4DValueType QML_ADDED_IN_VERSION(2, 0) QML_FOREIGN(QVector4D) QML_VALUE_TYPE(vector4d) + QML_EXTENDED(QQuickVector4DValueType) public: Q_INVOKABLE QString toString() const; @@ -232,6 +236,7 @@ class QQuickQuaternionValueType QML_ADDED_IN_VERSION(2, 0) QML_FOREIGN(QQuaternion) QML_VALUE_TYPE(quaternion) + QML_EXTENDED(QQuickQuaternionValueType) public: Q_INVOKABLE QString toString() const; @@ -269,6 +274,7 @@ class QQuickMatrix4x4ValueType QML_ADDED_IN_VERSION(2, 0) QML_FOREIGN(QMatrix4x4) QML_VALUE_TYPE(matrix4x4) + QML_EXTENDED(QQuickMatrix4x4ValueType) public: qreal m11() const { return v(0, 0); } @@ -330,42 +336,40 @@ public: Q_INVOKABLE bool fuzzyEquals(const QMatrix4x4 &m) const; }; -class QQuickFontEnums +namespace QQuickFontEnums { - Q_GADGET - - QML_NAMED_ELEMENT(Font) - QML_ADDED_IN_VERSION(2, 0) - QML_UNCREATABLE("Element is not creatable.") - -public: - enum FontWeight { Thin = QFont::Thin, - ExtraLight = QFont::ExtraLight, - Light = QFont::Light, - Normal = QFont::Normal, - Medium = QFont::Medium, - DemiBold = QFont::DemiBold, - Bold = QFont::Bold, - ExtraBold = QFont::ExtraBold, - Black = QFont::Black }; - Q_ENUM(FontWeight) - enum Capitalization { MixedCase = QFont::MixedCase, - AllUppercase = QFont::AllUppercase, - AllLowercase = QFont::AllLowercase, - SmallCaps = QFont::SmallCaps, - Capitalize = QFont::Capitalize }; - Q_ENUM(Capitalization) - - enum HintingPreference { - PreferDefaultHinting = QFont::PreferDefaultHinting, - PreferNoHinting = QFont::PreferNoHinting, - PreferVerticalHinting = QFont::PreferVerticalHinting, - PreferFullHinting = QFont::PreferFullHinting - }; - Q_ENUM(HintingPreference) +Q_NAMESPACE + +QML_NAMED_ELEMENT(Font) +QML_ADDED_IN_VERSION(2, 0) + +enum FontWeight { Thin = QFont::Thin, + ExtraLight = QFont::ExtraLight, + Light = QFont::Light, + Normal = QFont::Normal, + Medium = QFont::Medium, + DemiBold = QFont::DemiBold, + Bold = QFont::Bold, + ExtraBold = QFont::ExtraBold, + Black = QFont::Black }; +Q_ENUM_NS(FontWeight) +enum Capitalization { MixedCase = QFont::MixedCase, + AllUppercase = QFont::AllUppercase, + AllLowercase = QFont::AllLowercase, + SmallCaps = QFont::SmallCaps, + Capitalize = QFont::Capitalize }; +Q_ENUM_NS(Capitalization) + +enum HintingPreference { + PreferDefaultHinting = QFont::PreferDefaultHinting, + PreferNoHinting = QFont::PreferNoHinting, + PreferVerticalHinting = QFont::PreferVerticalHinting, + PreferFullHinting = QFont::PreferFullHinting +}; +Q_ENUM_NS(HintingPreference) }; -class QQuickFontValueType : public QQuickFontEnums +class QQuickFontValueType { QFont v; Q_GADGET @@ -380,16 +384,17 @@ class QQuickFontValueType : public QQuickFontEnums Q_PROPERTY(bool strikeout READ strikeout WRITE setStrikeout FINAL) Q_PROPERTY(qreal pointSize READ pointSize WRITE setPointSize FINAL) Q_PROPERTY(int pixelSize READ pixelSize WRITE setPixelSize FINAL) - Q_PROPERTY(Capitalization capitalization READ capitalization WRITE setCapitalization FINAL) + Q_PROPERTY(QQuickFontEnums::Capitalization capitalization READ capitalization WRITE setCapitalization FINAL) Q_PROPERTY(qreal letterSpacing READ letterSpacing WRITE setLetterSpacing FINAL) Q_PROPERTY(qreal wordSpacing READ wordSpacing WRITE setWordSpacing FINAL) - Q_PROPERTY(HintingPreference hintingPreference READ hintingPreference WRITE setHintingPreference FINAL) + Q_PROPERTY(QQuickFontEnums::HintingPreference hintingPreference READ hintingPreference WRITE setHintingPreference FINAL) Q_PROPERTY(bool kerning READ kerning WRITE setKerning FINAL) Q_PROPERTY(bool preferShaping READ preferShaping WRITE setPreferShaping FINAL) QML_VALUE_TYPE(font) QML_FOREIGN(QFont) QML_ADDED_IN_VERSION(2, 0) + QML_EXTENDED(QQuickFontValueType) public: Q_INVOKABLE QString toString() const; @@ -424,8 +429,8 @@ public: int pixelSize() const; void setPixelSize(int size); - Capitalization capitalization() const; - void setCapitalization(Capitalization); + QQuickFontEnums::Capitalization capitalization() const; + void setCapitalization(QQuickFontEnums::Capitalization); qreal letterSpacing() const; void setLetterSpacing(qreal spacing); @@ -433,8 +438,8 @@ public: qreal wordSpacing() const; void setWordSpacing(qreal spacing); - HintingPreference hintingPreference() const; - void setHintingPreference(HintingPreference); + QQuickFontEnums::HintingPreference hintingPreference() const; + void setHintingPreference(QQuickFontEnums::HintingPreference); bool kerning() const; void setKerning(bool b); @@ -443,54 +448,63 @@ public: void setPreferShaping(bool b); }; +namespace QQuickColorSpaceEnums +{ +Q_NAMESPACE +QML_NAMED_ELEMENT(ColorSpace) +QML_ADDED_IN_VERSION(2, 15) +Q_CLASSINFO("RegisterEnumClassesUnscoped", "false") + +enum NamedColorSpace { + Unknown = 0, + SRgb, + SRgbLinear, + AdobeRgb, + DisplayP3, + ProPhotoRgb +}; +Q_ENUM_NS(NamedColorSpace) + +enum class Primaries { + Custom = 0, + SRgb, + AdobeRgb, + DciP3D65, + ProPhotoRgb +}; +Q_ENUM_NS(Primaries) +enum class TransferFunction { + Custom = 0, + Linear, + Gamma, + SRgb, + ProPhotoRgb +}; +Q_ENUM_NS(TransferFunction) +} + class QQuickColorSpaceValueType { QColorSpace v; Q_GADGET - Q_PROPERTY(NamedColorSpace namedColorSpace READ namedColorSpace WRITE setNamedColorSpace FINAL) - Q_PROPERTY(Primaries primaries READ primaries WRITE setPrimaries FINAL) - Q_PROPERTY(TransferFunction transferFunction READ transferFunction WRITE setTransferFunction FINAL) + Q_PROPERTY(QQuickColorSpaceEnums::NamedColorSpace namedColorSpace READ namedColorSpace WRITE setNamedColorSpace FINAL) + Q_PROPERTY(QQuickColorSpaceEnums::Primaries primaries READ primaries WRITE setPrimaries FINAL) + Q_PROPERTY(QQuickColorSpaceEnums::TransferFunction transferFunction READ transferFunction WRITE setTransferFunction FINAL) Q_PROPERTY(float gamma READ gamma WRITE setGamma FINAL) - QML_NAMED_ELEMENT(ColorSpace) + QML_ANONYMOUS + QML_FOREIGN(QColorSpace) QML_ADDED_IN_VERSION(2, 15) - Q_CLASSINFO("RegisterEnumClassesUnscoped", "false") + QML_EXTENDED(QQuickColorSpaceValueType) public: - enum NamedColorSpace { - Unknown = 0, - SRgb, - SRgbLinear, - AdobeRgb, - DisplayP3, - ProPhotoRgb - }; - Q_ENUM(NamedColorSpace) - - enum class Primaries { - Custom = 0, - SRgb, - AdobeRgb, - DciP3D65, - ProPhotoRgb - }; - Q_ENUM(Primaries) - enum class TransferFunction { - Custom = 0, - Linear, - Gamma, - SRgb, - ProPhotoRgb - }; - Q_ENUM(TransferFunction) - - NamedColorSpace namedColorSpace() const noexcept; - void setNamedColorSpace(NamedColorSpace namedColorSpace); - Primaries primaries() const noexcept; - void setPrimaries(Primaries primariesId); - TransferFunction transferFunction() const noexcept; - void setTransferFunction(TransferFunction transferFunction); + QQuickColorSpaceEnums::NamedColorSpace namedColorSpace() const noexcept; + void setNamedColorSpace(QQuickColorSpaceEnums::NamedColorSpace namedColorSpace); + QQuickColorSpaceEnums::Primaries primaries() const noexcept; + void setPrimaries(QQuickColorSpaceEnums::Primaries primariesId); + QQuickColorSpaceEnums::TransferFunction transferFunction() const noexcept; + void setTransferFunction(QQuickColorSpaceEnums::TransferFunction transferFunction); float gamma() const noexcept; void setGamma(float gamma); }; diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index 1311319266..582b4e0126 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -338,6 +338,7 @@ private slots: void checkUncreatableNoReason(); void checkURLtoURLObject(); + void registerValueTypes(); private: QQmlEngine engine; @@ -5923,6 +5924,83 @@ void tst_qqmllanguage::checkURLtoURLObject() QCOMPARE(c.errors().count(), 0); } +struct TestValueType +{ + Q_GADGET + Q_PROPERTY(int foo MEMBER foo) +public: + int foo = 12; + + friend bool operator==(const TestValueType &a, const TestValueType &b) + { + return a.foo == b.foo; + } + + friend bool operator!=(const TestValueType &a, const TestValueType &b) + { + return a.foo != b.foo; + } +}; + +struct TestExtendedValueType +{ + Q_GADGET + Q_PROPERTY(int bar READ bar WRITE setBar) +public: + TestValueType wrapped; + + int bar() const { return wrapped.foo; } + void setBar(int bar) { wrapped.foo = bar; } +}; + +class TestObjectType : public QObject +{ + Q_OBJECT + Q_PROPERTY(TestValueType test MEMBER test) +public: + TestValueType test; +}; + +void tst_qqmllanguage::registerValueTypes() +{ + QTest::ignoreMessage(QtWarningMsg, "Invalid QML element name \"UpperCase\"; value type names must begin with a lowercase letter"); + QCOMPARE(qmlRegisterType<TestValueType>("DoesNotWork", 1, 0, "UpperCase"), -1); + QVERIFY(qmlRegisterType<TestObjectType>("DoesWork", 1, 0, "TestObject") >= 0); + + { + QQmlEngine engine; + QQmlComponent c(&engine); + c.setData("import QtQml\nimport DoesWork\nTestObject { Component.onCompleted: test.foo = 14 }", QUrl()); + QVERIFY(c.isReady()); + QScopedPointer<QObject> obj(c.create()); + QCOMPARE(obj->property("test").value<TestValueType>().foo, 14); + + QQmlComponent c2(&engine); + c2.setData("import QtQml\nimport DoesWork\n TestObject { Component.onCompleted: test.bar = 14 }", QUrl()); + QVERIFY(c2.isReady()); + QScopedPointer<QObject> obj2(c2.create()); + QCOMPARE(obj2->property("test").value<TestValueType>().foo, 12); + } + + QVERIFY((qmlRegisterExtendedType<TestValueType, TestExtendedValueType>("DoesWork", 1, 0, "lowerCase")) >= 0); + + { + QQmlEngine engine; + QQmlComponent c(&engine); + c.setData("import QtQml\nimport DoesWork\nTestObject { Component.onCompleted: test.foo = 14 }", QUrl()); + QVERIFY(c.isReady()); + QScopedPointer<QObject> obj(c.create()); + // The foo property is hidden now. + QCOMPARE(obj->property("test").value<TestValueType>().foo, 12); + + QQmlComponent c2(&engine); + c2.setData("import QtQml\nimport DoesWork\n TestObject { Component.onCompleted: test.bar = 14 }", QUrl()); + QVERIFY(c2.isReady()); + QScopedPointer<QObject> obj2(c2.create()); + QCOMPARE(obj2->property("test").value<TestValueType>().foo, 14); + } +} + void tst_qqmllanguage::accessNullPointerPropertyCache() { QQmlEngine engine; diff --git a/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp b/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp index 6af32c4011..d95d378adb 100644 --- a/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp +++ b/tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp @@ -225,33 +225,6 @@ public: void setProperty2(double p2) { v.setProperty2(p2); } }; -class TestValueTypeProvider : public QQmlValueTypeProvider -{ -public: - const QMetaObject *getMetaObjectForMetaType(int type) - { - if (type == qMetaTypeId<TestValue>()) - return &TestValueType::staticMetaObject; - - return nullptr; - } - -}; - -TestValueTypeProvider *getValueTypeProvider() -{ - static TestValueTypeProvider valueTypeProvider; - return &valueTypeProvider; -} - -bool initializeProviders() -{ - QQml_addValueTypeProvider(getValueTypeProvider()); - return true; -} - -const bool initialized = initializeProviders(); - class TestValueExporter : public QObject { Q_OBJECT @@ -271,11 +244,9 @@ private: void tst_qqmlvaluetypeproviders::userType() { - Q_ASSERT(initialized); - Q_ASSERT(qMetaTypeId<TestValue>() >= QMetaType::User); - - qRegisterMetaType<TestValue>(); + qmlRegisterExtendedType<TestValue, TestValueType>("Test", 1, 0, "test_value"); qmlRegisterTypesAndRevisions<TestValueExporter>("Test", 1); + Q_ASSERT(qMetaTypeId<TestValue>() >= QMetaType::User); TestValueExporter exporter; diff --git a/tests/auto/quick/qquicktext/tst_qquicktext.cpp b/tests/auto/quick/qquicktext/tst_qquicktext.cpp index 24c85931ca..7a7e03c088 100644 --- a/tests/auto/quick/qquicktext/tst_qquicktext.cpp +++ b/tests/auto/quick/qquicktext/tst_qquicktext.cpp @@ -1501,7 +1501,7 @@ void tst_qquicktext::weight() QQuickText *textObject = qobject_cast<QQuickText*>(textComponent.create()); QVERIFY(textObject != nullptr); - QCOMPARE((int)textObject->font().weight(), (int)QQuickFontValueType::Normal); + QCOMPARE((int)textObject->font().weight(), int(QQuickFontEnums::Normal)); delete textObject; } @@ -1512,7 +1512,7 @@ void tst_qquicktext::weight() QQuickText *textObject = qobject_cast<QQuickText*>(textComponent.create()); QVERIFY(textObject != nullptr); - QCOMPARE((int)textObject->font().weight(), (int)QQuickFontValueType::Bold); + QCOMPARE((int)textObject->font().weight(), int(QQuickFontEnums::Bold)); delete textObject; } @@ -1566,7 +1566,7 @@ void tst_qquicktext::capitalization() QQuickText *textObject = qobject_cast<QQuickText*>(textComponent.create()); QVERIFY(textObject != nullptr); - QCOMPARE((int)textObject->font().capitalization(), (int)QQuickFontValueType::MixedCase); + QCOMPARE((int)textObject->font().capitalization(), int(QQuickFontEnums::MixedCase)); delete textObject; } @@ -1577,7 +1577,7 @@ void tst_qquicktext::capitalization() QQuickText *textObject = qobject_cast<QQuickText*>(textComponent.create()); QVERIFY(textObject != nullptr); - QCOMPARE((int)textObject->font().capitalization(), (int)QQuickFontValueType::AllUppercase); + QCOMPARE((int)textObject->font().capitalization(), int(QQuickFontEnums::AllUppercase)); delete textObject; } @@ -1588,7 +1588,7 @@ void tst_qquicktext::capitalization() QQuickText *textObject = qobject_cast<QQuickText*>(textComponent.create()); QVERIFY(textObject != nullptr); - QCOMPARE((int)textObject->font().capitalization(), (int)QQuickFontValueType::AllLowercase); + QCOMPARE((int)textObject->font().capitalization(), int(QQuickFontEnums::AllLowercase)); delete textObject; } @@ -1599,7 +1599,7 @@ void tst_qquicktext::capitalization() QQuickText *textObject = qobject_cast<QQuickText*>(textComponent.create()); QVERIFY(textObject != nullptr); - QCOMPARE((int)textObject->font().capitalization(), (int)QQuickFontValueType::SmallCaps); + QCOMPARE((int)textObject->font().capitalization(), int(QQuickFontEnums::SmallCaps)); delete textObject; } @@ -1610,7 +1610,7 @@ void tst_qquicktext::capitalization() QQuickText *textObject = qobject_cast<QQuickText*>(textComponent.create()); QVERIFY(textObject != nullptr); - QCOMPARE((int)textObject->font().capitalization(), (int)QQuickFontValueType::Capitalize); + QCOMPARE((int)textObject->font().capitalization(), int(QQuickFontEnums::Capitalize)); delete textObject; } |