From 8a93093271329f1fb867c0627e63f61ed7330860 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Tue, 24 Sep 2024 15:23:11 +1000 Subject: [PATCH] wasm: add dragleave event handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: QTBUG-129149 Pick-to: 6.8 Change-Id: I946f43e3a696c801a60a9a209a70ccaf57252a60 Reviewed-by: Morten Johan Sørvig Reviewed-by: Piotr Wierciński --- src/plugins/platforms/wasm/qwasmdrag.cpp | 6 ++++++ src/plugins/platforms/wasm/qwasmdrag.h | 1 + src/plugins/platforms/wasm/qwasmevent.cpp | 3 ++- src/plugins/platforms/wasm/qwasmevent.h | 1 + src/plugins/platforms/wasm/qwasmwindowclientarea.cpp | 7 +++++++ src/plugins/platforms/wasm/qwasmwindowclientarea.h | 1 + 6 files changed, 18 insertions(+), 1 deletion(-) 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;