aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/qml/qqml.h129
-rw-r--r--src/qml/qml/qqmlengine.cpp10
-rw-r--r--src/qml/qml/qqmlglobal.cpp13
-rw-r--r--src/qml/qml/qqmlglobal_p.h4
-rw-r--r--src/qml/qml/qqmllocale.cpp8
-rw-r--r--src/qml/qml/qqmllocale_p.h32
-rw-r--r--src/qml/qml/qqmlmetatype.cpp16
-rw-r--r--src/qml/qml/qqmlprivate.h69
-rw-r--r--src/qml/qml/qqmltype.cpp7
-rw-r--r--src/qml/qml/qqmltype_p.h1
-rw-r--r--src/qml/qml/qqmlvaluetype.cpp28
-rw-r--r--src/qml/qml/qqmlvaluetype_p.h81
-rw-r--r--src/quick/util/qquickglobal.cpp26
-rw-r--r--src/quick/util/qquickvaluetypes.cpp32
-rw-r--r--src/quick/util/qquickvaluetypes_p.h168
-rw-r--r--tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp78
-rw-r--r--tests/auto/qml/qqmlvaluetypeproviders/tst_qqmlvaluetypeproviders.cpp33
-rw-r--r--tests/auto/quick/qquicktext/tst_qquicktext.cpp14
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;
}