diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml index ce9f7d16e3d..ad9356d44db 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml @@ -24,7 +24,6 @@ ****************************************************************************/ import QtQuick 2.15 -import QtQuick.Layouts 1.15 import QtQuickDesignerTheme 1.0 import HelperWidgets 2.0 import StudioControls 1.0 as StudioControls @@ -36,12 +35,7 @@ Item { readonly property int cellWidth: 100 readonly property int cellHeight: 120 - property var currentMaterial: null - property int currentMaterialIdx: 0 - property var currentBundleMaterial: null - property int copiedMaterialInternalId: -1 - - property var matSectionsModel: [] + property var currMaterialItem: null // Called also from C++ to close context menu on focus out function closeContextMenu() @@ -78,8 +72,7 @@ Item { if (!materialBrowserModel.hasMaterialRoot && materialBrowserModel.hasQuick3DImport && (!materialBrowserBundleModel.matBundleExists || mouse.y < userMatsSecBottom)) { - root.currentMaterial = null - ctxMenu.popup() + ctxMenu.popupMenu() } } } @@ -89,11 +82,23 @@ Item { function onSelectedIndexChanged() { // commit rename upon changing selection - var item = gridRepeater.itemAt(currentMaterialIdx); - if (item) - item.commitRename(); + if (root.currMaterialItem) + root.currMaterialItem.commitRename(); - currentMaterialIdx = materialBrowserModel.selectedIndex; + root.currMaterialItem = gridRepeater.itemAt(materialBrowserModel.selectedIndex); + } + } + + MaterialBrowserContextMenu { + id: ctxMenu + } + + MaterialBundleContextMenu { + id: ctxMenuBundle + + onUnimport: (bundleMat) => { + unimportBundleMaterialDialog.targetBundleMaterial = bundleMat + unimportBundleMaterialDialog.open() } } @@ -101,152 +106,6 @@ Item { id: unimportBundleMaterialDialog } - StudioControls.Menu { - id: ctxMenu - - closePolicy: StudioControls.Menu.CloseOnEscape | StudioControls.Menu.CloseOnPressOutside - - StudioControls.MenuItem { - text: qsTr("Apply to selected (replace)") - enabled: root.currentMaterial && materialBrowserModel.hasModelSelection - onTriggered: materialBrowserModel.applyToSelected(root.currentMaterial.materialInternalId, false) - } - - StudioControls.MenuItem { - text: qsTr("Apply to selected (add)") - enabled: root.currentMaterial && materialBrowserModel.hasModelSelection - onTriggered: materialBrowserModel.applyToSelected(root.currentMaterial.materialInternalId, true) - } - - StudioControls.MenuSeparator { - height: StudioTheme.Values.border - } - - StudioControls.Menu { - title: qsTr("Copy properties") - enabled: root.currentMaterial - - width: parent.width - - onAboutToShow: { - if (root.currentMaterial.hasDynamicProperties) - root.matSectionsModel = ["All", "Custom"]; - else - root.matSectionsModel = ["All"]; - - switch (root.currentMaterial.materialType) { - case "DefaultMaterial": - root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.defaultMaterialSections); - break; - - case "PrincipledMaterial": - root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.principledMaterialSections); - break; - - case "CustomMaterial": - root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.customMaterialSections); - break; - } - } - - Repeater { - model: root.matSectionsModel - - StudioControls.MenuItem { - text: modelData - enabled: root.currentMaterial - onTriggered: { - root.copiedMaterialInternalId = root.currentMaterial.materialInternalId - materialBrowserModel.copyMaterialProperties(root.currentMaterialIdx, modelData) - } - } - } - } - - StudioControls.MenuItem { - text: qsTr("Paste properties") - enabled: root.currentMaterial - && root.copiedMaterialInternalId !== root.currentMaterial.materialInternalId - && root.currentMaterial.materialType === materialBrowserModel.copiedMaterialType - && materialBrowserModel.isCopiedMaterialValid() - onTriggered: materialBrowserModel.pasteMaterialProperties(root.currentMaterialIdx) - } - - StudioControls.MenuSeparator { - height: StudioTheme.Values.border - } - - StudioControls.MenuItem { - text: qsTr("Duplicate") - enabled: root.currentMaterial - onTriggered: materialBrowserModel.duplicateMaterial(root.currentMaterialIdx) - } - - StudioControls.MenuItem { - text: qsTr("Rename") - enabled: root.currentMaterial - onTriggered: { - var item = gridRepeater.itemAt(root.currentMaterialIdx); - if (item) - item.startRename(); - } - } - - StudioControls.MenuItem { - text: qsTr("Delete") - enabled: root.currentMaterial - - onTriggered: materialBrowserModel.deleteMaterial(root.currentMaterialIdx) - } - - StudioControls.MenuSeparator {} - - StudioControls.MenuItem { - text: qsTr("Create New Material") - - onTriggered: materialBrowserModel.addNewMaterial() - } - } - - StudioControls.Menu { - id: ctxMenuBundle - - closePolicy: StudioControls.Menu.CloseOnEscape | StudioControls.Menu.CloseOnPressOutside - - StudioControls.MenuItem { - text: qsTr("Apply to selected (replace)") - enabled: root.currentBundleMaterial && materialBrowserModel.hasModelSelection - onTriggered: materialBrowserBundleModel.applyToSelected(root.currentBundleMaterial, false) - } - - StudioControls.MenuItem { - text: qsTr("Apply to selected (add)") - enabled: root.currentBundleMaterial && materialBrowserModel.hasModelSelection - onTriggered: materialBrowserBundleModel.applyToSelected(root.currentBundleMaterial, true) - } - - StudioControls.MenuSeparator {} - - StudioControls.MenuItem { - enabled: !materialBrowserBundleModel.importerRunning - text: qsTr("Add an instance to project") - - onTriggered: { - materialBrowserBundleModel.addToProject(root.currentBundleMaterial) - } - } - - StudioControls.MenuItem { - enabled: !materialBrowserBundleModel.importerRunning && root.currentBundleMaterial.bundleMaterialImported - text: qsTr("Remove from project") - - onTriggered: { - unimportBundleMaterialDialog.targetBundleMaterial = root.currentBundleMaterial - unimportBundleMaterialDialog.open() - } - } - } - Column { id: col y: 5 @@ -347,8 +206,7 @@ Item { height: root.cellHeight onShowContextMenu: { - root.currentMaterial = model - ctxMenu.popup() + ctxMenu.popupMenu(this, model) } } } @@ -410,8 +268,7 @@ Item { height: root.cellHeight onShowContextMenu: { - root.currentBundleMaterial = modelData - ctxMenuBundle.popup() + ctxMenuBundle.popupMenu(modelData) } } } diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowserContextMenu.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowserContextMenu.qml new file mode 100644 index 00000000000..d1e9f1ab1f4 --- /dev/null +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowserContextMenu.qml @@ -0,0 +1,140 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick +import HelperWidgets +import StudioControls as StudioControls +import StudioTheme as StudioTheme + +StudioControls.Menu { + id: root + + property var targetMaterial: null + property var targetItem: null + property int copiedMaterialInternalId: -1 + property var matSectionsModel: [] + + function popupMenu(targetItem = null, targetMaterial = null) + { + this.targetItem = targetItem + this.targetMaterial = targetMaterial + popup() + } + + closePolicy: StudioControls.Menu.CloseOnEscape | StudioControls.Menu.CloseOnPressOutside + + StudioControls.MenuItem { + text: qsTr("Apply to selected (replace)") + enabled: root.targetMaterial && materialBrowserModel.hasModelSelection + onTriggered: materialBrowserModel.applyToSelected(root.targetMaterial.materialInternalId, false) + } + + StudioControls.MenuItem { + text: qsTr("Apply to selected (add)") + enabled: root.targetMaterial && materialBrowserModel.hasModelSelection + onTriggered: materialBrowserModel.applyToSelected(root.targetMaterial.materialInternalId, true) + } + + StudioControls.MenuSeparator {} + + StudioControls.Menu { + title: qsTr("Copy properties") + enabled: root.targetMaterial + + width: parent.width + + onAboutToShow: { + if (root.targetMaterial.hasDynamicProperties) + root.matSectionsModel = ["All", "Custom"]; + else + root.matSectionsModel = ["All"]; + + switch (root.targetMaterial.materialType) { + case "DefaultMaterial": + root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.defaultMaterialSections); + break; + + case "PrincipledMaterial": + root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.principledMaterialSections); + break; + + case "CustomMaterial": + root.matSectionsModel = root.matSectionsModel.concat(materialBrowserModel.customMaterialSections); + break; + } + } + + Repeater { + model: root.matSectionsModel + + StudioControls.MenuItem { + text: modelData + enabled: root.targetMaterial + onTriggered: { + root.copiedMaterialInternalId = root.targetMaterial.materialInternalId + materialBrowserModel.copyMaterialProperties(materialBrowserModel.selectedIndex, modelData) + } + } + } + } + + StudioControls.MenuItem { + text: qsTr("Paste properties") + enabled: root.targetMaterial + && root.copiedMaterialInternalId !== root.targetMaterial.materialInternalId + && root.targetMaterial.materialType === materialBrowserModel.copiedMaterialType + && materialBrowserModel.isCopiedMaterialValid() + onTriggered: materialBrowserModel.pasteMaterialProperties(materialBrowserModel.selectedIndex) + } + + StudioControls.MenuSeparator {} + + StudioControls.MenuItem { + text: qsTr("Duplicate") + enabled: root.targetMaterial + onTriggered: materialBrowserModel.duplicateMaterial(materialBrowserModel.selectedIndex) + } + + StudioControls.MenuItem { + text: qsTr("Rename") + enabled: root.targetItem + onTriggered: root.targetItem.startRename(); + } + + StudioControls.MenuItem { + text: qsTr("Delete") + enabled: root.targetMaterial + + onTriggered: materialBrowserModel.deleteMaterial(materialBrowserModel.selectedIndex) + } + + StudioControls.MenuSeparator {} + + StudioControls.MenuItem { + text: qsTr("Create New Material") + + onTriggered: materialBrowserModel.addNewMaterial() + } +} diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBundleContextMenu.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBundleContextMenu.qml new file mode 100644 index 00000000000..eb698d69932 --- /dev/null +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBundleContextMenu.qml @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.15 +import HelperWidgets 2.0 +import StudioControls 1.0 as StudioControls +import StudioTheme 1.0 as StudioTheme + +StudioControls.Menu { + id: root + + property var targetMaterial: null + signal unimport(var bundleMat); + + function popupMenu(targetMaterial = null) + { + this.targetMaterial = targetMaterial + popup() + } + + closePolicy: StudioControls.Menu.CloseOnEscape | StudioControls.Menu.CloseOnPressOutside + + StudioControls.MenuItem { + text: qsTr("Apply to selected (replace)") + enabled: root.targetMaterial && materialBrowserModel.hasModelSelection + onTriggered: materialBrowserBundleModel.applyToSelected(root.targetMaterial, false) + } + + StudioControls.MenuItem { + text: qsTr("Apply to selected (add)") + enabled: root.targetMaterial && materialBrowserModel.hasModelSelection + onTriggered: materialBrowserBundleModel.applyToSelected(root.targetMaterial, true) + } + + StudioControls.MenuSeparator {} + + StudioControls.MenuItem { + enabled: !materialBrowserBundleModel.importerRunning + text: qsTr("Add an instance to project") + + onTriggered: { + materialBrowserBundleModel.addToProject(root.targetMaterial) + } + } + + StudioControls.MenuItem { + enabled: !materialBrowserBundleModel.importerRunning && root.targetMaterial.bundleMaterialImported + text: qsTr("Remove from project") + + onTriggered: root.unimport(root.targetMaterial); + } +}