diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2022-06-16 15:30:25 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2022-06-16 13:54:41 +0000 |
commit | 221376aa3823df2d36dedaf2e1ab97231c0ffbde (patch) | |
tree | 569598a4be91b04a7752f72e271e36a610822703 | |
parent | 9c3636af497f8bdb2745bf85cc0286c9c6675987 (diff) | |
download | qt-creator-221376aa3823df2d36dedaf2e1ab97231c0ffbde.tar.gz |
QmlDesigner: Reset puppet when material is added
This is workaround for material rendering issues in quick3d when a
material is shared by multiple windows.
Fixes: QDS-7096
Fixes: QDS-7118
Change-Id: I64fe2e51c5dda8e238502e5d926b6938b7b0731a
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
4 files changed, 26 insertions, 8 deletions
diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp index d0420163c3..49f313534d 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp @@ -120,6 +120,11 @@ void MaterialBrowserModel::setHasModelSelection(bool b) emit hasModelSelectionChanged(); } +QList<ModelNode> MaterialBrowserModel::materials() const +{ + return m_materialList; +} + void MaterialBrowserModel::setSearchText(const QString &searchText) { QString lowerSearchText = searchText.toLower(); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h index 32db357cae..73e6b2f99c 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h @@ -58,6 +58,7 @@ public: bool hasModelSelection() const; void setHasModelSelection(bool b); + QList<ModelNode> materials() const; void setMaterials(const QList<ModelNode> &materials, bool hasQuick3DImport); void removeMaterial(const ModelNode &material); void updateMaterialName(const ModelNode &material); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index 9d6072856e..1af67d4fef 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -97,10 +97,12 @@ void MaterialBrowserView::modelAttached(Model *model) m_widget->clearSearchFilter(); m_hasQuick3DImport = model->hasImport("QtQuick3D"); - QTimer::singleShot(0, this, &MaterialBrowserView::refreshModel); + QTimer::singleShot(0, this, [this]() { + refreshModel(true); + }); } -void MaterialBrowserView::refreshModel() +void MaterialBrowserView::refreshModel(bool updateImages) { ModelNode matLib = modelNodeForId(Constants::MATERIAL_LIB_ID); QList <ModelNode> materials; @@ -115,8 +117,10 @@ void MaterialBrowserView::refreshModel() m_widget->materialBrowserModel()->setMaterials(materials, m_hasQuick3DImport); - for (const ModelNode &node : std::as_const(materials)) - model()->nodeInstanceView()->previewImageDataForGenericNode(node, {}); + if (updateImages) { + for (const ModelNode &node : std::as_const(materials)) + model()->nodeInstanceView()->previewImageDataForGenericNode(node, {}); + } } bool MaterialBrowserView::isMaterial(const ModelNode &node) const @@ -204,8 +208,9 @@ void MaterialBrowserView::nodeReparented(const ModelNode &node, bool matRemoved = oldParentNode.isValid() && oldParentNode.id() == Constants::MATERIAL_LIB_ID; if (matAdded || matRemoved) { - refreshModel(); - + if (matAdded) // Workaround to fix various material issues all likely caused by QTBUG-103316 + resetPuppet(); + refreshModel(!matAdded); int idx = m_widget->materialBrowserModel()->materialIndex(node); m_widget->materialBrowserModel()->selectMaterial(idx); } @@ -252,7 +257,7 @@ void MaterialBrowserView::importsChanged(const QList<Import> &addedImports, cons return; m_hasQuick3DImport = hasQuick3DImport; - refreshModel(); + refreshModel(true); } void MaterialBrowserView::customNotification(const AbstractView *view, const QString &identifier, @@ -267,6 +272,13 @@ void MaterialBrowserView::customNotification(const AbstractView *view, const QSt int idx = m_widget->materialBrowserModel()->materialIndex(nodeList.first()); if (idx != -1) m_widget->materialBrowserModel()->selectMaterial(idx); + } else if (identifier == "reset QmlPuppet") { + // Little delay is needed to allow puppet reset to actually be done, as it is async as well + QTimer::singleShot(200, this, [this]() { + const QList<ModelNode> materials = m_widget->materialBrowserModel()->materials(); + for (const ModelNode &node : materials) + model()->nodeInstanceView()->previewImageDataForGenericNode(node, {}); + }); } } diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h index e140eede13..c637efa49e 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h @@ -62,7 +62,7 @@ public: const QList<ModelNode> &nodeList, const QList<QVariant> &data) override; private: - void refreshModel(); + void refreshModel(bool updateImages); bool isMaterial(const ModelNode &node) const; QPointer<MaterialBrowserWidget> m_widget; |