aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
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/quick
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/quick')
-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
3 files changed, 107 insertions, 119 deletions
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);
};