forked from qt-creator/qt-creator
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user