29 if (object ==
nullptr)
32 QQuickTransition *transition = qobject_cast<QQuickTransition*>(object);
33 QQuickAbstractAnimation *animation = qobject_cast<QQuickAbstractAnimation*>(object);
34 QQmlTimer *timer = qobject_cast<QQmlTimer*>(object);
36 transition->setFromState(QString());
37 transition->setToState(QString());
38 }
else if (animation) {
42 animation->complete();
43 animation->setDisableUserControl();
45 timer->blockSignals(
true);
58 if (!object || objectList.contains(object))
61 objectList.append(object);
63 const QMetaObject *mo = object->metaObject();
65 QByteArrayList deferredPropertyNames;
66 const int namesIndex = mo->indexOfClassInfo(
"DeferredPropertyNames");
67 if (namesIndex != -1) {
68 QMetaClassInfo classInfo = mo->classInfo(namesIndex);
69 deferredPropertyNames = QByteArray(classInfo.value()).split(
',');
72 for (
int index = QObject::staticMetaObject.propertyOffset();
73 index < object->metaObject()->propertyCount();
76 QMetaProperty metaProperty = object->metaObject()->property(index);
78 if (deferredPropertyNames.contains(metaProperty.name()))
82 if (metaProperty.isReadable()
83 && metaProperty.isWritable()
84 && metaProperty.metaType().flags().testFlag(QMetaType::PointerToQObject)) {
85 if (qstrcmp(metaProperty.name(),
"parent")) {
86 QObject *propertyObject = QQmlMetaType::toQObject(metaProperty.read(object));
87 allSubObjects(propertyObject, objectList);
93 if (metaProperty.isReadable()
94 && QQmlMetaType::isList(metaProperty.metaType())) {
95 QQmlListReference list(object, metaProperty.name());
96 if (list.canCount() && list.canAt()) {
97 for (qsizetype i = 0; i < list.count(); i++) {
98 QObject *propertyObject = list.at(i);
99 allSubObjects(propertyObject, objectList);
107 for (QObject *childObject : object->children()) {
108 allSubObjects(childObject, objectList);
112 QQuickItem *quickItem = qobject_cast<QQuickItem*>(object);
114 const auto childItems = quickItem->childItems();
115 for (QQuickItem *childItem : childItems)
116 allSubObjects(childItem, objectList);
120void QQuickDesignerSupportItems::tweakObjects(QObject *object)
122 QObjectList objectList;
123 allSubObjects(object, objectList);
124 for (QObject* childObject : std::as_const(objectList)) {
125 stopAnimation(childObject);
126 makeLoaderSynchronous(childObject);
127 if (fixResourcePathsForObjectCallBack)
128 fixResourcePathsForObjectCallBack(childObject);
179QObject *QQuickDesignerSupportItems::createPrimitive(
const QString &typeName, QTypeRevision version, QQmlContext *context)
181 ComponentCompleteDisabler disableComponentComplete;
183 Q_UNUSED(disableComponentComplete);
185 QObject *object =
nullptr;
186 QQmlType type = QQmlMetaType::qmlType(typeName, version);
188 if (isCrashingType(type)) {
189 object =
new QObject;
190 }
else if (type.isValid()) {
191 if ( type.isComposite()) {
192 object = createComponent(type.sourceUrl(), context);
195 if (type.typeName() ==
"QQmlComponent") {
196 object =
new QQmlComponent(context->engine(),
nullptr);
198 object = type.create();
202 if (isWindow(object)) {
204 object = createDummyWindow(context->engine());
210 qWarning() <<
"QuickDesigner: Cannot create an object of type"
211 << QString::fromLatin1(
"%1 %2,%3").arg(typeName)
212 .arg(version.majorVersion()).arg(version.minorVersion())
213 <<
"- type isn't known to declarative meta type system";
216 tweakObjects(object);
218 if (object && QQmlEngine::contextForObject(object) ==
nullptr)
219 QQmlEngine::setContextForObject(object, context);
221 QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);
226QObject *QQuickDesignerSupportItems::createComponent(
const QUrl &componentUrl, QQmlContext *context)
228 ComponentCompleteDisabler disableComponentComplete;
229 Q_UNUSED(disableComponentComplete);
231 QQmlComponent component(context->engine(), componentUrl);
233 QObject *object = component.beginCreate(context);
234 tweakObjects(object);
235 component.completeCreate();
236 QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);
238 if (component.isError()) {
239 qWarning() <<
"Error in:" << Q_FUNC_INFO << componentUrl;
240 const auto errors = component.errors();
241 for (
const QQmlError &error : errors)
252void QQuickDesignerSupportItems::disableNativeTextRendering(QQuickItem *item)
254 QQuickText *text = qobject_cast<QQuickText*>(item);
256 text->setRenderType(QQuickText::QtRendering);
258 QQuickTextInput *textInput = qobject_cast<QQuickTextInput*>(item);
260 textInput->setRenderType(QQuickTextInput::QtRendering);
262 QQuickTextEdit *textEdit = qobject_cast<QQuickTextEdit*>(item);
264 textEdit->setRenderType(QQuickTextEdit::QtRendering);
267void QQuickDesignerSupportItems::disableTextCursor(QQuickItem *item)
269 const auto childItems = item->childItems();
270 for (QQuickItem *childItem : childItems)
271 disableTextCursor(childItem);
273 QQuickTextInput *textInput = qobject_cast<QQuickTextInput*>(item);
275 textInput->setCursorVisible(
false);
277 QQuickTextEdit *textEdit = qobject_cast<QQuickTextEdit*>(item);
279 textEdit->setCursorVisible(
false);
282void QQuickDesignerSupportItems::disableTransition(QObject *object)
284 QQuickTransition *transition = qobject_cast<QQuickTransition*>(object);
285 Q_ASSERT(transition);
286 const QString invalidState = QLatin1String(
"invalidState");
287 transition->setToState(invalidState);
288 transition->setFromState(invalidState);