diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index 7a320fb7b37..2a7b6833b3e 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -38,7 +38,10 @@ namespace QmlDesigner { MaterialBrowserView::MaterialBrowserView(ExternalDependenciesInterface &externalDependencies) : AbstractView{externalDependencies} -{} +{ + m_previewTimer.setSingleShot(true); + connect(&m_previewTimer, &QTimer::timeout, this, &MaterialBrowserView::requestPreviews); +} MaterialBrowserView::~MaterialBrowserView() {} @@ -309,7 +312,9 @@ void MaterialBrowserView::refreshModel(bool updateImages) if (updateImages) { for (const ModelNode &node : std::as_const(materials)) - model()->nodeInstanceView()->previewImageDataForGenericNode(node, {}); + m_previewRequests.insert(node); + if (!m_previewRequests.isEmpty()) + m_previewTimer.start(0); } } @@ -516,6 +521,15 @@ ModelNode MaterialBrowserView::getBundleMaterialDefaultInstance(const TypeName & return {}; } +void MaterialBrowserView::requestPreviews() +{ + if (model() && model()->nodeInstanceView()) { + for (const auto &node : std::as_const(m_previewRequests)) + model()->nodeInstanceView()->previewImageDataForGenericNode(node, {}); + } + m_previewRequests.clear(); +} + void MaterialBrowserView::importsChanged([[maybe_unused]] const QList &addedImports, [[maybe_unused]] const QList &removedImports) { @@ -576,11 +590,27 @@ void MaterialBrowserView::instancesCompleted(const QVector &completed return; const QList materials = m_widget->materialBrowserModel()->materials(); for (const ModelNode &node : materials) - model()->nodeInstanceView()->previewImageDataForGenericNode(node, {}); + m_previewRequests.insert(node); + if (!m_previewRequests.isEmpty()) + m_previewTimer.start(0); }); break; } } } +void MaterialBrowserView::instancePropertyChanged(const QList > &propertyList) +{ + for (const auto &nodeProp : propertyList) { + ModelNode node = nodeProp.first; + if (node.metaInfo().isQtQuick3DMaterial()) + m_previewRequests.insert(node); + } + if (!m_previewRequests.isEmpty() && !m_previewTimer.isActive()) { + // Updating material browser isn't urgent in e.g. timeline scrubbing case, so have a bit + // of delay to reduce unnecessary rendering + m_previewTimer.start(500); + } +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h index ad50bfa463a..a8bcf5f2f1f 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h @@ -7,6 +7,8 @@ #include "nodemetainfo.h" #include +#include +#include namespace QmlDesigner { @@ -41,6 +43,7 @@ public: void customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data) override; void instancesCompleted(const QVector &completedNodeList) override; + void instancePropertyChanged(const QList > &propertyList) override; private: void refreshModel(bool updateImages); @@ -50,6 +53,7 @@ private: void updateBundleMaterialsQuick3DVersion(); void applyBundleMaterialToDropTarget(const ModelNode &bundleMat, const NodeMetaInfo &metaInfo = {}); ModelNode getBundleMaterialDefaultInstance(const TypeName &type); + void requestPreviews(); QPointer m_widget; QList m_bundleMaterialTargets; @@ -61,6 +65,9 @@ private: bool m_autoSelectModelMaterial = false; // TODO: wire this to some action bool m_puppetResetPending = false; bool m_propertyGroupsLoaded = false; + + QTimer m_previewTimer; + QSet m_previewRequests; }; } // namespace QmlDesigner