QmlDesigner: Disable 'add to selected model' option when it's not valid

MaterialBrowserTexturesModel's hasSingleModelSelection property value
is now updated at context menu open, as that's the only place using it.
This is similar to how hasSceneEnv is handled.

Fixes: QDS-8582
Change-Id: I63871a5557c90a06633eee52840b267d808bfe27
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Miikka Heikkinen
2022-12-12 14:13:31 +02:00
parent c2f8677e9f
commit 56e242c9f9
5 changed files with 37 additions and 9 deletions

View File

@@ -16,6 +16,7 @@ StudioControls.Menu {
{ {
this.targetTexture = targetTexture this.targetTexture = targetTexture
materialBrowserTexturesModel.updateSceneEnvState() materialBrowserTexturesModel.updateSceneEnvState()
materialBrowserTexturesModel.updateModelSelectionState()
popup() popup()
} }

View File

@@ -316,4 +316,9 @@ void MaterialBrowserTexturesModel::applyAsLightProbe(qint64 internalId)
} }
} }
void MaterialBrowserTexturesModel::updateModelSelectionState()
{
emit updateModelSelectionStateRequested();
}
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -16,8 +16,7 @@ class MaterialBrowserTexturesModel : public QAbstractListModel
Q_PROPERTY(bool isEmpty MEMBER m_isEmpty NOTIFY isEmptyChanged) Q_PROPERTY(bool isEmpty MEMBER m_isEmpty NOTIFY isEmptyChanged)
Q_PROPERTY(int selectedIndex MEMBER m_selectedIndex NOTIFY selectedIndexChanged) Q_PROPERTY(int selectedIndex MEMBER m_selectedIndex NOTIFY selectedIndexChanged)
Q_PROPERTY(bool hasSingleModelSelection READ hasSingleModelSelection Q_PROPERTY(bool hasSingleModelSelection READ hasSingleModelSelection NOTIFY hasSingleModelSelectionChanged)
WRITE setHasSingleModelSelection NOTIFY hasSingleModelSelectionChanged)
Q_PROPERTY(bool hasSceneEnv READ hasSceneEnv NOTIFY hasSceneEnvChanged) Q_PROPERTY(bool hasSceneEnv READ hasSceneEnv NOTIFY hasSceneEnvChanged)
public: public:
@@ -60,6 +59,7 @@ public:
Q_INVOKABLE void applyToSelectedModel(qint64 internalId); Q_INVOKABLE void applyToSelectedModel(qint64 internalId);
Q_INVOKABLE void openTextureEditor(); Q_INVOKABLE void openTextureEditor();
Q_INVOKABLE void updateSceneEnvState(); Q_INVOKABLE void updateSceneEnvState();
Q_INVOKABLE void updateModelSelectionState();
Q_INVOKABLE void applyAsLightProbe(qint64 internalId); Q_INVOKABLE void applyAsLightProbe(qint64 internalId);
signals: signals:
@@ -71,6 +71,7 @@ signals:
void applyToSelectedModelTriggered(const QmlDesigner::ModelNode &texture); void applyToSelectedModelTriggered(const QmlDesigner::ModelNode &texture);
void addNewTextureTriggered(); void addNewTextureTriggered();
void updateSceneEnvStateRequested(); void updateSceneEnvStateRequested();
void updateModelSelectionStateRequested();
void hasSceneEnvChanged(); void hasSceneEnvChanged();
void applyAsLightProbeRequested(const QmlDesigner::ModelNode &texture); void applyAsLightProbeRequested(const QmlDesigner::ModelNode &texture);

View File

@@ -193,6 +193,13 @@ WidgetInfo MaterialBrowserView::widgetInfo()
m_widget->materialBrowserTexturesModel()->setHasSceneEnv(sceneEnvExists); 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, connect(texturesModel, &MaterialBrowserTexturesModel::applyAsLightProbeRequested, this,
[&] (const ModelNode &texture) { [&] (const ModelNode &texture) {
executeInTransaction(__FUNCTION__, [&] { executeInTransaction(__FUNCTION__, [&] {
@@ -290,7 +297,6 @@ void MaterialBrowserView::selectedNodesChanged(const QList<ModelNode> &selectedN
}); });
m_widget->materialBrowserModel()->setHasModelSelection(!m_selectedModels.isEmpty()); 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 // the logic below selects the material of the first selected model if auto selection is on
if (!m_autoSelectModelMaterial) if (!m_autoSelectModelMaterial)
@@ -299,13 +305,8 @@ void MaterialBrowserView::selectedNodesChanged(const QList<ModelNode> &selectedN
if (selectedNodeList.size() > 1 || m_selectedModels.isEmpty()) if (selectedNodeList.size() > 1 || m_selectedModels.isEmpty())
return; return;
QmlObjectNode qmlObjNode(m_selectedModels.at(0)); ModelNode mat = getMaterialOfModel(m_selectedModels.at(0));
QString matExp = qmlObjNode.expression("materials");
if (matExp.isEmpty())
return;
QString matId = matExp.remove('[').remove(']').split(',', Qt::SkipEmptyParts).at(0);
ModelNode mat = modelNodeForId(matId);
if (!mat.isValid()) if (!mat.isValid())
return; return;
@@ -435,6 +436,25 @@ void MaterialBrowserView::requestPreviews()
m_previewRequests.clear(); 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<Import> &addedImports, void MaterialBrowserView::importsChanged([[maybe_unused]] const QList<Import> &addedImports,
[[maybe_unused]] const QList<Import> &removedImports) [[maybe_unused]] const QList<Import> &removedImports)
{ {

View File

@@ -70,6 +70,7 @@ private:
void loadPropertyGroups(); void loadPropertyGroups();
void requestPreviews(); void requestPreviews();
ModelNode resolveSceneEnv(); ModelNode resolveSceneEnv();
ModelNode getMaterialOfModel(const ModelNode &model);
AsynchronousImageCache &m_imageCache; AsynchronousImageCache &m_imageCache;
QPointer<MaterialBrowserWidget> m_widget; QPointer<MaterialBrowserWidget> m_widget;