From 1482bc0ae1d6cbc4accfe9001986a23feab41544 Mon Sep 17 00:00:00 2001 From: Amr Essam Date: Wed, 4 Jan 2023 11:39:54 +0200 Subject: [PATCH] QmlDesigner: Allow drag effects to only QtQuickItem elements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - While drag an effect from asset library, it only applies to elements that are type of QtQuickItem and has layer.effect property. - Highlight those elements when start dragging an effect, so user know correct elements to drag to. Task-number: QDS-8579 Change-Id: Iedeed0e5ac65ce8b635f5cca6311b05c85197695 Reviewed-by: Tomi Korpipää Reviewed-by: Thomas Hartmann --- .../navigator/choosefrompropertylistdialog.cpp | 5 +++++ .../components/navigator/navigatortreemodel.cpp | 3 ++- .../components/navigator/navigatorview.cpp | 14 ++++++++++++++ .../designercore/include/nodemetainfo.h | 1 + .../designercore/metainfo/nodemetainfo.cpp | 10 ++++++++++ 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp index 8c1d2b360c3..fd286d74808 100644 --- a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp +++ b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp @@ -39,6 +39,8 @@ ChooseFromPropertyListFilter::ChooseFromPropertyListFilter(const NodeMetaInfo &i // -> Model // BundleMaterial // -> Model + // Effect + // -> Item if (insertInfo.isQtQuick3DTexture()) { if (parentInfo.isQtQuick3DDefaultMaterial() || parentInfo.isQtQuick3DPrincipledMaterial() @@ -93,6 +95,9 @@ ChooseFromPropertyListFilter::ChooseFromPropertyListFilter(const NodeMetaInfo &i // TODO merge conflict between Change-Id: If3c58f82797beabe76baf99ea2dddc59032729df and Change-Id: Iff2dea66e253b412105427134bd49cb16ed76193 // } else if (insertInfo.typeName().startsWith("ComponentBundles.MaterialBundle")) { // if (parentInfo.isSubclassOf("QtQuick3D.Model")) + } else if (insertInfo.isEffectMaker()) { + if (parentInfo.isQtQuickItem()) + propertyList.append("effect"); } } diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index a7a163ab18b..699974b7c0c 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -1019,7 +1019,8 @@ ModelNode NavigatorTreeModel::handleItemLibraryEffectDrop(const QString &effectP ModelNode targetNode(modelNodeForIndex(rowModelIndex)); ModelNode newModelNode; - if (targetNode.hasParentProperty() && targetNode.parentProperty().name() == "layer.effect") + if ((targetNode.hasParentProperty() && targetNode.parentProperty().name() == "layer.effect") + || !targetNode.metaInfo().isQtQuickItem()) return newModelNode; if (ModelNodeOperations::validateEffect(effectPath)) { diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index 31106a87356..87eae0a7235 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -7,6 +7,7 @@ #include "qmldesignerconstants.h" #include "qmldesignericons.h" #include "qmldesignerplugin.h" +#include "assetslibrarywidget.h" #include "nameitemdelegate.h" #include "iconcheckboxitemdelegate.h" @@ -266,6 +267,19 @@ void NavigatorView::dragStarted(QMimeData *mimeData) m_widget->setDragType(bundleMatType); m_widget->update(); + } else if (mimeData->hasFormat(Constants::MIME_TYPE_ASSETS)) { + const QStringList assetsPaths = QString::fromUtf8(mimeData->data(Constants::MIME_TYPE_ASSETS)).split(','); + if (assetsPaths.count() > 0) { + auto assetTypeAndData = AssetsLibraryWidget::getAssetTypeAndData(assetsPaths[0]); + QString assetType = assetTypeAndData.first; + if (assetType == Constants::MIME_TYPE_ASSET_EFFECT) { + qint32 internalId = mimeData->data(Constants::MIME_TYPE_ASSET_EFFECT).toInt(); + ModelNode effectNode = modelNodeForInternalId(internalId); + + m_widget->setDragType(effectNode.metaInfo().typeName()); + m_widget->update(); + } + } } } diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h index 36469d6f309..390a0482491 100644 --- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h @@ -100,6 +100,7 @@ public: bool isAlias() const; bool isBool() const; bool isColor() const; + bool isEffectMaker() const; bool isFloat() const; bool isFlowViewFlowActionArea() const; bool isFlowViewFlowDecision() const; diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 7914ca76437..95d3765d9eb 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -2535,6 +2535,16 @@ bool NodeMetaInfo::isColor() const } } +bool NodeMetaInfo::isEffectMaker() const +{ + if constexpr (useProjectStorage()) { + using namespace Storage::Info; + return isBasedOnCommonType(m_projectStorage, m_typeId); + } else { + return isValid() && m_privateData->properties().contains("layer.effect"); + } +} + bool NodeMetaInfo::isBool() const { if constexpr (useProjectStorage()) {