QmlDesigner: Reset puppet on repeater model change when necessary

This is a workaround for Qt bugs QTBUG-97583 and QTBUG-97586.

Fixes: QDS-5235
Change-Id: I37de4829fea63b0c488815975ae2dd58ceb36b71
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Samuel Ghinet <samuel.ghinet@qt.io>
This commit is contained in:
Miikka Heikkinen
2021-10-18 16:14:28 +03:00
parent 53714b2b1d
commit 41f96fe05b
2 changed files with 32 additions and 10 deletions

View File

@@ -225,6 +225,8 @@ private: // functions
void updateWatcher(const QString &path); void updateWatcher(const QString &path);
void updateRotationBlocks(); void updateRotationBlocks();
void maybeResetOnPropertyChange(const PropertyName &name, const ModelNode &node,
PropertyChangeFlags flags);
private: private:
QHash<QString, ModelNodePreviewImageData> m_imageDataMap; QHash<QString, ModelNodePreviewImageData> m_imageDataMap;

View File

@@ -473,8 +473,9 @@ void NodeInstanceView::propertiesAboutToBeRemoved(const QList<AbstractProperty>&
resetVerticalAnchors(property.parentModelNode()); resetVerticalAnchors(property.parentModelNode());
} else if (name == "anchors.baseline") { } else if (name == "anchors.baseline") {
resetVerticalAnchors(property.parentModelNode()); resetVerticalAnchors(property.parentModelNode());
} else if (name == "shader" && property.parentModelNode().isSubclassOf("QtQuick3D.Shader")) { } else {
m_resetTimer.start(); maybeResetOnPropertyChange(name, property.parentModelNode(),
AbstractView::EmptyPropertiesRemoved);
} }
} }
@@ -503,10 +504,14 @@ void NodeInstanceView::nodeTypeChanged(const ModelNode &, const TypeName &, int,
restartProcess(); restartProcess();
} }
void NodeInstanceView::bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags /*propertyChange*/) void NodeInstanceView::bindingPropertiesChanged(const QList<BindingProperty>& propertyList,
PropertyChangeFlags propertyChange)
{ {
QTC_ASSERT(m_nodeInstanceServer, return); QTC_ASSERT(m_nodeInstanceServer, return);
m_nodeInstanceServer->changePropertyBindings(createChangeBindingCommand(propertyList)); m_nodeInstanceServer->changePropertyBindings(createChangeBindingCommand(propertyList));
for (const auto &property : propertyList)
maybeResetOnPropertyChange(property.name(), property.parentModelNode(), propertyChange);
} }
/*! /*!
@@ -518,18 +523,15 @@ void NodeInstanceView::bindingPropertiesChanged(const QList<BindingProperty>& pr
\sa AbstractProperty, NodeInstance, ModelNode \sa AbstractProperty, NodeInstance, ModelNode
*/ */
void NodeInstanceView::variantPropertiesChanged(const QList<VariantProperty>& propertyList, PropertyChangeFlags /*propertyChange*/) void NodeInstanceView::variantPropertiesChanged(const QList<VariantProperty>& propertyList,
PropertyChangeFlags propertyChange)
{ {
QTC_ASSERT(m_nodeInstanceServer, return); QTC_ASSERT(m_nodeInstanceServer, return);
updatePosition(propertyList); updatePosition(propertyList);
m_nodeInstanceServer->changePropertyValues(createChangeValueCommand(propertyList)); m_nodeInstanceServer->changePropertyValues(createChangeValueCommand(propertyList));
for (const auto &property : propertyList) { for (const auto &property : propertyList)
if (property.name() == "shader" && property.parentModelNode().isSubclassOf("QtQuick3D.Shader")) { maybeResetOnPropertyChange(property.name(), property.parentModelNode(), propertyChange);
m_resetTimer.start();
break;
}
}
} }
/*! /*!
Notifies the view that the property parent of the model node \a node has Notifies the view that the property parent of the model node \a node has
@@ -1908,4 +1910,22 @@ void NodeInstanceView::updateRotationBlocks()
} }
} }
void NodeInstanceView::maybeResetOnPropertyChange(const PropertyName &name, const ModelNode &node,
PropertyChangeFlags flags)
{
bool reset = false;
if (flags & AbstractView::PropertiesAdded
&& name == "model" && (node.isSubclassOf("QtQuick.Repeater")
|| node.isSubclassOf("QtQuick3D.Repeater3D"))) {
// TODO: This is a workaround for QTBUG-97583 (2D) and QTBUG-97586 (3D):
// Reset puppet when repeater model is first added, if there is already a delegate
if (node.hasProperty("delegate"))
reset = true;
} else if (name == "shader" && node.isSubclassOf("QtQuick3D.Shader")) {
reset = true;
}
if (reset)
resetPuppet();
}
} }