Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmldesignermetaobject.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <QSharedPointer>
7#include <QMetaProperty>
8#include <QtCore/private/qnumeric_p.h>
9#include <QDebug>
10
11#include <private/qqmlengine_p.h>
12
14
15static QHash<QDynamicMetaObjectData *, bool> nodeInstanceMetaObjectList;
17
19 inline QPair<QVariant, bool> &getDataRef(int idx) {
20 while (m_data.size() <= idx)
21 m_data << QPair<QVariant, bool>(QVariant(), false);
22 return m_data[idx];
23 }
24
25 inline QVariant &getData(int idx) {
26 QPair<QVariant, bool> &prop = getDataRef(idx);
27 if (!prop.second) {
28 prop.first = QVariant();
29 prop.second = true;
30 }
31 return prop.first;
32 }
33
34 inline bool hasData(int idx) const {
35 if (idx >= m_data.size())
36 return false;
37 return m_data[idx].second;
38 }
39
40 inline int count() { return m_data.size(); }
41
42 QVector<QPair<QVariant, bool> > m_data;
43};
44
53
55{
56 //Avoid setting up multiple MetaObjects on the same QObject
60 return static_cast<QQmlDesignerMetaObject *>(parent);
61
62 // we just create one and the ownership goes automatically to the object in nodeinstance see init method
63
64 QQmlData *ddata = QQmlData::get(object, false);
65
66 const bool hadVMEMetaObject = ddata ? ddata->hasVMEMetaObject : false;
68 //If our parent is not a VMEMetaObject we just set the flag to false again
69 if (ddata)
70 ddata->hasVMEMetaObject = hadVMEMetaObject;
71 return mo;
72}
73
74void QQmlDesignerMetaObject::init(QObject *object)
75{
76 //Creating QQmlOpenMetaObjectType
77 m_openMetaObject = std::make_unique<QQmlOpenMetaObject>(object, metaObjectParent());
78 //Assigning type to this
80
81 //Assign this to object
83 op->metaObject = this;
84
86 cache = m_cache;
87
88 nodeInstanceMetaObjectList.insert(this, true);
89}
90
91QQmlDesignerMetaObject::QQmlDesignerMetaObject(QObject *object, QQmlEngine *engine)
92 : QQmlVMEMetaObject(engine->handle(), object, cacheForObject(object), /*qml compilation unit*/nullptr, /*qmlObjectId*/-1),
93 m_context(engine->contextForObject(object)),
95{
96 init(object);
97
98 QQmlData *ddata = QQmlData::get(object, false);
99 //Assign cache to object
100 if (ddata && ddata->propertyCache) {
101 m_cache->setParent(ddata->propertyCache);
102 m_cache->invalidate(metaObject.data());
103 ddata->propertyCache = m_cache;
104 }
105
106}
107
109{
110 // m_openMetaObject has this metaobject as its parent.
111 // We need to remove it in order to avoid a dtor recursion
112 m_openMetaObject->unparent();
113 nodeInstanceMetaObjectList.remove(this);
114}
115
117{
118 int id = type()->createProperty(name.toUtf8());
120 setValue(id, QVariant());
121 Q_ASSERT(id >= 0);
122
123 //Updating cache
124 m_cache->invalidate(metaObject.data());
125
126 QQmlProperty property(myObject(), name, m_context);
127 Q_ASSERT(property.isValid());
128}
129
131{
132 QPair<QVariant, bool> &prop = m_data->getDataRef(id);
133 prop.first = propertyWriteValue(id, value);
134 prop.second = true;
135 QMetaObject::activate(myObject(), id + type()->signalOffset(), nullptr);
136}
137
142
150
158
160{
161 return cache->propertyOffset();
162}
163
165{
167 && id >= type()->propertyOffset()) {
168 int propId = id - type()->propertyOffset();
169 if (call == QMetaObject::ReadProperty) {
170 //propertyRead(propId);
171 *reinterpret_cast<QVariant *>(a[0]) = m_data->getData(propId);
172 } else if (call == QMetaObject::WriteProperty) {
173 if (propId <= m_data->count() || m_data->m_data[propId].first != *reinterpret_cast<QVariant *>(a[0])) {
174 //propertyWrite(propId);
175 QPair<QVariant, bool> &prop = m_data->getDataRef(propId);
176 prop.first = propertyWriteValue(propId, *reinterpret_cast<QVariant *>(a[0]));
177 prop.second = true;
178 //propertyWritten(propId);
179 activate(myObject(), type()->signalOffset() + propId, nullptr);
180 }
181 }
182 return -1;
183 } else {
185 if (dynamicParent)
186 return dynamicParent->metaCall(o, call, id, a);
187 else
188 return myObject()->qt_metacall(call, id, a);
189 }
190}
191
193{
194 Q_ASSERT(myObject() == o);
195
196 int metaCallReturnValue = -1;
197
198 const QMetaProperty propertyById = metaObject->property(id);
199
201 && propertyById.userType() == QMetaType::QVariant
202 && reinterpret_cast<QVariant *>(a[0])->userType() == QMetaType::Double
203 && qt_is_nan(reinterpret_cast<QVariant *>(a[0])->toDouble())) {
204 return -1;
205 }
206
208 && propertyById.userType() == QMetaType::Double
209 && qt_is_nan(*reinterpret_cast<double*>(a[0]))) {
210 return -1;
211 }
212
214 && propertyById.userType() == QMetaType::Float
215 && qt_is_nan(*reinterpret_cast<float*>(a[0]))) {
216 return -1;
217 }
218
219 QVariant oldValue;
220
221 if (call == QMetaObject::WriteProperty && !propertyById.hasNotifySignal())
222 {
223 oldValue = propertyById.read(myObject());
224 }
225
227 const QMetaObject *staticParent = dynamicParent
228 ? dynamicParent->toDynamicMetaObject(QQmlVMEMetaObject::object)
229 : nullptr;
230 if (staticParent && id < staticParent->propertyOffset())
231 metaCallReturnValue = dynamicParent->metaCall(o, call, id, a);
232 else
233 openMetaCall(o, call, id, a);
234
235
237 && !propertyById.hasNotifySignal()
238 && oldValue != propertyById.read(myObject()))
240
241 return metaCallReturnValue;
242}
243
245{
246 const QMetaProperty propertyById = metaObject->property(id);
247
248 if (id < propertyOffset()) {
250 notifyPropertyChangeCallBack(myObject(), propertyById.name());
251 } else {
254 }
255}
256
258{
259 return type()->propertyCount();
260}
261
263{
264 return type()->propertyName(idx);
265}
266
268{
269 metaObject = m_openMetaObject.get();
270}
271
276
NSData * m_data
T * asT1() const
T2 * asT2() const
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
friend class QVariant
Definition qmetatype.h:796
QDynamicMetaObjectData * metaObject
Definition qobject.h:90
static QObjectPrivate * get(QObject *o)
Definition qobject_p.h:150
\inmodule QtCore
Definition qobject.h:103
static QQmlData * get(QObjectPrivate *priv, bool create)
Definition qqmldata_p.h:199
int metaCall(QObject *o, QMetaObject::Call _c, int _id, void **_a) override
void createNewDynamicProperty(const QString &name)
QVariant propertyWriteValue(int, const QVariant &)
static QQmlDesignerMetaObject * getNodeInstanceMetaObject(QObject *object, QQmlEngine *engine)
QDynamicMetaObjectData * dynamicMetaObjectParent() const
static void registerNotifyPropertyChangeCallBack(void(*callback)(QObject *, const QQuickDesignerSupport::PropertyName &propertyName))
void setValue(int id, const QVariant &value)
int openMetaCall(QObject *o, QMetaObject::Call _c, int _id, void **_a)
const QMetaObject * metaObjectParent() const
The QQmlEngine class provides an environment for instantiating QML components.
Definition qqmlengine.h:57
QQmlPropertyCache::ConstPtr cache
QBiPointer< QDynamicMetaObjectData, const QMetaObject > parent
QTaggedPointer< const QMetaObject, MetaObjectValidity > metaObject
static QQmlPropertyCache::ConstPtr propertyCache(QObject *object, QTypeRevision version=QTypeRevision())
Returns a QQmlPropertyCache for obj if one is available.
void invalidate(const QMetaObject *)
void setParent(QQmlPropertyCache::ConstPtr newParent)
static Ptr createStandalone(const QMetaObject *, QTypeRevision metaObjectRevision=QTypeRevision::zero())
Creates a standalone QQmlPropertyCache of metaObject.
The QQmlProperty class abstracts accessing properties on objects created from QML.
static QQmlVMEMetaObject * get(QObject *o)
QV4::ExecutionEngine * engine
void activate(QObject *, int, void **)
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
T * data() const noexcept
\inmodule QtCore
Definition qvariant.h:65
int userType() const
Definition qvariant.h:339
auto mo
[7]
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static Q_DECL_CONST_FUNCTION bool qt_is_nan(double d)
Definition qnumeric_p.h:112
GLuint64 GLenum void * handle
GLboolean GLboolean GLboolean GLboolean a
[7]
GLuint object
[3]
GLenum type
GLuint name
static QT_BEGIN_NAMESPACE QHash< QDynamicMetaObjectData *, bool > nodeInstanceMetaObjectList
static void(* notifyPropertyChangeCallBack)(QObject *, const QQuickDesignerSupport::PropertyName &propertyName)
static QQmlPropertyCache::ConstPtr cacheForObject(QObject *object)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
static double toDouble(Value v)
const char property[13]
Definition qwizard.cpp:101
obj metaObject() -> className()
QObject::connect nullptr
QJSEngine engine
[0]
QVector< QPair< QVariant, bool > > m_data
bool hasData(int idx) const
QPair< QVariant, bool > & getDataRef(int idx)
QVariant & getData(int idx)
virtual QMetaObject * toDynamicMetaObject(QObject *)=0
\inmodule QtCore
QMetaProperty property(int index) const
Returns the meta-data for the property with the given index.
static void activate(QObject *sender, int signal_index, void **argv)
Definition qobject.cpp:4193