diff --git a/src/plugins/platforms/wasm/qwasmdrag.cpp b/src/plugins/platforms/wasm/qwasmdrag.cpp index d07a46618fe..cf424557f28 100644 --- a/src/plugins/platforms/wasm/qwasmdrag.cpp +++ b/src/plugins/platforms/wasm/qwasmdrag.cpp @@ -187,6 +187,12 @@ void QWasmDrag::onNativeDragFinished(DragEvent *event) m_dragState->quitEventLoopClosure(); } +void QWasmDrag::onNativeDragLeave(DragEvent *event) +{ + m_dragState->dropAction = event->dropAction; + event->dataTransfer.setDropAction(Qt::DropAction::IgnoreAction); +} + QWasmDrag::DragState::DragImage::DragImage(const QPixmap &pixmap, const QMimeData *mimeData, QWindow *window) : m_temporaryImageElementParent(QWasmWindow::fromWindow(window)->containerElement()) diff --git a/src/plugins/platforms/wasm/qwasmdrag.h b/src/plugins/platforms/wasm/qwasmdrag.h index 146a69ebe89..e821470c913 100644 --- a/src/plugins/platforms/wasm/qwasmdrag.h +++ b/src/plugins/platforms/wasm/qwasmdrag.h @@ -32,6 +32,7 @@ class QWasmDrag final : public QSimpleDrag void onNativeDrop(DragEvent *event); void onNativeDragStarted(DragEvent *event); void onNativeDragFinished(DragEvent *event); + void onNativeDragLeave(DragEvent *event); // QPlatformDrag: Qt::DropAction drag(QDrag *drag) final; diff --git a/src/plugins/platforms/wasm/qwasmevent.cpp b/src/plugins/platforms/wasm/qwasmevent.cpp index e418263655b..5ff6f4f12cc 100644 --- a/src/plugins/platforms/wasm/qwasmevent.cpp +++ b/src/plugins/platforms/wasm/qwasmevent.cpp @@ -260,7 +260,6 @@ std::optional DragEvent::fromWeb(emscripten::val event, QWindow *targ { const auto eventType = ([&event]() -> std::optional { const auto eventTypeString = event["type"].as(); - if (eventTypeString == "dragend") return EventType::DragEnd; if (eventTypeString == "dragover") @@ -269,6 +268,8 @@ std::optional DragEvent::fromWeb(emscripten::val event, QWindow *targ return EventType::DragStart; if (eventTypeString == "drop") return EventType::Drop; + if (eventTypeString == "dragleave") + return EventType::DragLeave; return std::nullopt; })(); if (!eventType) diff --git a/src/plugins/platforms/wasm/qwasmevent.h b/src/plugins/platforms/wasm/qwasmevent.h index bd0fb39f115..82a17afc066 100644 --- a/src/plugins/platforms/wasm/qwasmevent.h +++ b/src/plugins/platforms/wasm/qwasmevent.h @@ -25,6 +25,7 @@ enum class EventType { DragEnd, DragOver, DragStart, + DragLeave, Drop, KeyDown, KeyUp, diff --git a/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp b/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp index 6da3e24c050..4a8d427e70b 100644 --- a/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp +++ b/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp @@ -60,6 +60,13 @@ ClientArea::ClientArea(QWasmWindow *window, QWasmScreen *screen, emscripten::val QWasmDrag::instance()->onNativeDragFinished(&event); }); + m_dragLeaveCallback = std::make_unique( + element, "dragleave", [this](emscripten::val webEvent) { + webEvent.call("preventDefault"); + auto event = *DragEvent::fromWeb(webEvent, m_window->window()); + QWasmDrag::instance()->onNativeDragLeave(&event); + }); + } bool ClientArea::processPointer(const PointerEvent &event) diff --git a/src/plugins/platforms/wasm/qwasmwindowclientarea.h b/src/plugins/platforms/wasm/qwasmwindowclientarea.h index ba745a59a8b..06b12fe544c 100644 --- a/src/plugins/platforms/wasm/qwasmwindowclientarea.h +++ b/src/plugins/platforms/wasm/qwasmwindowclientarea.h @@ -40,6 +40,7 @@ class ClientArea std::unique_ptr m_dragStartCallback; std::unique_ptr m_dragEndCallback; std::unique_ptr m_dropCallback; + std::unique_ptr m_dragLeaveCallback; QMap m_pointerIdToTouchPoints;