diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2022-09-26 16:52:16 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2022-09-27 08:51:21 +0000 |
commit | 07ab73fe7f0059767e8d4f7b70fcec0fdc4811a4 (patch) | |
tree | 6f2e7e12536c6752314ed02415e6ffa3e6b50550 | |
parent | 4da66867051b27354b71ff6b4690d4e2d1e53bd6 (diff) |
QmlDesigner: Disable paste option for the original material
Fixes: QDS-7526
Change-Id: Ifdc220685a4881dc3a397d9148022b9be7b5032a
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
4 files changed, 27 insertions, 10 deletions
diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml index 20d970e4c5..d783a9bb05 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml @@ -39,6 +39,7 @@ Item { property var currentMaterial: null property int currentMaterialIdx: 0 property var currentBundleMaterial: null + property int copiedMaterialInternalId: -1 property var matSectionsModel: [] @@ -147,15 +148,20 @@ Item { StudioControls.MenuItem { text: modelData enabled: root.currentMaterial - onTriggered: materialBrowserModel.copyMaterialProperties(root.currentMaterialIdx, modelData) + onTriggered: { + root.copiedMaterialInternalId = root.currentMaterial.materialInternalId + materialBrowserModel.copyMaterialProperties(root.currentMaterialIdx, modelData) + } } } } StudioControls.MenuItem { text: qsTr("Paste properties") - enabled: root.currentMaterial && root.currentMaterial.materialType - === materialBrowserModel.copiedMaterialType + enabled: root.currentMaterial + && root.copiedMaterialInternalId !== root.currentMaterial.materialInternalId + && root.currentMaterial.materialType === materialBrowserModel.copiedMaterialType + && materialBrowserModel.isCopiedMaterialValid() onTriggered: materialBrowserModel.pasteMaterialProperties(root.currentMaterialIdx) } diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp index b5d85a4cb8..dd828de352 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp @@ -348,8 +348,8 @@ void MaterialBrowserModel::duplicateMaterial(int idx) void MaterialBrowserModel::copyMaterialProperties(int idx, const QString §ion) { - ModelNode mat = m_materialList.at(idx); - QString matType = QString::fromLatin1(mat.type()); + m_copiedMaterial = m_materialList.at(idx); + QString matType = QString::fromLatin1(m_copiedMaterial.type()); if (matType.startsWith("QtQuick3D.")) matType.remove("QtQuick3D."); @@ -358,7 +358,7 @@ void MaterialBrowserModel::copyMaterialProperties(int idx, const QString §io m_allPropsCopied = section == "All"; if (m_allPropsCopied || m_propertyGroupsObj.empty()) { - m_copiedMaterialProps = mat.properties(); + m_copiedMaterialProps = m_copiedMaterial.properties(); } else { QJsonObject propsSpecObj = m_propertyGroupsObj.value(m_copiedMaterialType).toObject(); if (propsSpecObj.contains(section)) { // should always be true @@ -366,14 +366,14 @@ void MaterialBrowserModel::copyMaterialProperties(int idx, const QString §io const QJsonArray propNames = propsSpecObj.value(section).toArray(); // auto == QJsonValueConstRef after 04dc959d49e5e3 / Qt 6.4, QJsonValueRef before for (const auto &propName : propNames) - m_copiedMaterialProps.append(mat.property(propName.toString().toLatin1())); + m_copiedMaterialProps.append(m_copiedMaterial.property(propName.toString().toLatin1())); if (section == "Base") { // add QtQuick3D.Material base props as well QJsonObject propsMatObj = m_propertyGroupsObj.value("Material").toObject(); const QJsonArray propNames = propsMatObj.value("Base").toArray(); // auto == QJsonValueConstRef after 04dc959d49e5e3 / Qt 6.4, QJsonValueRef before for (const auto &propName : propNames) - m_copiedMaterialProps.append(mat.property(propName.toString().toLatin1())); + m_copiedMaterialProps.append(m_copiedMaterial.property(propName.toString().toLatin1())); } } } @@ -381,7 +381,9 @@ void MaterialBrowserModel::copyMaterialProperties(int idx, const QString §io void MaterialBrowserModel::pasteMaterialProperties(int idx) { - emit pasteMaterialPropertiesTriggered(m_materialList.at(idx), m_copiedMaterialProps, m_allPropsCopied); + ModelNode targetMat = m_materialList.at(idx); + if (targetMat.isValid() && m_copiedMaterial.isValid() && targetMat != m_copiedMaterial) + emit pasteMaterialPropertiesTriggered(targetMat, m_copiedMaterialProps, m_allPropsCopied); } void MaterialBrowserModel::deleteMaterial(int idx) @@ -418,4 +420,11 @@ void MaterialBrowserModel::openMaterialEditor() QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialEditor", true); } +// This is provided as invokable instead of property, as it is difficult to know when ModelNode +// becomes invalid. Much simpler to evaluate this on demand. +bool MaterialBrowserModel::isCopiedMaterialValid() const +{ + return m_copiedMaterial.isValid(); +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h index daa39c3539..704cdcb644 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h @@ -92,6 +92,7 @@ public: Q_INVOKABLE void addNewMaterial(); Q_INVOKABLE void applyToSelected(qint64 internalId, bool add = false); Q_INVOKABLE void openMaterialEditor(); + Q_INVOKABLE bool isCopiedMaterialValid() const; signals: void isEmptyChanged(); @@ -118,6 +119,7 @@ private: QStringList m_defaultMaterialSections; QStringList m_principledMaterialSections; QStringList m_customMaterialSections; + ModelNode m_copiedMaterial; QList<AbstractProperty> m_copiedMaterialProps; QHash<qint32, int> m_materialIndexHash; // internalId -> index QJsonObject m_propertyGroupsObj; diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index b88c0a77d7..13f7ad211d 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -110,7 +110,7 @@ WidgetInfo MaterialBrowserView::widgetInfo() // apply pasted properties for (const AbstractProperty &prop : props) { - if (prop.name() == "objectName") + if (prop.name() == "objectName" || !prop.isValid()) continue; if (prop.isVariantProperty()) |