diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml index ad9356d44db..1e8cdfda5d1 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml @@ -187,6 +187,21 @@ Item { width: root.width caption: qsTr("Materials") hideHeader: !materialBrowserBundleModel.matBundleExists + dropEnabled: true + + onDropEnter: (drag) => { + drag.accepted = rootView.draggedBundleMaterial + userMaterialsSection.highlight = rootView.draggedBundleMaterial + } + + onDropExit: { + userMaterialsSection.highlight = false + } + + onDrop: { + userMaterialsSection.highlight = false + materialBrowserBundleModel.addToProject(rootView.draggedBundleMaterial) + } Grid { id: grid diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index 333c579e26d..0d4e36590c2 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -139,14 +139,24 @@ bool MaterialBrowserWidget::eventFilter(QObject *obj, QEvent *event) mimeData->setData(Constants::MIME_TYPE_BUNDLE_MATERIAL, data); mimeData->removeFormat("text/plain"); + if (!m_draggedBundleMaterial) { + m_draggedBundleMaterial = m_bundleMaterialToDrag; + emit draggedBundleMaterialChanged(); + } + emit bundleMaterialDragStarted(m_bundleMaterialToDrag); model->startDrag(mimeData, m_bundleMaterialToDrag->icon().toLocalFile()); - m_bundleMaterialToDrag = {}; + m_bundleMaterialToDrag = nullptr; } } } else if (event->type() == QMouseEvent::MouseButtonRelease) { m_materialToDrag = {}; - m_bundleMaterialToDrag = {}; + m_bundleMaterialToDrag = nullptr; + + if (m_draggedBundleMaterial) { + m_draggedBundleMaterial = nullptr; + emit draggedBundleMaterialChanged(); + } } return QObject::eventFilter(obj, event); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h index 0d50a84cc60..638d3c048a3 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h @@ -58,6 +58,7 @@ class PreviewImageProvider; class MaterialBrowserWidget : public QFrame { Q_OBJECT + Q_PROPERTY(BundleMaterial *draggedBundleMaterial MEMBER m_draggedBundleMaterial NOTIFY draggedBundleMaterialChanged) public: MaterialBrowserWidget(MaterialBrowserView *view); @@ -81,6 +82,7 @@ public: signals: void bundleMaterialDragStarted(QmlDesigner::BundleMaterial *bundleMat); + void draggedBundleMaterialChanged(); protected: bool eventFilter(QObject *obj, QEvent *event) override; @@ -102,6 +104,7 @@ private: ModelNode m_materialToDrag; BundleMaterial *m_bundleMaterialToDrag = nullptr; + BundleMaterial *m_draggedBundleMaterial = nullptr; QPoint m_dragStartPoint; };