Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquickdesignersupportproperties.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// Qt-Security score:significant reason:default
4
6
9
11
12static void addToPropertyNameListIfNotBlackListed(QQuickDesignerSupport::PropertyNameList *propertyNameList,
13 const QQuickDesignerSupport::PropertyName &propertyName)
14{
15 if (!QQuickDesignerSupportProperties::isPropertyBlackListed(propertyName))
16 propertyNameList->append(propertyName);
17}
18
19void QQuickDesignerSupportProperties::createNewDynamicProperty(QObject *object, QQmlEngine *engine, const QString &name)
20{
21 QQmlDesignerMetaObject::getNodeInstanceMetaObject(object, engine)->createNewDynamicProperty(name);
22}
23
24void QQuickDesignerSupportProperties::registerNodeInstanceMetaObject(QObject *object, QQmlEngine *engine)
25{
26 // we just create one and the ownership goes automatically to the object in nodeinstance see init method
27 QQmlDesignerMetaObject::getNodeInstanceMetaObject(object, engine);
28}
29
30bool QQuickDesignerSupportProperties::hasFullImplementedListInterface(const QQmlListReference &list)
31{
32 return list.isValid() && list.canCount() && list.canAt() && list.canAppend() && list.canClear();
33}
34
35void QQuickDesignerSupportProperties::registerCustomData(QObject *object)
36{
37 QQuickDesignerCustomObjectData::registerData(object);
38}
39
40QVariant QQuickDesignerSupportProperties::getResetValue(QObject *object, const QQuickDesignerSupport::PropertyName &propertyName)
41{
42 return QQuickDesignerCustomObjectData::getResetValue(object, propertyName);
43}
44
45void QQuickDesignerSupportProperties::doResetProperty(QObject *object, QQmlContext *context, const QQuickDesignerSupport::PropertyName &propertyName)
46{
47 QQuickDesignerCustomObjectData::doResetProperty(object, context, propertyName);
48}
49
50bool QQuickDesignerSupportProperties::hasValidResetBinding(QObject *object, const QQuickDesignerSupport::PropertyName &propertyName)
51{
52 return QQuickDesignerCustomObjectData::hasValidResetBinding(object, propertyName);
53}
54
55bool QQuickDesignerSupportProperties::hasBindingForProperty(QObject *object,
56 QQmlContext *context,
57 const QQuickDesignerSupport::PropertyName &propertyName,
58 bool *hasChanged)
59{
60 return QQuickDesignerCustomObjectData::hasBindingForProperty(object, context, propertyName, hasChanged);
61}
62
63void QQuickDesignerSupportProperties::setPropertyBinding(QObject *object,
64 QQmlContext *context,
65 const QQuickDesignerSupport::PropertyName &propertyName,
66 const QString &expression)
67{
68 QQuickDesignerCustomObjectData::setPropertyBinding(object, context, propertyName, expression);
69}
70
71void QQuickDesignerSupportProperties::keepBindingFromGettingDeleted(QObject *object,
72 QQmlContext *context,
73 const QQuickDesignerSupport::PropertyName &propertyName)
74{
75 QQuickDesignerCustomObjectData::keepBindingFromGettingDeleted(object, context, propertyName);
76}
77
78bool QQuickDesignerSupportProperties::isPropertyQObject(const QMetaProperty &metaProperty)
79{
80 return metaProperty.metaType().flags().testFlag(QMetaType::PointerToQObject);
81}
82
83
84QObject *QQuickDesignerSupportProperties::readQObjectProperty(const QMetaProperty &metaProperty, QObject *object)
85{
86 return QQmlMetaType::toQObject(metaProperty.read(object));
87}
88
89void QQuickDesignerSupportProperties::getPropertyCache(QObject *object)
90{
91 QQmlMetaType::propertyCache(object->metaObject());
92}
93
95 const QQuickDesignerSupport::PropertyName &baseName,
96 QObjectList *inspectedObjects,
97 int depth = 0)
98{
99 QQuickDesignerSupport::PropertyNameList propertyNameList;
100
101 if (depth > 2)
102 return propertyNameList;
103
104 if (!inspectedObjects->contains(object))
105 inspectedObjects->append(object);
106
107 const QMetaObject *metaObject = object->metaObject();
108 for (int index = 0; index < metaObject->propertyCount(); ++index) {
109 QMetaProperty metaProperty = metaObject->property(index);
110 QQmlProperty declarativeProperty(object, QString::fromUtf8(metaProperty.name()));
111 if (declarativeProperty.isValid() && !declarativeProperty.isWritable() && declarativeProperty.propertyTypeCategory() == QQmlProperty::Object) {
112 if (declarativeProperty.name() != QLatin1String("parent")) {
113 QObject *childObject = QQmlMetaType::toQObject(declarativeProperty.read());
114 if (childObject)
115 propertyNameList.append(propertyNameListForWritableProperties(childObject,
116 baseName + QQuickDesignerSupport::PropertyName(metaProperty.name())
117 + '.', inspectedObjects,
118 depth + 1));
119 }
120 } else if (QQmlGadgetPtrWrapper *valueType
121 = QQmlGadgetPtrWrapper::instance(qmlEngine(object), metaProperty.metaType())) {
122 valueType->setValue(metaProperty.read(object));
123 propertyNameList.append(propertyNameListForWritableProperties(valueType,
124 baseName + QQuickDesignerSupport::PropertyName(metaProperty.name())
125 + '.', inspectedObjects,
126 depth + 1));
127 }
128
129 if (metaProperty.isReadable() && metaProperty.isWritable()) {
130 addToPropertyNameListIfNotBlackListed(&propertyNameList,
131 baseName + QQuickDesignerSupport::PropertyName(metaProperty.name()));
132 }
133 }
134
135 return propertyNameList;
136}
137
138QQuickDesignerSupport::PropertyNameList QQuickDesignerSupportProperties::propertyNameListForWritableProperties(QObject *object)
139{
140 QObjectList localObjectList;
141 return ::propertyNameListForWritableProperties(object, {}, &localObjectList);
142}
143
144bool QQuickDesignerSupportProperties::isPropertyBlackListed(const QQuickDesignerSupport::PropertyName &propertyName)
145{
146 if (propertyName.contains(".") && propertyName.contains("__"))
147 return true;
148
149 if (propertyName.count(".") > 1)
150 return true;
151
152 return false;
153}
154
155QQuickDesignerSupport::PropertyNameList QQuickDesignerSupportProperties::allPropertyNames(QObject *object,
156 const QQuickDesignerSupport::PropertyName &baseName,
157 QObjectList *inspectedObjects,
158 int depth)
159{
160 QQuickDesignerSupport::PropertyNameList propertyNameList;
161
162 QObjectList localObjectList;
163
164 if (inspectedObjects == nullptr)
165 inspectedObjects = &localObjectList;
166
167 if (depth > 2)
168 return propertyNameList;
169
170 if (!inspectedObjects->contains(object))
171 inspectedObjects->append(object);
172
173 const QMetaObject *metaObject = object->metaObject();
174
175 QStringList deferredPropertyNames;
176 const int namesIndex = metaObject->indexOfClassInfo("DeferredPropertyNames");
177 if (namesIndex != -1) {
178 QMetaClassInfo classInfo = metaObject->classInfo(namesIndex);
179 deferredPropertyNames = QString::fromUtf8(classInfo.value()).split(QLatin1Char(','));
180 }
181
182 for (int index = 0; index < metaObject->propertyCount(); ++index) {
183 QMetaProperty metaProperty = metaObject->property(index);
184 QQmlProperty declarativeProperty(object, QString::fromUtf8(metaProperty.name()));
185 if (declarativeProperty.isValid() && declarativeProperty.propertyTypeCategory() == QQmlProperty::Object) {
186 if (declarativeProperty.name() != QLatin1String("parent")
187 && !deferredPropertyNames.contains(declarativeProperty.name())) {
188 QObject *childObject = QQmlMetaType::toQObject(declarativeProperty.read());
189 if (childObject)
190 propertyNameList.append(allPropertyNames(childObject,
191 baseName
192 + QQuickDesignerSupport::PropertyName(metaProperty.name())
193 + '.', inspectedObjects,
194 depth + 1));
195 }
196 } else if (QQmlGadgetPtrWrapper *valueType
197 = QQmlGadgetPtrWrapper::instance(qmlEngine(object), metaProperty.metaType())) {
198 valueType->setValue(metaProperty.read(object));
199 propertyNameList.append(baseName + QQuickDesignerSupport::PropertyName(metaProperty.name()));
200 propertyNameList.append(allPropertyNames(valueType,
201 baseName
202 + QQuickDesignerSupport::PropertyName(metaProperty.name())
203 + '.', inspectedObjects,
204 depth + 1));
205 } else {
206 addToPropertyNameListIfNotBlackListed(&propertyNameList,
207 baseName + QQuickDesignerSupport::PropertyName(metaProperty.name()));
208 }
209 }
210
211 return propertyNameList;
212}
213
214
215QT_END_NAMESPACE
Combined button and popup list for selecting options.
static QQuickDesignerSupport::PropertyNameList propertyNameListForWritableProperties(QObject *object, const QQuickDesignerSupport::PropertyName &baseName, QObjectList *inspectedObjects, int depth=0)
static QT_BEGIN_NAMESPACE void addToPropertyNameListIfNotBlackListed(QQuickDesignerSupport::PropertyNameList *propertyNameList, const QQuickDesignerSupport::PropertyName &propertyName)