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