From 5731904f70e2d07a7c24550e6805d69d2b7f3843 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 14 Mar 2025 17:09:09 +0200 Subject: [PATCH] QmlDesigner: Fix dragging effects, images, and fonts to 2D view Fixes: QDS-14923 Change-Id: Icdd53a706ca3bb1bdbd09be22390db55a8e670cf Reviewed-by: Mahmoud Badri --- .../formeditor/abstractformeditortool.cpp | 35 ++++++++++--------- .../formeditor/abstractformeditortool.h | 1 + .../components/formeditor/dragtool.cpp | 2 ++ 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp index b8913546647..bf2a4bb2568 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -40,6 +40,23 @@ FormEditorScene* AbstractFormEditorTool::scene() const return view()->scene(); } +bool AbstractFormEditorTool::hasDroppableAsset(const QMimeData *mimeData) +{ + if (mimeData->hasFormat(Constants::MIME_TYPE_ASSETS)) { + const QStringList assetPaths + = QString::fromUtf8(mimeData->data(Constants::MIME_TYPE_ASSETS)).split(','); + for (const QString &assetPath : assetPaths) { + QString assetType = AssetsLibraryWidget::getAssetTypeAndData(assetPath).first; + if (assetType == Constants::MIME_TYPE_ASSET_IMAGE + || assetType == Constants::MIME_TYPE_ASSET_FONT + || assetType == Constants::MIME_TYPE_ASSET_EFFECT) { + return true; + } + } + } + return false; +} + void AbstractFormEditorTool::setItems(const QList &itemList) { m_itemList = itemList; @@ -215,22 +232,8 @@ void AbstractFormEditorTool::dropEvent(const QList &/*itemList*/ void AbstractFormEditorTool::dragEnterEvent(const QList &itemList, QGraphicsSceneDragDropEvent *event) { - bool hasValidAssets = false; - if (event->mimeData()->hasFormat(Constants::MIME_TYPE_ASSETS)) { - const QStringList assetPaths = QString::fromUtf8(event->mimeData() - ->data(Constants::MIME_TYPE_ASSETS)).split(','); - for (const QString &assetPath : assetPaths) { - QString assetType = AssetsLibraryWidget::getAssetTypeAndData(assetPath).first; - if (assetType == Constants::MIME_TYPE_ASSET_IMAGE - || assetType == Constants::MIME_TYPE_ASSET_FONT - || assetType == Constants::MIME_TYPE_ASSET_EFFECT) { - hasValidAssets = true; - break; - } - } - } - - if (event->mimeData()->hasFormat(Constants::MIME_TYPE_ITEM_LIBRARY_INFO) || hasValidAssets) { + if (event->mimeData()->hasFormat(Constants::MIME_TYPE_ITEM_LIBRARY_INFO) + || hasDroppableAsset(event->mimeData())) { event->accept(); view()->changeToDragTool(); view()->currentTool()->dragEnterEvent(itemList, event); diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h index be7dc1968b9..8c9c80ddd01 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h @@ -59,6 +59,7 @@ public: void setItems(const QList &itemList); QList items() const; + static bool hasDroppableAsset(const QMimeData *mimeData); static QList toFormEditorItemList(const QList &itemList); static QGraphicsItem* topMovableGraphicsItem(const QList &itemList); static FormEditorItem* topMovableFormEditorItem(const QList &itemList, bool selectOnlyContentItems); diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp index 9ea9c9a8feb..34bd6bc2fe2 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp @@ -209,6 +209,8 @@ static ItemLibraryEntry itemLibraryEntryFromMimeData(const QMimeData *mimeData) static bool canBeDropped(const QMimeData *mimeData, Model *model) { + if (AbstractFormEditorTool::hasDroppableAsset(mimeData)) + return true; #ifdef QDS_USE_PROJECTSTORAGE auto itemLibraryEntry = itemLibraryEntryFromMimeData(mimeData); NodeMetaInfo metaInfo{itemLibraryEntry.typeId(), model->projectStorage()};