QmlDesigner: Update material browser nodes on property changes

Binding property changes and removed properties are followed by a
preview request in Material Browser

Fixes: QDS-12987
Change-Id: I6e84ef6dad08653e7f611fc8ba36d29d87ee03b9
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Ali Kianian
2024-06-12 12:45:42 +03:00
parent 5084165703
commit 60afac7996
2 changed files with 37 additions and 16 deletions

View File

@@ -280,6 +280,29 @@ void MaterialBrowserView::updateMaterialsPreview()
m_previewTimer.start(0);
}
template<typename T, typename> // T can be either BindingProperty or VariantProperty
void MaterialBrowserView::updatePropertyList(const QList<T> &propertyList)
{
for (const AbstractProperty &property : propertyList) {
ModelNode node(property.parentModelNode());
if (isMaterial(node)) {
if (property.name() == "objectName")
m_widget->materialBrowserModel()->updateMaterialName(node);
else
m_previewRequests << node;
} else if (property.name() == "source") {
QmlObjectNode selectedTex = m_widget->materialBrowserTexturesModel()->selectedTexture();
if (isTexture(node))
m_widget->materialBrowserTexturesModel()->updateTextureSource(node);
else if (selectedTex.propertyChangeForCurrentState() == node)
m_widget->materialBrowserTexturesModel()->updateTextureSource(selectedTex);
}
}
if (!m_previewRequests.isEmpty())
m_previewTimer.start(0);
}
bool MaterialBrowserView::isMaterial(const ModelNode &node) const
{
return node.metaInfo().isQtQuick3DMaterial();
@@ -356,26 +379,18 @@ void MaterialBrowserView::nodeIdChanged(const ModelNode &node, [[maybe_unused]]
void MaterialBrowserView::variantPropertiesChanged(const QList<VariantProperty> &propertyList,
[[maybe_unused]] PropertyChangeFlags propertyChange)
{
for (const VariantProperty &property : propertyList) {
ModelNode node(property.parentModelNode());
if (isMaterial(node) && property.name() == "objectName") {
m_widget->materialBrowserModel()->updateMaterialName(node);
} else if (property.name() == "source") {
QmlObjectNode selectedTex = m_widget->materialBrowserTexturesModel()->selectedTexture();
if (isTexture(node))
m_widget->materialBrowserTexturesModel()->updateTextureSource(node);
else if (selectedTex.propertyChangeForCurrentState() == node)
m_widget->materialBrowserTexturesModel()->updateTextureSource(selectedTex);
}
}
updatePropertyList(propertyList);
}
void MaterialBrowserView::bindingPropertiesChanged(const QList<BindingProperty> &propertyList,
[[maybe_unused]] PropertyChangeFlags propertyChange)
{
updatePropertyList(propertyList);
}
void MaterialBrowserView::propertiesRemoved(const QList<AbstractProperty> &propertyList)
{
for (const AbstractProperty &prop : propertyList) {
if (isTexture(prop.parentModelNode()) && prop.name() == "source")
m_widget->materialBrowserTexturesModel()->updateTextureSource(prop.parentModelNode());
}
updatePropertyList(propertyList);
}
void MaterialBrowserView::nodeReparented(const ModelNode &node,

View File

@@ -39,6 +39,8 @@ public:
const QByteArray &requestId) override;
void nodeIdChanged(const ModelNode &node, const QString &newId, const QString &oldId) override;
void variantPropertiesChanged(const QList<VariantProperty> &propertyList, PropertyChangeFlags propertyChange) override;
void bindingPropertiesChanged(const QList<BindingProperty> &propertyList,
PropertyChangeFlags propertyChange) override;
void propertiesRemoved(const QList<AbstractProperty> &propertyList) override;
void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent,
const NodeAbstractProperty &oldPropertyParent,
@@ -72,6 +74,10 @@ private:
void active3DSceneChanged(qint32 sceneId);
void refreshModel(bool updateImages);
void updateMaterialsPreview();
template<typename T, typename = typename std::enable_if<std::is_base_of<AbstractProperty, T>::value>::type>
void updatePropertyList(const QList<T> &propertyList);
bool isMaterial(const ModelNode &node) const;
bool isTexture(const ModelNode &node) const;
void loadPropertyGroups();