diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml index 8b1acabe9e9..dda1907dcbb 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml @@ -234,6 +234,22 @@ Item { width: root.width caption: qsTr("Textures") + dropEnabled: true + + onDropEnter: (drag) => { + drag.accepted = drag.formats[0] === "application/vnd.qtdesignstudio.bundletexture" + highlight = drag.accepted + } + + onDropExit: { + highlight = false + } + + onDrop: { + highlight = false + rootView.acceptBundleTextureDrop() + } + Grid { width: scrollView.width leftPadding: 5 @@ -290,6 +306,21 @@ Item { enabled: root.enableUiElements } } + + DropArea { + id: masterDropArea + + property int emptyHeight: scrollView.height - materialsSection.height - texturesSection.height + + width: root.width + height: emptyHeight > 0 ? emptyHeight : 0 + + enabled: true + + onEntered: (drag) => texturesSection.dropEnter(drag) + onDropped: (drag) => texturesSection.drop(drag) + onExited: texturesSection.dropExit() + } } } } diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp index 8071363e2a7..e9221b160d3 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp @@ -8,6 +8,7 @@ #include "contentlibrarywidget.h" #include "contentlibrarymaterial.h" #include "contentlibrarymaterialsmodel.h" +#include "contentlibrarytexture.h" #include "contentlibrarytexturesmodel.h" #include "modelnodeoperations.h" #include "nodelistproperty.h" @@ -49,6 +50,10 @@ WidgetInfo ContentLibraryView::widgetInfo() [&] (QmlDesigner::ContentLibraryMaterial *mat) { m_draggedBundleMaterial = mat; }); + connect(m_widget, &ContentLibraryWidget::bundleTextureDragStarted, this, + [&] (QmlDesigner::ContentLibraryTexture *tex) { + m_draggedBundleTexture = tex; + }); connect(m_widget, &ContentLibraryWidget::addTextureRequested, this, [&] (const QString texPath, ContentLibraryWidget::AddTextureMode mode) { executeInTransaction("ContentLibraryView::widgetInfo", [&] { @@ -237,6 +242,14 @@ void ContentLibraryView::customNotification(const AbstractView *view, const QStr } m_draggedBundleMaterial = nullptr; + } else if (identifier == "drop_bundle_texture") { + ModelNode matLib = materialLibraryNode(); + if (!matLib.isValid()) + return; + + m_widget->addTexture(m_draggedBundleTexture); + + m_draggedBundleTexture = nullptr; } } diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h index a55d7d772fa..aae27c91406 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h @@ -12,6 +12,7 @@ namespace QmlDesigner { class ContentLibraryMaterial; +class ContentLibraryTexture; class ContentLibraryWidget; class Model; @@ -47,6 +48,7 @@ private: QList m_bundleMaterialTargets; QList m_selectedModels; // selected 3D model nodes ContentLibraryMaterial *m_draggedBundleMaterial = nullptr; + ContentLibraryTexture *m_draggedBundleTexture = nullptr; ModelNode m_activeSceneEnv; bool m_bundleMaterialAddToSelected = false; bool m_hasQuick3DImport = false; diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp index 99a24e70b40..729e41b6932 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp @@ -58,11 +58,6 @@ bool ContentLibraryWidget::eventFilter(QObject *obj, QEvent *event) mimeData->setData(Constants::MIME_TYPE_BUNDLE_MATERIAL, data); mimeData->removeFormat("text/plain"); - if (!m_draggedMaterial) { - m_draggedMaterial = m_materialToDrag; - emit draggedMaterialChanged(); - } - emit bundleMaterialDragStarted(m_materialToDrag); model->startDrag(mimeData, m_materialToDrag->icon().toLocalFile()); m_materialToDrag = nullptr; @@ -77,6 +72,7 @@ bool ContentLibraryWidget::eventFilter(QObject *obj, QEvent *event) mimeData->setData(Constants::MIME_TYPE_BUNDLE_TEXTURE, data); mimeData->removeFormat("text/plain"); + emit bundleTextureDragStarted(m_textureToDrag); model->startDrag(mimeData, m_textureToDrag->icon().toLocalFile()); m_textureToDrag = nullptr; } @@ -84,11 +80,6 @@ bool ContentLibraryWidget::eventFilter(QObject *obj, QEvent *event) } else if (event->type() == QMouseEvent::MouseButtonRelease) { m_materialToDrag = nullptr; m_textureToDrag = nullptr; - - if (m_draggedMaterial) { - m_draggedMaterial = nullptr; - emit draggedMaterialChanged(); - } } return QObject::eventFilter(obj, event); diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h index 1c14794c6c2..ec0b26cbc22 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h @@ -49,7 +49,7 @@ public: signals: void bundleMaterialDragStarted(QmlDesigner::ContentLibraryMaterial *bundleMat); - void draggedMaterialChanged(); + void bundleTextureDragStarted(QmlDesigner::ContentLibraryTexture *bundleTex); void addTextureRequested(const QString texPath, QmlDesigner::ContentLibraryWidget::AddTextureMode mode); protected: @@ -70,7 +70,6 @@ private: QString m_filterText; ContentLibraryMaterial *m_materialToDrag = nullptr; - ContentLibraryMaterial *m_draggedMaterial = nullptr; ContentLibraryTexture *m_textureToDrag = nullptr; QPoint m_dragStartPoint; }; diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index d411d6b825c..541bb385f67 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -257,6 +257,11 @@ void MaterialBrowserWidget::acceptBundleMaterialDrop() m_materialBrowserView->emitCustomNotification("drop_bundle_material", {}, {}); // To ContentLibraryView } +void MaterialBrowserWidget::acceptBundleTextureDrop() +{ + m_materialBrowserView->emitCustomNotification("drop_bundle_texture", {}, {}); // To ContentLibraryView +} + QString MaterialBrowserWidget::qmlSourcesPath() { #ifdef SHARE_QML_PATH diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h index 8e868a69864..929900d52bb 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h @@ -52,6 +52,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 void acceptBundleTextureDrop(); QQuickWidget *quickWidget() const;