From 230c1331ee22d0998db12b8c39857b52f507711f Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Tue, 7 Mar 2023 18:48:12 +0200 Subject: [PATCH] QmlDesigner: Implement dragging a bundle texture to a material Fixes: QDS-9375 Change-Id: Id73e54341e12ec023bb0b55ddffdb7f6b89e2267 Reviewed-by: Reviewed-by: Miikka Heikkinen --- .../materialBrowserQmlSource/MaterialItem.qml | 3 +++ .../materialbrowser/materialbrowserwidget.cpp | 18 ++++++++++++++++++ .../materialbrowser/materialbrowserwidget.h | 1 + 3 files changed, 22 insertions(+) diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml index 6c7586722d4..59eabcb74b9 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml @@ -48,6 +48,7 @@ Rectangle { onEntered: (drag) => { drag.accepted = drag.formats[0] === "application/vnd.qtdesignstudio.texture" + || drag.formats[0] === "application/vnd.qtdesignstudio.bundletexture" || (drag.formats[0] === "application/vnd.qtdesignstudio.assets" && rootView.hasAcceptableAssets(drag.urls)) } @@ -57,6 +58,8 @@ Rectangle { if (drag.formats[0] === "application/vnd.qtdesignstudio.texture") rootView.acceptTextureDropOnMaterial(index, drag.getDataAsString(drag.keys[0])) + else if (drag.formats[0] === "application/vnd.qtdesignstudio.bundletexture") + rootView.acceptBundleTextureDropOnMaterial(index, drag.urls[0]) else if (drag.formats[0] === "application/vnd.qtdesignstudio.assets") rootView.acceptAssetsDropOnMaterial(index, drag.urls) } diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index 2646bb75ab5..61425cadfb8 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -288,6 +288,24 @@ void MaterialBrowserWidget::acceptBundleTextureDrop() m_materialBrowserView->model()->endDrag(); } +void MaterialBrowserWidget::acceptBundleTextureDropOnMaterial(int matIndex, const QUrl &bundleTexPath) +{ + ModelNode mat = m_materialBrowserModel->materialAt(matIndex); + QTC_ASSERT(mat.isValid(), return); + + auto *creator = new CreateTexture(m_materialBrowserView, true); + + m_materialBrowserView->executeInTransaction(__FUNCTION__, [&] { + ModelNode tex = creator->execute(bundleTexPath.toLocalFile()); + QTC_ASSERT(tex.isValid(), return); + + m_materialBrowserModel->selectMaterial(matIndex); + m_materialBrowserView->applyTextureToMaterial({mat}, tex); + }); + + creator->deleteLater(); +} + void MaterialBrowserWidget::acceptAssetsDrop(const QList &urls) { QStringList assetPaths = Utils::transform(urls, [](const QUrl &url) { return url.toLocalFile(); }); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h index 9de485e260c..a1169ead7f4 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h @@ -60,6 +60,7 @@ public: Q_INVOKABLE void acceptBundleMaterialDrop(); Q_INVOKABLE bool hasAcceptableAssets(const QList &urls); Q_INVOKABLE void acceptBundleTextureDrop(); + Q_INVOKABLE void acceptBundleTextureDropOnMaterial(int matIndex, const QUrl &bundleTexPath); 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);