QmlDesigner: Disable apply material to selected when no selection exist

When there is no valid model selected, disable the "apply to selected"
actions in the material editor and browser.

Change-Id: Id8e771c64e69c0ba2f42dff01d19ffbf4afafb77
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Mahmoud Badri
2022-05-24 14:14:14 +03:00
parent c5818fc844
commit 71e553f497
8 changed files with 52 additions and 12 deletions

View File

@@ -92,13 +92,13 @@ Item {
StudioControls.MenuItem { StudioControls.MenuItem {
text: qsTr("Apply to selected (replace)") text: qsTr("Apply to selected (replace)")
enabled: currentMaterial enabled: currentMaterial && materialBrowserModel.hasModelSelection
onTriggered: materialBrowserModel.applyToSelected(currentMaterial.materialInternalId, false) onTriggered: materialBrowserModel.applyToSelected(currentMaterial.materialInternalId, false)
} }
StudioControls.MenuItem { StudioControls.MenuItem {
text: qsTr("Apply to selected (add)") text: qsTr("Apply to selected (add)")
enabled: currentMaterial enabled: currentMaterial && materialBrowserModel.hasModelSelection
onTriggered: materialBrowserModel.applyToSelected(currentMaterial.materialInternalId, true) onTriggered: materialBrowserModel.applyToSelected(currentMaterial.materialInternalId, true)
} }

View File

@@ -50,7 +50,7 @@ Rectangle {
normalColor: "transparent" normalColor: "transparent"
iconSize: StudioTheme.Values.bigIconFontSize iconSize: StudioTheme.Values.bigIconFontSize
buttonSize: root.height buttonSize: root.height
enabled: hasMaterial && hasQuick3DImport enabled: hasMaterial && hasModelSelection && hasQuick3DImport
onClicked: root.toolBarAction(ToolBarAction.ApplyToSelected) onClicked: root.toolBarAction(ToolBarAction.ApplyToSelected)
tooltip: qsTr("Apply material to selected model.") tooltip: qsTr("Apply material to selected model.")
} }

View File

@@ -106,6 +106,20 @@ void MaterialBrowserModel::setHasQuick3DImport(bool b)
emit hasQuick3DImportChanged(); emit hasQuick3DImportChanged();
} }
bool MaterialBrowserModel::hasModelSelection() const
{
return m_hasModelSelection;
}
void MaterialBrowserModel::setHasModelSelection(bool b)
{
if (b == m_hasModelSelection)
return;
m_hasModelSelection = b;
emit hasModelSelectionChanged();
}
void MaterialBrowserModel::setSearchText(const QString &searchText) void MaterialBrowserModel::setSearchText(const QString &searchText)
{ {
QString lowerSearchText = searchText.toLower(); QString lowerSearchText = searchText.toLower();
@@ -156,11 +170,7 @@ void MaterialBrowserModel::setMaterials(const QList<ModelNode> &materials, bool
emit isEmptyChanged(); emit isEmptyChanged();
} }
if (hasQuick3DImport != m_hasQuick3DImport) { setHasQuick3DImport(hasQuick3DImport);
m_hasQuick3DImport = hasQuick3DImport;
emit hasQuick3DImportChanged();
}
updateSelectedMaterial(); updateSelectedMaterial();
resetModel(); resetModel();
} }

View File

@@ -40,6 +40,7 @@ class MaterialBrowserModel : 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 hasQuick3DImport READ hasQuick3DImport WRITE setHasQuick3DImport NOTIFY hasQuick3DImportChanged) Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport WRITE setHasQuick3DImport NOTIFY hasQuick3DImportChanged)
Q_PROPERTY(bool hasModelSelection READ hasModelSelection WRITE setHasModelSelection NOTIFY hasModelSelectionChanged)
public: public:
MaterialBrowserModel(QObject *parent = nullptr); MaterialBrowserModel(QObject *parent = nullptr);
@@ -54,6 +55,9 @@ public:
bool hasQuick3DImport() const; bool hasQuick3DImport() const;
void setHasQuick3DImport(bool b); void setHasQuick3DImport(bool b);
bool hasModelSelection() const;
void setHasModelSelection(bool b);
void setMaterials(const QList<ModelNode> &materials, bool hasQuick3DImport); void setMaterials(const QList<ModelNode> &materials, bool hasQuick3DImport);
void removeMaterial(const ModelNode &material); void removeMaterial(const ModelNode &material);
void updateMaterialName(const ModelNode &material); void updateMaterialName(const ModelNode &material);
@@ -73,6 +77,7 @@ public:
signals: signals:
void isEmptyChanged(); void isEmptyChanged();
void hasQuick3DImportChanged(); void hasQuick3DImportChanged();
void hasModelSelectionChanged();
void selectedIndexChanged(int idx); void selectedIndexChanged(int idx);
void renameMaterialTriggered(const QmlDesigner::ModelNode &material, const QString &newName); void renameMaterialTriggered(const QmlDesigner::ModelNode &material, const QString &newName);
void applyToSelectedTriggered(const QmlDesigner::ModelNode &material, bool add = false); void applyToSelectedTriggered(const QmlDesigner::ModelNode &material, bool add = false);
@@ -89,6 +94,7 @@ private:
int m_selectedIndex = 0; int m_selectedIndex = 0;
bool m_isEmpty = true; bool m_isEmpty = true;
bool m_hasQuick3DImport = false; bool m_hasQuick3DImport = false;
bool m_hasModelSelection = false;
}; };
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -118,10 +118,6 @@ void MaterialBrowserView::modelAboutToBeDetached(Model *model)
void MaterialBrowserView::selectedNodesChanged(const QList<ModelNode> &selectedNodeList, void MaterialBrowserView::selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
const QList<ModelNode> &lastSelectedNodeList) const QList<ModelNode> &lastSelectedNodeList)
{ {
if (!m_autoSelectModelMaterial)
return;
// if selected object is a model, select its material in the material browser and editor
ModelNode selectedModel; ModelNode selectedModel;
for (const ModelNode &node : selectedNodeList) { for (const ModelNode &node : selectedNodeList) {
@@ -131,6 +127,11 @@ void MaterialBrowserView::selectedNodesChanged(const QList<ModelNode> &selectedN
} }
} }
m_widget->materialBrowserModel()->setHasModelSelection(selectedModel.isValid());
if (!m_autoSelectModelMaterial)
return;
if (selectedNodeList.size() > 1 || !selectedModel.isValid()) if (selectedNodeList.size() > 1 || !selectedModel.isValid())
return; return;
@@ -144,6 +145,7 @@ void MaterialBrowserView::selectedNodesChanged(const QList<ModelNode> &selectedN
if (!mat.isValid()) if (!mat.isValid())
return; return;
// if selected object is a model, select its material in the material browser and editor
int idx = m_widget->materialBrowserModel()->materialIndex(mat); int idx = m_widget->materialBrowserModel()->materialIndex(mat);
m_widget->materialBrowserModel()->selectMaterial(idx); m_widget->materialBrowserModel()->selectMaterial(idx);
} }

