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)
: 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<Import> &addedImports,
[[maybe_unused]] const QList<Import> &removedImports)
{
@@ -576,11 +590,27 @@ void MaterialBrowserView::instancesCompleted(const QVector<ModelNode> &completed
return;
const QList<ModelNode> 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<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

View File

@@ -7,6 +7,8 @@
#include "nodemetainfo.h"
#include <QPointer>
#include <QSet>
#include <QTimer>
namespace QmlDesigner {
@@ -41,6 +43,7 @@ public:
void customNotification(const AbstractView *view, const QString &identifier,
const QList<ModelNode> &nodeList, const QList<QVariant> &data) override;
void instancesCompleted(const QVector<ModelNode> &completedNodeList) override;
void instancePropertyChanged(const QList<QPair<ModelNode, PropertyName> > &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<MaterialBrowserWidget> m_widget;
QList<ModelNode> 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<ModelNode> m_previewRequests;
};
} // namespace QmlDesigner