aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlvaluetypewrapper_p.h
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2022-10-05 17:02:03 +0200
committerUlf Hermann <ulf.hermann@qt.io>2022-10-19 20:32:01 +0200
commita824a6f060ec3a0000d7349649a3ab9e0570ecaa (patch)
tree9574d4f96d52bf0de792bab52d42bd35a08027e6 /src/qml/qml/qqmlvaluetypewrapper_p.h
parente89a06753c772bd96b3299e03b2f7ad78ffc9fb9 (diff)
Recursively write back value types and sequences
Both types have functionality to write themselves back to the properties they were loaded from on change, but so far we could not nest those writes. [ChangeLog][QtQml] You can now assign to properties of nested value types and to elements of containers from QML functions. You cannot, however, take references of such values and elements. This is in contrast to non-nested value types and the containers themselves. However, passing references of value types and containers around generally leads to very confusing effects. Don't do this. Fixes: QTBUG-99766 Change-Id: I74cb89e5c3d733b0b61e42969d617b2ecc1562f4 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlvaluetypewrapper_p.h')
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper_p.h68
1 files changed, 38 insertions, 30 deletions
diff --git a/src/qml/qml/qqmlvaluetypewrapper_p.h b/src/qml/qml/qqmlvaluetypewrapper_p.h
index c57e385a00..cb8bfdf106 100644
--- a/src/qml/qml/qqmlvaluetypewrapper_p.h
+++ b/src/qml/qml/qqmlvaluetypewrapper_p.h
@@ -18,10 +18,15 @@
#include <QtCore/qglobal.h>
#include <private/qtqmlglobal_p.h>
-#include <private/qv4value_p.h>
-#include <private/qv4object_p.h>
#include <private/qv4referenceobject_p.h>
#include <private/qqmlpropertycache_p.h>
+#include <private/qqmltype_p_p.h>
+#include <private/qqmltypewrapper_p.h>
+#include <private/qv4object_p.h>
+#include <private/qv4qobjectwrapper_p.h>
+#include <private/qv4sequenceobject_p.h>
+#include <private/qv4value_p.h>
+#include <private/qv4referenceobject_p.h>
QT_BEGIN_NAMESPACE
@@ -36,41 +41,32 @@ namespace Heap {
DECLARE_HEAP_OBJECT(QQmlValueTypeWrapper, ReferenceObject) {
DECLARE_MARKOBJECTS(QQmlValueTypeWrapper);
- void destroy();
-
- void setValueType(QQmlValueType *valueType)
+ void init(const void *data, QQmlValueType *valueType, const QMetaObject *metaObject,
+ Object *object, int property, Flags flags)
{
- Q_ASSERT(valueType != nullptr);
- m_valueType = valueType;
+ ReferenceObject::init(object, property, flags);
+ setValueType(valueType);
+ setMetaObject(metaObject);
+ if (data)
+ setData(data);
}
+ QQmlValueTypeWrapper *detached() const;
+
+ void destroy();
+
QQmlValueType *valueType() const
{
Q_ASSERT(m_valueType != nullptr);
return m_valueType;
}
- void setGadgetPtr(void *gadgetPtr) const
- {
- m_gadgetPtr = gadgetPtr;
- }
-
- void *gadgetPtr() const
- {
- return m_gadgetPtr;
- }
+ void setGadgetPtr(void *gadgetPtr) { m_gadgetPtr = gadgetPtr; }
+ void *gadgetPtr() const { return m_gadgetPtr; }
- void setMetaObject(const QMetaObject *metaObject)
- {
- m_metaObject = metaObject;
- }
- const QMetaObject *metaObject() const
- {
- return m_metaObject;
- }
+ const QMetaObject *metaObject() const { return m_metaObject; }
- void setData(const void *data) const;
- void setValue(const QVariant &value) const;
+ void setData(const void *data);
QVariant toVariant() const;
void *storagePointer();
@@ -80,7 +76,14 @@ DECLARE_HEAP_OBJECT(QQmlValueTypeWrapper, ReferenceObject) {
bool writeBack();
private:
- mutable void *m_gadgetPtr;
+ void setMetaObject(const QMetaObject *metaObject) { m_metaObject = metaObject; }
+ void setValueType(QQmlValueType *valueType)
+ {
+ Q_ASSERT(valueType != nullptr);
+ m_valueType = valueType;
+ }
+
+ void *m_gadgetPtr;
QQmlValueType *m_valueType;
const QMetaObject *m_metaObject;
};
@@ -95,9 +98,13 @@ struct Q_QML_EXPORT QQmlValueTypeWrapper : public ReferenceObject
public:
- static ReturnedValue create(ExecutionEngine *engine, QObject *, int, const QMetaObject *metaObject, QMetaType type);
- static ReturnedValue create(ExecutionEngine *engine, Heap::QQmlValueTypeWrapper *cloneFrom, QObject *object);
- static ReturnedValue create(ExecutionEngine *engine, const void *, const QMetaObject *metaObject, QMetaType type);
+ static ReturnedValue create(
+ ExecutionEngine *engine, const void *data, const QMetaObject *metaObject,
+ QMetaType type, Heap::Object *object, int property, Heap::ReferenceObject::Flags flags);
+ static ReturnedValue create(
+ ExecutionEngine *engine, Heap::QQmlValueTypeWrapper *cloneFrom, Heap::Object *object);
+ static ReturnedValue create(
+ ExecutionEngine *engine, const void *, const QMetaObject *metaObject, QMetaType type);
QVariant toVariant() const;
bool toGadget(void *data) const;
@@ -123,6 +130,7 @@ public:
QV4::Value &object, const QV4::Value &value);
static void initProto(ExecutionEngine *v4);
+ static int virtualMetacall(Object *object, QMetaObject::Call call, int index, void **a);
};
}