QmlDesigner: Update material browser materials on state change

More generally, materials previews are now updated whenever the
instance values on them change.

Fixes: QDS-8096
Change-Id: I07dab4c9cefa241ca5f22e32e6a53e85c31aa252
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Miikka Heikkinen
2022-11-04 17:59:39 +02:00
parent e8899baa21
commit 9febccb2d7
2 changed files with 40 additions and 3 deletions

View File

@@ -38,7 +38,10 @@ namespace QmlDesigner {
MaterialBrowserView::MaterialBrowserView(ExternalDependenciesInterface &externalDependencies) MaterialBrowserView::MaterialBrowserView(ExternalDependenciesInterface &externalDependencies)
: AbstractView{externalDependencies} : AbstractView{externalDependencies}
{} {
m_previewTimer.setSingleShot(true);
connect(&m_previewTimer, &QTimer::timeout, this, &MaterialBrowserView::requestPreviews);
}
MaterialBrowserView::~MaterialBrowserView() MaterialBrowserView::~MaterialBrowserView()
{} {}
@@ -309,7 +312,9 @@ void MaterialBrowserView::refreshModel(bool updateImages)
if (updateImages) { if (updateImages) {
for (const ModelNode &node : std::as_const(materials)) 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 {}; 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<Import> &addedImports, void MaterialBrowserView::importsChanged([[maybe_unused]] const QList<Import> &addedImports,
[[maybe_unused]] const QList<Import> &removedImports) [[maybe_unused]] const QList<Import> &removedImports)
{ {
@@ -576,11 +590,27 @@ void MaterialBrowserView::instancesCompleted(const QVector<ModelNode> &completed
return; return;
const QList<ModelNode> materials = m_widget->materialBrowserModel()->materials(); const QList<ModelNode> materials = m_widget->materialBrowserModel()->materials();
for (const ModelNode &node : materials) for (const ModelNode &node : materials)
model()->nodeInstanceView()->previewImageDataForGenericNode(node, {}); m_previewRequests.insert(node);
if (!m_previewRequests.isEmpty())
m_previewTimer.start(0);
}); });
break; break;
} }
} }
} }
void MaterialBrowserView::instancePropertyChanged(const QList<QPair<ModelNode, PropertyName> > &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 } // namespace QmlDesigner

View File

@@ -7,6 +7,8 @@
#include "nodemetainfo.h" #include "nodemetainfo.h"
#include <QPointer> #include <QPointer>
#include <QSet>
#include <QTimer>
namespace QmlDesigner { namespace QmlDesigner {
@@ -41,6 +43,7 @@ public:
void customNotification(const AbstractView *view, const QString &identifier, void customNotification(const AbstractView *view, const QString &identifier,
const QList<ModelNode> &nodeList, const QList<QVariant> &data) override; const QList<ModelNode> &nodeList, const QList<QVariant> &data) override;
void instancesCompleted(const QVector<ModelNode> &completedNodeList) override; void instancesCompleted(const QVector<ModelNode> &completedNodeList) override;
void instancePropertyChanged(const QList<QPair<ModelNode, PropertyName> > &propertyList) override;
private: private:
void refreshModel(bool updateImages); void refreshModel(bool updateImages);
@@ -50,6 +53,7 @@ private:
void updateBundleMaterialsQuick3DVersion(); void updateBundleMaterialsQuick3DVersion();
void applyBundleMaterialToDropTarget(const ModelNode &bundleMat, const NodeMetaInfo &metaInfo = {}); void applyBundleMaterialToDropTarget(const ModelNode &bundleMat, const NodeMetaInfo &metaInfo = {});
ModelNode getBundleMaterialDefaultInstance(const TypeName &type); ModelNode getBundleMaterialDefaultInstance(const TypeName &type);
void requestPreviews();
QPointer<MaterialBrowserWidget> m_widget; QPointer<MaterialBrowserWidget> m_widget;
QList<ModelNode> m_bundleMaterialTargets; QList<ModelNode> m_bundleMaterialTargets;
@@ -61,6 +65,9 @@ private:
bool m_autoSelectModelMaterial = false; // TODO: wire this to some action bool m_autoSelectModelMaterial = false; // TODO: wire this to some action
bool m_puppetResetPending = false; bool m_puppetResetPending = false;
bool m_propertyGroupsLoaded = false; bool m_propertyGroupsLoaded = false;
QTimer m_previewTimer;
QSet<ModelNode> m_previewRequests;
}; };
} // namespace QmlDesigner } // namespace QmlDesigner