diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureBrowserContextMenu.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureBrowserContextMenu.qml index 4ac0d72635f..4323998ee0f 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureBrowserContextMenu.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureBrowserContextMenu.qml @@ -16,6 +16,7 @@ StudioControls.Menu { { this.targetTexture = targetTexture materialBrowserTexturesModel.updateSceneEnvState() + materialBrowserTexturesModel.updateModelSelectionState() popup() } diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp index 571dfff1fb2..e3ed0870b22 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp @@ -316,4 +316,9 @@ void MaterialBrowserTexturesModel::applyAsLightProbe(qint64 internalId) } } +void MaterialBrowserTexturesModel::updateModelSelectionState() +{ + emit updateModelSelectionStateRequested(); +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h index 112a0ccbb82..c99d7511ea9 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h @@ -16,8 +16,7 @@ class MaterialBrowserTexturesModel : public QAbstractListModel Q_PROPERTY(bool isEmpty MEMBER m_isEmpty NOTIFY isEmptyChanged) Q_PROPERTY(int selectedIndex MEMBER m_selectedIndex NOTIFY selectedIndexChanged) - Q_PROPERTY(bool hasSingleModelSelection READ hasSingleModelSelection - WRITE setHasSingleModelSelection NOTIFY hasSingleModelSelectionChanged) + Q_PROPERTY(bool hasSingleModelSelection READ hasSingleModelSelection NOTIFY hasSingleModelSelectionChanged) Q_PROPERTY(bool hasSceneEnv READ hasSceneEnv NOTIFY hasSceneEnvChanged) public: @@ -60,6 +59,7 @@ public: Q_INVOKABLE void applyToSelectedModel(qint64 internalId); Q_INVOKABLE void openTextureEditor(); Q_INVOKABLE void updateSceneEnvState(); + Q_INVOKABLE void updateModelSelectionState(); Q_INVOKABLE void applyAsLightProbe(qint64 internalId); signals: @@ -71,6 +71,7 @@ signals: void applyToSelectedModelTriggered(const QmlDesigner::ModelNode &texture); void addNewTextureTriggered(); void updateSceneEnvStateRequested(); + void updateModelSelectionStateRequested(); void hasSceneEnvChanged(); void applyAsLightProbeRequested(const QmlDesigner::ModelNode &texture); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index 118c4ca3b91..be3a45ad2ab 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -193,6 +193,13 @@ WidgetInfo MaterialBrowserView::widgetInfo() m_widget->materialBrowserTexturesModel()->setHasSceneEnv(sceneEnvExists); }); + connect(texturesModel, &MaterialBrowserTexturesModel::updateModelSelectionStateRequested, this, [&]() { + bool hasModel = false; + if (m_selectedModels.size() == 1) + hasModel = getMaterialOfModel(m_selectedModels.at(0)).isValid(); + m_widget->materialBrowserTexturesModel()->setHasSingleModelSelection(hasModel); + }); + connect(texturesModel, &MaterialBrowserTexturesModel::applyAsLightProbeRequested, this, [&] (const ModelNode &texture) { executeInTransaction(__FUNCTION__, [&] { @@ -290,7 +297,6 @@ void MaterialBrowserView::selectedNodesChanged(const QList &selectedN }); m_widget->materialBrowserModel()->setHasModelSelection(!m_selectedModels.isEmpty()); - m_widget->materialBrowserTexturesModel()->setHasSingleModelSelection(m_selectedModels.size() == 1); // the logic below selects the material of the first selected model if auto selection is on if (!m_autoSelectModelMaterial) @@ -299,13 +305,8 @@ void MaterialBrowserView::selectedNodesChanged(const QList &selectedN if (selectedNodeList.size() > 1 || m_selectedModels.isEmpty()) return; - QmlObjectNode qmlObjNode(m_selectedModels.at(0)); - QString matExp = qmlObjNode.expression("materials"); - if (matExp.isEmpty()) - return; + ModelNode mat = getMaterialOfModel(m_selectedModels.at(0)); - QString matId = matExp.remove('[').remove(']').split(',', Qt::SkipEmptyParts).at(0); - ModelNode mat = modelNodeForId(matId); if (!mat.isValid()) return; @@ -435,6 +436,25 @@ void MaterialBrowserView::requestPreviews() m_previewRequests.clear(); } +ModelNode MaterialBrowserView::getMaterialOfModel(const ModelNode &model) +{ + QmlObjectNode qmlObjNode(model); + QString matExp = qmlObjNode.expression("materials"); + if (matExp.isEmpty()) + return {}; + + const QStringList mats = matExp.remove('[').remove(']').split(',', Qt::SkipEmptyParts); + if (mats.isEmpty()) + return {}; + + for (const auto &matId : mats) { + ModelNode mat = modelNodeForId(matId); + if (mat.isValid()) + return mat; + } + return {}; +} + void MaterialBrowserView::importsChanged([[maybe_unused]] const QList &addedImports, [[maybe_unused]] const QList &removedImports) { diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h index f2a64e945d0..b78d54e1660 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h @@ -70,6 +70,7 @@ private: void loadPropertyGroups(); void requestPreviews(); ModelNode resolveSceneEnv(); + ModelNode getMaterialOfModel(const ModelNode &model); AsynchronousImageCache &m_imageCache; QPointer m_widget;