QmlDesigner: Handle texture changes on material editor view

Fixes: QDS-12996
Change-Id: I148abcb435e95dc4deeead0f02aa8f1ca95bc600
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Ali Kianian
2024-06-14 14:00:13 +03:00
parent fe1d996b93
commit 0ca93004ed
8 changed files with 66 additions and 2 deletions

View File

@@ -178,6 +178,11 @@ void MaterialEditorQmlBackend::updateMaterialPreview(const QPixmap &pixmap)
QMetaObject::invokeMethod(m_quickWidget->rootObject(), "refreshPreview"); QMetaObject::invokeMethod(m_quickWidget->rootObject(), "refreshPreview");
} }
void MaterialEditorQmlBackend::refreshBackendModel()
{
m_backendModelNode.refresh();
}
DesignerPropertyMap &MaterialEditorQmlBackend::backendValuesPropertyMap() DesignerPropertyMap &MaterialEditorQmlBackend::backendValuesPropertyMap()
{ {
return m_backendValuesPropertyMap; return m_backendValuesPropertyMap;

View File

@@ -44,6 +44,7 @@ public:
void setSource(const QUrl &url); void setSource(const QUrl &url);
QmlAnchorBindingProxy &backendAnchorBinding(); QmlAnchorBindingProxy &backendAnchorBinding();
void updateMaterialPreview(const QPixmap &pixmap); void updateMaterialPreview(const QPixmap &pixmap);
void refreshBackendModel();
DesignerPropertyMap &backendValuesPropertyMap(); DesignerPropertyMap &backendValuesPropertyMap();
MaterialEditorTransaction *materialEditorTransaction() const; MaterialEditorTransaction *materialEditorTransaction() const;

View File

@@ -44,6 +44,19 @@ namespace QmlDesigner {
static const char MATERIAL_EDITOR_IMAGE_REQUEST_ID[] = "MaterialEditor"; static const char MATERIAL_EDITOR_IMAGE_REQUEST_ID[] = "MaterialEditor";
static bool containsTexture(const ModelNode &node)
{
if (node.metaInfo().isQtQuick3DTexture())
return true;
const ModelNodes children = node.allSubModelNodes();
for (const ModelNode &child : children) {
if (child.metaInfo().isQtQuick3DTexture())
return true;
}
return false;
};
MaterialEditorView::MaterialEditorView(ExternalDependenciesInterface &externalDependencies) MaterialEditorView::MaterialEditorView(ExternalDependenciesInterface &externalDependencies)
: AbstractView{externalDependencies} : AbstractView{externalDependencies}
, m_stackedWidget(new QStackedWidget) , m_stackedWidget(new QStackedWidget)
@@ -1110,12 +1123,34 @@ void MaterialEditorView::nodeReparented(const ModelNode &node,
{ {
if (node.id() == Constants::MATERIAL_LIB_ID && m_qmlBackEnd && m_qmlBackEnd->contextObject()) if (node.id() == Constants::MATERIAL_LIB_ID && m_qmlBackEnd && m_qmlBackEnd->contextObject())
m_qmlBackEnd->contextObject()->setHasMaterialLibrary(true); m_qmlBackEnd->contextObject()->setHasMaterialLibrary(true);
else if (m_qmlBackEnd && containsTexture(node))
m_qmlBackEnd->refreshBackendModel();
}
void MaterialEditorView::nodeIdChanged(const ModelNode &node,
[[maybe_unused]] const QString &newId,
[[maybe_unused]] const QString &oldId)
{
if (m_qmlBackEnd && node.metaInfo().isQtQuick3DTexture())
m_qmlBackEnd->refreshBackendModel();
} }
void MaterialEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode) void MaterialEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode)
{ {
if (removedNode.id() == Constants::MATERIAL_LIB_ID && m_qmlBackEnd && m_qmlBackEnd->contextObject()) if (removedNode.id() == Constants::MATERIAL_LIB_ID && m_qmlBackEnd && m_qmlBackEnd->contextObject())
m_qmlBackEnd->contextObject()->setHasMaterialLibrary(false); m_qmlBackEnd->contextObject()->setHasMaterialLibrary(false);
else if (containsTexture(removedNode))
m_textureAboutToBeRemoved = true;
}
void MaterialEditorView::nodeRemoved([[maybe_unused]] const ModelNode &removedNode,
[[maybe_unused]] const NodeAbstractProperty &parentProperty,
[[maybe_unused]] PropertyChangeFlags propertyChange)
{
if (m_qmlBackEnd && m_textureAboutToBeRemoved)
m_qmlBackEnd->refreshBackendModel();
m_textureAboutToBeRemoved = false;
} }
void QmlDesigner::MaterialEditorView::highlightSupportedProperties(bool highlight) void QmlDesigner::MaterialEditorView::highlightSupportedProperties(bool highlight)

View File

@@ -61,10 +61,17 @@ public:
void importsChanged(const Imports &addedImports, const Imports &removedImports) override; void importsChanged(const Imports &addedImports, const Imports &removedImports) override;
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 nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent,
void nodeReparented(const ModelNode &node,
const NodeAbstractProperty &newPropertyParent,
const NodeAbstractProperty &oldPropertyParent, const NodeAbstractProperty &oldPropertyParent,
AbstractView::PropertyChangeFlags propertyChange) override; AbstractView::PropertyChangeFlags propertyChange) override;
void nodeIdChanged(const ModelNode &node, const QString &newId, const QString &oldId) override;
void nodeAboutToBeRemoved(const ModelNode &removedNode) override; void nodeAboutToBeRemoved(const ModelNode &removedNode) override;
void nodeRemoved(const ModelNode &removedNode,
const NodeAbstractProperty &parentProperty,
PropertyChangeFlags propertyChange) override;
void dragStarted(QMimeData *mimeData) override; void dragStarted(QMimeData *mimeData) override;
void dragEnded() override; void dragEnded() override;
@@ -128,6 +135,7 @@ private:
bool m_hasQuick3DImport = false; bool m_hasQuick3DImport = false;
bool m_hasMaterialRoot = false; bool m_hasMaterialRoot = false;
bool m_initializingPreviewData = false; bool m_initializingPreviewData = false;
bool m_textureAboutToBeRemoved = false;
QSize m_previewSize; QSize m_previewSize;
QByteArray m_previewRequestId; QByteArray m_previewRequestId;

View File

@@ -28,9 +28,16 @@ void ItemFilterModel::setModelNodeBackend(const QVariant &modelNodeBackend)
const auto backendObjectCasted = const auto backendObjectCasted =
qobject_cast<const QmlModelNodeProxy *>(modelNodeBackendObject); qobject_cast<const QmlModelNodeProxy *>(modelNodeBackendObject);
if (backendObjectCasted) disconnect(m_updateConnection);
if (backendObjectCasted) {
m_modelNode = backendObjectCasted->qmlObjectNode().modelNode(); m_modelNode = backendObjectCasted->qmlObjectNode().modelNode();
m_updateConnection = connect(backendObjectCasted,
&QmlModelNodeProxy::refreshRequired,
this,
&ItemFilterModel::setupModel);
}
setupModel(); setupModel();
emit modelNodeBackendChanged(); emit modelNodeBackendChanged();
} }

