aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-09-16 16:41:27 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-09-23 14:54:46 +0200
commit8e222a70d19d5eef616e1d6306415da64fbab4cb (patch)
tree535e4cd02c2dbca0289bc6ec39f2699856554737 /src
parent90b5d7fa03f9818fa5edc897ee6a109fcc182b9e (diff)
Allow proper registration of value types
You can now have an extension object on a value type that offers additional properties. This is how we model the QtQuick value types. It allows us to retrieve the extension's metaobject without using the virtual functions in the value type provider. As before, this mechanism is still rather dangerous and not fit for public consumption. It relies on the extension object having exactly the same layout as the original value type, and it hides any properties the original value type might expose. Furthermore we enforce now that gadgets should have lowercase names. The ones that didn't before are split up into an anonymous value type and a namespace that contains all the addressable bits. Task-number: QTBUG-82443 Change-Id: Ic93d6764538d6ccc0774b3c5648eee08ba0939c0 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src')
-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
15 files changed, 338 insertions, 286 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);
};