From c78c4817cde6aa463bfb3d05ea45ae31f6bed818 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 6 Mar 2023 17:27:25 +0200 Subject: [PATCH] QmlDesigner: Fix asset drag to material browser Drag now correctly accepts only assets that can be used as textures. "selected_texture_changed" custom notification was used in two semantically slightly different cases, both to indicate selected texture had changed and that selection should change, which was little confusing. Split the two cases to separate custom notifications to clarify the situation and allow "select_texture" to be handled in material browser even if it sent it. This fixes the issue of newly added texture not getting selected after drag, because creation was done by material browser view. Similar issue was fixed with "selected_material_changed" as well. Also fixed a couple of cases of drag not being properly ended. Change-Id: Ie1cae01ef13b687d9e611ac1c91443688001fe49 Reviewed-by: Mahmoud Badri --- .../itemLibraryQmlSources/AssetDelegate.qml | 2 +- .../MaterialBrowser.qml | 7 ++-- .../assetslibrary/assetslibrarymodel.cpp | 3 +- .../assetslibrary/assetslibrarywidget.cpp | 5 ++- .../assetslibrary/assetslibrarywidget.h | 2 +- .../componentcore/modelnodeoperations.cpp | 4 +-- .../qmldesigner/components/createtexture.cpp | 6 ++-- .../components/edit3d/edit3dwidget.cpp | 3 +- .../materialbrowser/materialbrowserview.cpp | 8 ++--- .../materialbrowser/materialbrowserwidget.cpp | 32 +++++++++++++------ .../materialbrowser/materialbrowserwidget.h | 1 + .../qmldesigner/qmldesignerprojectmanager.cpp | 4 +-- src/plugins/qmldesigner/utils/asset.cpp | 5 +++ src/plugins/qmldesigner/utils/asset.h | 1 + 14 files changed, 50 insertions(+), 33 deletions(-) diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetDelegate.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetDelegate.qml index 7820e39e549..dc10056a46e 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetDelegate.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetDelegate.qml @@ -198,7 +198,7 @@ TreeViewDelegate { if (root.__isDirectory) return filePath - if (rootView.assetIsImage(model.filePath)) { + if (rootView.assetIsImageOrTexture(model.filePath)) { let size = rootView.imageSize(model.filePath) return filePath + "\n" diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml index a20e09e7043..3ad72eeeea9 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml @@ -716,9 +716,10 @@ Item { dropEnabled: true onDropEnter: (drag) => { - drag.accepted = drag.formats[0] === "application/vnd.qtdesignstudio.bundletexture" - || drag.formats[0] === "application/vnd.qtdesignstudio.assets" - + let accepted = drag.formats[0] === "application/vnd.qtdesignstudio.bundletexture" + if (drag.formats[0] === "application/vnd.qtdesignstudio.assets") + accepted = rootView.hasAcceptableAssets(drag.urls) + drag.accepted = accepted highlight = drag.accepted } diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp index 4818ca3ed3e..37deec9f008 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp @@ -169,8 +169,7 @@ bool AssetsLibraryModel::deleteFolderRecursively(const QModelIndex &folderIndex) bool AssetsLibraryModel::allFilePathsAreTextures(const QStringList &filePaths) const { return Utils::allOf(filePaths, [](const QString &path) { - Asset asset(path); - return asset.isImage() || asset.isTexture3D(); + return Asset(path).isValidTextureSource(); }); } diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp index 48e7f2aadba..9427c3e8bba 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp @@ -245,10 +245,9 @@ QString AssetsLibraryWidget::assetFileSize(const QString &id) return QLocale::system().formattedDataSize(fileSize, 2, QLocale::DataSizeTraditionalFormat); } -bool AssetsLibraryWidget::assetIsImage(const QString &id) +bool AssetsLibraryWidget::assetIsImageOrTexture(const QString &id) { - Asset asset(id); - return asset.isImage() || asset.isTexture3D(); + return Asset(id).isValidTextureSource(); } QList AssetsLibraryWidget::createToolBarWidgets() diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h index d4161213a04..f368b2935b8 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h @@ -80,7 +80,7 @@ public: Q_INVOKABLE void invalidateThumbnail(const QString &id); Q_INVOKABLE QSize imageSize(const QString &id); Q_INVOKABLE QString assetFileSize(const QString &id); - Q_INVOKABLE bool assetIsImage(const QString &id); + Q_INVOKABLE bool assetIsImageOrTexture(const QString &id); Q_INVOKABLE void addTextures(const QStringList &filePaths); Q_INVOKABLE void addLightProbe(const QString &filePaths); diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index b5a4c077ac3..29657afc231 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -835,8 +835,8 @@ void editMaterial(const SelectionContext &selectionContext) if (material.isValid()) { QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialEditor"); - // to MaterialEditor and MaterialBrowser... - view->emitCustomNotification("selected_material_changed", {material}); + // to MaterialBrowser... + view->emitCustomNotification("select_material", {material}); } } diff --git a/src/plugins/qmldesigner/components/createtexture.cpp b/src/plugins/qmldesigner/components/createtexture.cpp index f716a63bcc1..0d3c7fa964b 100644 --- a/src/plugins/qmldesigner/components/createtexture.cpp +++ b/src/plugins/qmldesigner/components/createtexture.cpp @@ -4,6 +4,7 @@ #include "createtexture.h" #include "abstractview.h" +#include "asset.h" #include "documentmanager.h" #include "modelnodeoperations.h" #include "nodelistproperty.h" @@ -24,7 +25,8 @@ CreateTexture::CreateTexture(AbstractView *view, bool importFile) ModelNode CreateTexture::execute(const QString &filePath, AddTextureMode mode, int sceneId) { - if (m_importFile && !addFileToProject(filePath)) + Asset asset(filePath); + if (!asset.isValidTextureSource() || (m_importFile && !addFileToProject(filePath))) return {}; ModelNode texture = createTextureFromImage(filePath, mode); @@ -36,7 +38,7 @@ ModelNode CreateTexture::execute(const QString &filePath, AddTextureMode mode, i QTimer::singleShot(0, m_view, [this, texture]() { if (m_view->model()) - m_view->emitCustomNotification("selected_texture_changed", {texture}, {true}); + m_view->emitCustomNotification("select_texture", {texture}, {true}); }); return texture; diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index f8eb49d1101..bf2202717f9 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -503,8 +503,7 @@ void Edit3DWidget::dragEnterEvent(QDragEnterEvent *dragEnterEvent) || dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_BUNDLE_TEXTURE)) { const auto urls = dragEnterEvent->mimeData()->urls(); if (!urls.isEmpty()) { - Asset asset(urls.first().toLocalFile()); - if (asset.isTexture3D() || asset.isImage()) + if (Asset(urls.first().toLocalFile()).isValidTextureSource()) dragEnterEvent->acceptProposedAction(); } } else if (actionManager.externalDragHasSupportedAssets(dragEnterEvent->mimeData()) diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index 3b5364b6928..e0997ebad7f 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -164,7 +164,7 @@ WidgetInfo MaterialBrowserView::widgetInfo() MaterialBrowserTexturesModel *texturesModel = m_widget->materialBrowserTexturesModel().data(); connect(texturesModel, &MaterialBrowserTexturesModel::selectedIndexChanged, this, [&] (int idx) { ModelNode texNode = m_widget->materialBrowserTexturesModel()->textureAt(idx); - emitCustomNotification("selected_texture_changed", {texNode}, {}); + emitCustomNotification("selected_texture_changed", {texNode}); }); connect(texturesModel, &MaterialBrowserTexturesModel::duplicateTextureTriggered, this, [&] (const ModelNode &texture) { @@ -499,14 +499,14 @@ void MaterialBrowserView::customNotification(const AbstractView *view, const QList &nodeList, const QList &data) { - if (view == this) + if (view == this && identifier != "select_texture") return; - if (identifier == "selected_material_changed") { + if (identifier == "select_material") { int idx = m_widget->materialBrowserModel()->materialIndex(nodeList.first()); if (idx != -1) m_widget->materialBrowserModel()->selectMaterial(idx); - } else if (identifier == "selected_texture_changed") { + } else if (identifier == "select_texture") { int idx = m_widget->materialBrowserTexturesModel()->textureIndex(nodeList.first()); if (idx != -1) { m_widget->materialBrowserTexturesModel()->selectTexture(idx); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index 5eb685ff32a..b6783436d97 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -7,19 +7,19 @@ #include "materialbrowsertexturesmodel.h" #include "materialbrowserview.h" -#include -#include -#include -#include -#include -#include -#include - -#include +#include "asset.h" +#include "assetimageprovider.h" +#include "designeractionmanager.h" +#include "designermcumanager.h" +#include "documentmanager.h" +#include "hdrimage.h" +#include "qmldesignerconstants.h" +#include "qmldesignerplugin.h" +#include "theme.h" +#include "variantproperty.h" #include #include -#include #include #include @@ -273,6 +273,13 @@ void MaterialBrowserWidget::acceptBundleMaterialDrop() m_materialBrowserView->model()->endDrag(); } +bool MaterialBrowserWidget::hasAcceptableAssets(const QList &urls) +{ + return Utils::anyOf(urls, [](const QUrl &url) { + return Asset(url.toLocalFile()).isValidTextureSource(); + }); +} + void MaterialBrowserWidget::acceptBundleTextureDrop() { m_materialBrowserView->emitCustomNotification("drop_bundle_texture", {}, {}); // To ContentLibraryView @@ -284,6 +291,8 @@ void MaterialBrowserWidget::acceptAssetsDrop(const QList &urls) { QStringList assetPaths = Utils::transform(urls, [](const QUrl &url) { return url.toLocalFile(); }); m_materialBrowserView->createTextures(assetPaths); + if (m_materialBrowserView->model()) + m_materialBrowserView->model()->endDrag(); } void MaterialBrowserWidget::acceptTextureDropOnMaterial(int matIndex, const QString &texId) @@ -295,6 +304,9 @@ void MaterialBrowserWidget::acceptTextureDropOnMaterial(int matIndex, const QStr m_materialBrowserModel->selectMaterial(matIndex); m_materialBrowserView->applyTextureToMaterial({mat}, tex); } + + if (m_materialBrowserView->model()) + m_materialBrowserView->model()->endDrag(); } void MaterialBrowserWidget::focusMaterialSection(bool focusMatSec) diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h index e607f022546..40fc790a039 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h @@ -58,6 +58,7 @@ public: Q_INVOKABLE void startDragMaterial(int index, const QPointF &mousePos); Q_INVOKABLE void startDragTexture(int index, const QPointF &mousePos); Q_INVOKABLE void acceptBundleMaterialDrop(); + Q_INVOKABLE bool hasAcceptableAssets(const QList &urls); Q_INVOKABLE void acceptBundleTextureDrop(); Q_INVOKABLE void acceptAssetsDrop(const QList &urls); Q_INVOKABLE void acceptTextureDropOnMaterial(int matIndex, const QString &texId); diff --git a/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp b/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp index 3d19230c193..68e06fe349f 100644 --- a/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp +++ b/src/plugins/qmldesigner/qmldesignerprojectmanager.cpp @@ -107,9 +107,7 @@ auto makeCollectorDispatcherChain(ImageCacheCollector &nodeInstanceCollector, [](Utils::SmallStringView filePath, [[maybe_unused]] Utils::SmallStringView state, [[maybe_unused]] const QmlDesigner::ImageCache::AuxiliaryData &auxiliaryData) { - Asset asset {QString(filePath)}; - Asset::Type type = asset.type(); - return type == Asset::Type::Image || type == Asset::Type::Texture3D; + return Asset{QString(filePath)}.isValidTextureSource(); }, &textureImageCollector)); } diff --git a/src/plugins/qmldesigner/utils/asset.cpp b/src/plugins/qmldesigner/utils/asset.cpp index 1264630061b..60aa3b6d334 100644 --- a/src/plugins/qmldesigner/utils/asset.cpp +++ b/src/plugins/qmldesigner/utils/asset.cpp @@ -180,6 +180,11 @@ bool Asset::isSupported() const return m_type != Asset::Type::Unknown; } +bool Asset::isValidTextureSource() +{ + return isImage() || isTexture3D(); +} + void Asset::resolveType() { if (m_suffix.isEmpty()) diff --git a/src/plugins/qmldesigner/utils/asset.h b/src/plugins/qmldesigner/utils/asset.h index dce8c47e8ac..0b437352476 100644 --- a/src/plugins/qmldesigner/utils/asset.h +++ b/src/plugins/qmldesigner/utils/asset.h @@ -52,6 +52,7 @@ public: bool isKtxFile() const; bool isEffect() const; bool isSupported() const; + bool isValidTextureSource(); private: void resolveType();