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)
|
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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user