View File

@@ -233,6 +233,20 @@ void MaterialEditorContextObject::setHasQuick3DImport(bool b)
emit hasQuick3DImportChanged(); emit hasQuick3DImportChanged();
} }
bool MaterialEditorContextObject::hasModelSelection() const
{
return m_hasModelSelection;
}
void MaterialEditorContextObject::setHasModelSelection(bool b)
{
if (b == m_hasModelSelection)
return;
m_hasModelSelection = b;
emit hasModelSelectionChanged();
}
void MaterialEditorContextObject::setSelectedMaterial(const ModelNode &matNode) void MaterialEditorContextObject::setSelectedMaterial(const ModelNode &matNode)
{ {
m_selectedMaterial = matNode; m_selectedMaterial = matNode;

View File

@@ -55,6 +55,7 @@ class MaterialEditorContextObject : public QObject
Q_PROPERTY(bool hasAliasExport READ hasAliasExport NOTIFY hasAliasExportChanged) Q_PROPERTY(bool hasAliasExport READ hasAliasExport NOTIFY hasAliasExportChanged)
Q_PROPERTY(bool hasActiveTimeline READ hasActiveTimeline NOTIFY hasActiveTimelineChanged) Q_PROPERTY(bool hasActiveTimeline READ hasActiveTimeline NOTIFY hasActiveTimelineChanged)
Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport WRITE setHasQuick3DImport NOTIFY hasQuick3DImportChanged) Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport WRITE setHasQuick3DImport NOTIFY hasQuick3DImportChanged)
Q_PROPERTY(bool hasModelSelection READ hasModelSelection WRITE setHasModelSelection NOTIFY hasModelSelectionChanged)
Q_PROPERTY(QQmlPropertyMap *backendValues READ backendValues WRITE setBackendValues NOTIFY backendValuesChanged) Q_PROPERTY(QQmlPropertyMap *backendValues READ backendValues WRITE setBackendValues NOTIFY backendValuesChanged)
@@ -104,6 +105,9 @@ public:
bool hasQuick3DImport() const; bool hasQuick3DImport() const;
void setHasQuick3DImport(bool b); void setHasQuick3DImport(bool b);
bool hasModelSelection() const;
void setHasModelSelection(bool b);
bool hasAliasExport() const { return m_aliasExport; } bool hasAliasExport() const { return m_aliasExport; }
void setSelectedMaterial(const ModelNode &matNode); void setSelectedMaterial(const ModelNode &matNode);
@@ -130,6 +134,7 @@ signals:
void hasAliasExportChanged(); void hasAliasExportChanged();
void hasActiveTimelineChanged(); void hasActiveTimelineChanged();
void hasQuick3DImportChanged(); void hasQuick3DImportChanged();
void hasModelSelectionChanged();
private: private:
QUrl m_specificsUrl; QUrl m_specificsUrl;
@@ -150,6 +155,7 @@ private:
bool m_aliasExport = false; bool m_aliasExport = false;
bool m_hasActiveTimeline = false; bool m_hasActiveTimeline = false;
bool m_hasQuick3DImport = false; bool m_hasQuick3DImport = false;
bool m_hasModelSelection = false;
ModelNode m_selectedMaterial; ModelNode m_selectedMaterial;
}; };

View File

@@ -677,6 +677,8 @@ void MaterialEditorView::selectedNodesChanged(const QList<ModelNode> &selectedNo
if (node.isSubclassOf("QtQuick3D.Model")) if (node.isSubclassOf("QtQuick3D.Model"))
m_selectedModels.append(node); m_selectedModels.append(node);
} }
m_qmlBackEnd->contextObject()->setHasModelSelection(!m_selectedModels.isEmpty());
} }
void MaterialEditorView::currentStateChanged(const ModelNode &node) void MaterialEditorView::currentStateChanged(const ModelNode &node)