From 71e553f4974b2fb95b56d07ce3e35f4130ef3b64 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Tue, 24 May 2022 14:14:14 +0300 Subject: 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: Reviewed-by: Thomas Hartmann --- .../materialBrowserQmlSource/MaterialBrowser.qml | 4 ++-- .../MaterialEditorToolBar.qml | 2 +- .../materialbrowser/materialbrowsermodel.cpp | 20 +++++++++++++++----- .../materialbrowser/materialbrowsermodel.h | 6 ++++++ .../materialbrowser/materialbrowserview.cpp | 10 ++++++---- .../materialeditor/materialeditorcontextobject.cpp | 14 ++++++++++++++ .../materialeditor/materialeditorcontextobject.h | 6 ++++++ .../components/materialeditor/materialeditorview.cpp | 2 ++ 8 files changed, 52 insertions(+), 12 deletions(-) diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml index 1518e477e3..f0d8cf7e73 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml @@ -92,13 +92,13 @@ Item { StudioControls.MenuItem { text: qsTr("Apply to selected (replace)") - enabled: currentMaterial + enabled: currentMaterial && materialBrowserModel.hasModelSelection onTriggered: materialBrowserModel.applyToSelected(currentMaterial.materialInternalId, false) } StudioControls.MenuItem { text: qsTr("Apply to selected (add)") - enabled: currentMaterial + enabled: currentMaterial && materialBrowserModel.hasModelSelection onTriggered: materialBrowserModel.applyToSelected(currentMaterial.materialInternalId, true) } diff --git a/share/qtcreator/qmldesigner/materialEditorQmlSources/MaterialEditorToolBar.qml b/share/qtcreator/qmldesigner/materialEditorQmlSources/MaterialEditorToolBar.qml index 028957c882..c610df94c5 100644 --- a/share/qtcreator/qmldesigner/materialEditorQmlSources/MaterialEditorToolBar.qml +++ b/share/qtcreator/qmldesigner/materialEditorQmlSources/MaterialEditorToolBar.qml @@ -50,7 +50,7 @@ Rectangle { normalColor: "transparent" iconSize: StudioTheme.Values.bigIconFontSize buttonSize: root.height - enabled: hasMaterial && hasQuick3DImport + enabled: hasMaterial && hasModelSelection && hasQuick3DImport onClicked: root.toolBarAction(ToolBarAction.ApplyToSelected) tooltip: qsTr("Apply material to selected model.") } diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp index 012b540914..005b6ed5dd 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp @@ -106,6 +106,20 @@ void MaterialBrowserModel::setHasQuick3DImport(bool b) 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) { QString lowerSearchText = searchText.toLower(); @@ -156,11 +170,7 @@ void MaterialBrowserModel::setMaterials(const QList &materials, bool emit isEmptyChanged(); } - if (hasQuick3DImport != m_hasQuick3DImport) { - m_hasQuick3DImport = hasQuick3DImport; - emit hasQuick3DImportChanged(); - } - + setHasQuick3DImport(hasQuick3DImport); updateSelectedMaterial(); resetModel(); } diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h index 7d8fa15121..5f00596ef9 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h @@ -40,6 +40,7 @@ class MaterialBrowserModel : public QAbstractListModel Q_PROPERTY(bool isEmpty MEMBER m_isEmpty NOTIFY isEmptyChanged) Q_PROPERTY(int selectedIndex MEMBER m_selectedIndex NOTIFY selectedIndexChanged) Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport WRITE setHasQuick3DImport NOTIFY hasQuick3DImportChanged) + Q_PROPERTY(bool hasModelSelection READ hasModelSelection WRITE setHasModelSelection NOTIFY hasModelSelectionChanged) public: MaterialBrowserModel(QObject *parent = nullptr); @@ -54,6 +55,9 @@ public: bool hasQuick3DImport() const; void setHasQuick3DImport(bool b); + bool hasModelSelection() const; + void setHasModelSelection(bool b); + void setMaterials(const QList &materials, bool hasQuick3DImport); void removeMaterial(const ModelNode &material); void updateMaterialName(const ModelNode &material); @@ -73,6 +77,7 @@ public: signals: void isEmptyChanged(); void hasQuick3DImportChanged(); + void hasModelSelectionChanged(); void selectedIndexChanged(int idx); void renameMaterialTriggered(const QmlDesigner::ModelNode &material, const QString &newName); void applyToSelectedTriggered(const QmlDesigner::ModelNode &material, bool add = false); @@ -89,6 +94,7 @@ private: int m_selectedIndex = 0; bool m_isEmpty = true; bool m_hasQuick3DImport = false; + bool m_hasModelSelection = false; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index 0946411c9b..3239d2f302 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -118,10 +118,6 @@ void MaterialBrowserView::modelAboutToBeDetached(Model *model) void MaterialBrowserView::selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) { - if (!m_autoSelectModelMaterial) - return; - - // if selected object is a model, select its material in the material browser and editor ModelNode selectedModel; for (const ModelNode &node : selectedNodeList) { @@ -131,6 +127,11 @@ void MaterialBrowserView::selectedNodesChanged(const QList &selectedN } } + m_widget->materialBrowserModel()->setHasModelSelection(selectedModel.isValid()); + + if (!m_autoSelectModelMaterial) + return; + if (selectedNodeList.size() > 1 || !selectedModel.isValid()) return; @@ -144,6 +145,7 @@ void MaterialBrowserView::selectedNodesChanged(const QList &selectedN if (!mat.isValid()) return; + // if selected object is a model, select its material in the material browser and editor int idx = m_widget->materialBrowserModel()->materialIndex(mat); m_widget->materialBrowserModel()->selectMaterial(idx); } diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp index bf365bf270..435c531897 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp @@ -233,6 +233,20 @@ void MaterialEditorContextObject::setHasQuick3DImport(bool b) 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) { m_selectedMaterial = matNode; diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.h b/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.h index c1b9a88046..54d72171a5 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.h +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.h @@ -55,6 +55,7 @@ class MaterialEditorContextObject : public QObject Q_PROPERTY(bool hasAliasExport READ hasAliasExport NOTIFY hasAliasExportChanged) Q_PROPERTY(bool hasActiveTimeline READ hasActiveTimeline NOTIFY hasActiveTimelineChanged) 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) @@ -104,6 +105,9 @@ public: bool hasQuick3DImport() const; void setHasQuick3DImport(bool b); + bool hasModelSelection() const; + void setHasModelSelection(bool b); + bool hasAliasExport() const { return m_aliasExport; } void setSelectedMaterial(const ModelNode &matNode); @@ -130,6 +134,7 @@ signals: void hasAliasExportChanged(); void hasActiveTimelineChanged(); void hasQuick3DImportChanged(); + void hasModelSelectionChanged(); private: QUrl m_specificsUrl; @@ -150,6 +155,7 @@ private: bool m_aliasExport = false; bool m_hasActiveTimeline = false; bool m_hasQuick3DImport = false; + bool m_hasModelSelection = false; ModelNode m_selectedMaterial; }; diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index b72b91117f..5f115b6777 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -677,6 +677,8 @@ void MaterialEditorView::selectedNodesChanged(const QList &selectedNo if (node.isSubclassOf("QtQuick3D.Model")) m_selectedModels.append(node); } + + m_qmlBackEnd->contextObject()->setHasModelSelection(!m_selectedModels.isEmpty()); } void MaterialEditorView::currentStateChanged(const ModelNode &node) -- cgit v1.2.1