diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp index 4d97de19a88..8ed07603af1 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp @@ -178,6 +178,11 @@ void MaterialEditorQmlBackend::updateMaterialPreview(const QPixmap &pixmap) QMetaObject::invokeMethod(m_quickWidget->rootObject(), "refreshPreview"); } +void MaterialEditorQmlBackend::refreshBackendModel() +{ + m_backendModelNode.refresh(); +} + DesignerPropertyMap &MaterialEditorQmlBackend::backendValuesPropertyMap() { return m_backendValuesPropertyMap; diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.h b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.h index 9fd5fc23992..925b1bd92ca 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.h +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.h @@ -44,6 +44,7 @@ public: void setSource(const QUrl &url); QmlAnchorBindingProxy &backendAnchorBinding(); void updateMaterialPreview(const QPixmap &pixmap); + void refreshBackendModel(); DesignerPropertyMap &backendValuesPropertyMap(); MaterialEditorTransaction *materialEditorTransaction() const; diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index f24bda1068a..373d85053d5 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -44,6 +44,19 @@ namespace QmlDesigner { static const char MATERIAL_EDITOR_IMAGE_REQUEST_ID[] = "MaterialEditor"; +static bool containsTexture(const ModelNode &node) +{ + if (node.metaInfo().isQtQuick3DTexture()) + return true; + + const ModelNodes children = node.allSubModelNodes(); + for (const ModelNode &child : children) { + if (child.metaInfo().isQtQuick3DTexture()) + return true; + } + return false; +}; + MaterialEditorView::MaterialEditorView(ExternalDependenciesInterface &externalDependencies) : AbstractView{externalDependencies} , m_stackedWidget(new QStackedWidget) @@ -1110,12 +1123,34 @@ void MaterialEditorView::nodeReparented(const ModelNode &node, { if (node.id() == Constants::MATERIAL_LIB_ID && m_qmlBackEnd && m_qmlBackEnd->contextObject()) m_qmlBackEnd->contextObject()->setHasMaterialLibrary(true); + else if (m_qmlBackEnd && containsTexture(node)) + m_qmlBackEnd->refreshBackendModel(); +} + +void MaterialEditorView::nodeIdChanged(const ModelNode &node, + [[maybe_unused]] const QString &newId, + [[maybe_unused]] const QString &oldId) +{ + if (m_qmlBackEnd && node.metaInfo().isQtQuick3DTexture()) + m_qmlBackEnd->refreshBackendModel(); } void MaterialEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode) { if (removedNode.id() == Constants::MATERIAL_LIB_ID && m_qmlBackEnd && m_qmlBackEnd->contextObject()) m_qmlBackEnd->contextObject()->setHasMaterialLibrary(false); + else if (containsTexture(removedNode)) + m_textureAboutToBeRemoved = true; +} + +void MaterialEditorView::nodeRemoved([[maybe_unused]] const ModelNode &removedNode, + [[maybe_unused]] const NodeAbstractProperty &parentProperty, + [[maybe_unused]] PropertyChangeFlags propertyChange) +{ + if (m_qmlBackEnd && m_textureAboutToBeRemoved) + m_qmlBackEnd->refreshBackendModel(); + + m_textureAboutToBeRemoved = false; } void QmlDesigner::MaterialEditorView::highlightSupportedProperties(bool highlight) diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h index e35e90861bb..53ab58c6881 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h @@ -61,10 +61,17 @@ public: void importsChanged(const Imports &addedImports, const Imports &removedImports) override; void customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data) override; - void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, + + void nodeReparented(const ModelNode &node, + const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange) override; + + void nodeIdChanged(const ModelNode &node, const QString &newId, const QString &oldId) override; void nodeAboutToBeRemoved(const ModelNode &removedNode) override; + void nodeRemoved(const ModelNode &removedNode, + const NodeAbstractProperty &parentProperty, + PropertyChangeFlags propertyChange) override; void dragStarted(QMimeData *mimeData) override; void dragEnded() override; @@ -128,6 +135,7 @@ private: bool m_hasQuick3DImport = false; bool m_hasMaterialRoot = false; bool m_initializingPreviewData = false; + bool m_textureAboutToBeRemoved = false; QSize m_previewSize; QByteArray m_previewRequestId; diff --git a/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.cpp index aa1d41888b6..38acbafa9cb 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.cpp @@ -28,9 +28,16 @@ void ItemFilterModel::setModelNodeBackend(const QVariant &modelNodeBackend) const auto backendObjectCasted = qobject_cast(modelNodeBackendObject); - if (backendObjectCasted) + disconnect(m_updateConnection); + if (backendObjectCasted) { m_modelNode = backendObjectCasted->qmlObjectNode().modelNode(); + m_updateConnection = connect(backendObjectCasted, + &QmlModelNodeProxy::refreshRequired, + this, + &ItemFilterModel::setupModel); + } + setupModel(); emit modelNodeBackendChanged(); } diff --git a/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.h b/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.h index eaf23820d4f..4bd45601a27 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.h +++ b/src/plugins/qmldesigner/components/propertyeditor/itemfiltermodel.h @@ -71,6 +71,7 @@ private: QString m_typeFilter; QList m_modelInternalIds; QmlDesigner::ModelNode m_modelNode; + QMetaObject::Connection m_updateConnection; bool m_selectionOnly; QStringList m_selectedItems; diff --git a/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.cpp b/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.cpp index 1cff0e55e68..9a889ffb00c 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.cpp @@ -46,6 +46,11 @@ void QmlModelNodeProxy::emitSelectionChanged() emit selectionChanged(); } +void QmlModelNodeProxy::refresh() +{ + emit refreshRequired(); +} + QmlObjectNode QmlModelNodeProxy::qmlObjectNode() const { return m_qmlObjectNode; diff --git a/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.h b/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.h index d8a49d7e100..9b5c0203345 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.h +++ b/src/plugins/qmldesigner/components/propertyeditor/qmlmodelnodeproxy.h @@ -28,6 +28,7 @@ public: void emitSelectionToBeChanged(); void emitSelectionChanged(); + void refresh(); QmlObjectNode qmlObjectNode() const; @@ -70,6 +71,7 @@ signals: void modelNodeChanged(); void selectionToBeChanged(); void selectionChanged(); + void refreshRequired(); private: QList allChildren(const ModelNode &modelNode) const;