diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml index 220262c2ae3..6c7586722d4 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml @@ -48,11 +48,17 @@ Rectangle { onEntered: (drag) => { drag.accepted = drag.formats[0] === "application/vnd.qtdesignstudio.texture" + || (drag.formats[0] === "application/vnd.qtdesignstudio.assets" + && rootView.hasAcceptableAssets(drag.urls)) } onDropped: (drag) => { drag.accept() - rootView.acceptTextureDropOnMaterial(index, drag.getDataAsString(drag.keys[0])) + + if (drag.formats[0] === "application/vnd.qtdesignstudio.texture") + rootView.acceptTextureDropOnMaterial(index, drag.getDataAsString(drag.keys[0])) + else if (drag.formats[0] === "application/vnd.qtdesignstudio.assets") + rootView.acceptAssetsDropOnMaterial(index, drag.urls) } } diff --git a/src/plugins/qmldesigner/components/createtexture.h b/src/plugins/qmldesigner/components/createtexture.h index 27a4c5870e4..52a073b7ec0 100644 --- a/src/plugins/qmldesigner/components/createtexture.h +++ b/src/plugins/qmldesigner/components/createtexture.h @@ -19,7 +19,7 @@ class CreateTexture : public QObject public: CreateTexture(AbstractView *view, bool importFiles = false); - ModelNode execute(const QString &filePath, AddTextureMode mode, int sceneId = -1); + ModelNode execute(const QString &filePath, AddTextureMode mode = AddTextureMode::Texture, int sceneId = -1); ModelNode resolveSceneEnv(int sceneId); void assignTextureAsLightProbe(const ModelNode &texture, int sceneId); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index e0997ebad7f..928dc1ec47c 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -221,7 +221,7 @@ WidgetInfo MaterialBrowserView::widgetInfo() void MaterialBrowserView::createTextures(const QStringList &assetPaths) { - auto *create = new CreateTextures(this, false); + auto *create = new CreateTextures(this); executeInTransaction("MaterialBrowserView::createTextures", [&]() { create->execute(assetPaths, AddTextureMode::Texture, m_sceneId); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index b6783436d97..2646bb75ab5 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -3,6 +3,7 @@ #include "materialbrowserwidget.h" +#include "createtexture.h" #include "materialbrowsermodel.h" #include "materialbrowsertexturesmodel.h" #include "materialbrowserview.h" @@ -295,6 +296,28 @@ void MaterialBrowserWidget::acceptAssetsDrop(const QList &urls) m_materialBrowserView->model()->endDrag(); } +void MaterialBrowserWidget::acceptAssetsDropOnMaterial(int matIndex, const QList &urls) +{ + ModelNode mat = m_materialBrowserModel->materialAt(matIndex); + QTC_ASSERT(mat.isValid(), return); + + auto *creator = new CreateTexture(m_materialBrowserView); + + QString imageSrc = Utils::findOrDefault(urls, [] (const QUrl &url) { + return Asset(url.toLocalFile()).isValidTextureSource(); + }).toLocalFile(); + + m_materialBrowserView->executeInTransaction(__FUNCTION__, [&] { + ModelNode tex = creator->execute(imageSrc); + QTC_ASSERT(tex.isValid(), return); + + m_materialBrowserModel->selectMaterial(matIndex); + m_materialBrowserView->applyTextureToMaterial({mat}, tex); + }); + + creator->deleteLater(); +} + void MaterialBrowserWidget::acceptTextureDropOnMaterial(int matIndex, const QString &texId) { ModelNode mat = m_materialBrowserModel->materialAt(matIndex); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h index 40fc790a039..9de485e260c 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h @@ -61,6 +61,7 @@ public: Q_INVOKABLE bool hasAcceptableAssets(const QList &urls); Q_INVOKABLE void acceptBundleTextureDrop(); Q_INVOKABLE void acceptAssetsDrop(const QList &urls); + Q_INVOKABLE void acceptAssetsDropOnMaterial(int matIndex, const QList &urls); Q_INVOKABLE void acceptTextureDropOnMaterial(int matIndex, const QString &texId); Q_INVOKABLE void focusMaterialSection(bool focusMatSec);