View File

@@ -71,6 +71,7 @@ private:
QString m_typeFilter; QString m_typeFilter;
QList<qint32> m_modelInternalIds; QList<qint32> m_modelInternalIds;
QmlDesigner::ModelNode m_modelNode; QmlDesigner::ModelNode m_modelNode;
QMetaObject::Connection m_updateConnection;
bool m_selectionOnly; bool m_selectionOnly;
QStringList m_selectedItems; QStringList m_selectedItems;

View File

@@ -46,6 +46,11 @@ void QmlModelNodeProxy::emitSelectionChanged()
emit selectionChanged(); emit selectionChanged();
} }
void QmlModelNodeProxy::refresh()
{
emit refreshRequired();
}
QmlObjectNode QmlModelNodeProxy::qmlObjectNode() const QmlObjectNode QmlModelNodeProxy::qmlObjectNode() const
{ {
return m_qmlObjectNode; return m_qmlObjectNode;

View File

@@ -28,6 +28,7 @@ public:
void emitSelectionToBeChanged(); void emitSelectionToBeChanged();
void emitSelectionChanged(); void emitSelectionChanged();
void refresh();
QmlObjectNode qmlObjectNode() const; QmlObjectNode qmlObjectNode() const;
@@ -70,6 +71,7 @@ signals:
void modelNodeChanged(); void modelNodeChanged();
void selectionToBeChanged(); void selectionToBeChanged();
void selectionChanged(); void selectionChanged();
void refreshRequired();
private: private:
QList<int> allChildren(const ModelNode &modelNode) const; QList<int> allChildren(const ModelNode &modelNode) const;