wasm: add dragleave event handling

Fixes: QTBUG-129149
Change-Id: I946f43e3a696c801a60a9a209a70ccaf57252a60
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Reviewed-by: Piotr Wierciński <piotr.wiercinski@qt.io>
(cherry picked from commit 8a93093271329f1fb867c0627e63f61ed7330860)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Lorn Potter 2024-09-24 15:23:11 +10:00 committed by Qt Cherry-pick Bot
parent a12be9e909
commit 8375adcbe4
6 changed files with 18 additions and 1 deletions

View File

@ -187,6 +187,12 @@ void QWasmDrag::onNativeDragFinished(DragEvent *event)
m_dragState->quitEventLoopClosure(); 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, QWasmDrag::DragState::DragImage::DragImage(const QPixmap &pixmap, const QMimeData *mimeData,
QWindow *window) QWindow *window)
: m_temporaryImageElementParent(QWasmWindow::fromWindow(window)->containerElement()) : m_temporaryImageElementParent(QWasmWindow::fromWindow(window)->containerElement())

View File

@ -32,6 +32,7 @@ public:
void onNativeDrop(DragEvent *event); void onNativeDrop(DragEvent *event);
void onNativeDragStarted(DragEvent *event); void onNativeDragStarted(DragEvent *event);
void onNativeDragFinished(DragEvent *event); void onNativeDragFinished(DragEvent *event);
void onNativeDragLeave(DragEvent *event);
// QPlatformDrag: // QPlatformDrag:
Qt::DropAction drag(QDrag *drag) final; Qt::DropAction drag(QDrag *drag) final;

View File

@ -260,7 +260,6 @@ std::optional<DragEvent> DragEvent::fromWeb(emscripten::val event, QWindow *targ
{ {
const auto eventType = ([&event]() -> std::optional<EventType> { const auto eventType = ([&event]() -> std::optional<EventType> {
const auto eventTypeString = event["type"].as<std::string>(); const auto eventTypeString = event["type"].as<std::string>();
if (eventTypeString == "dragend") if (eventTypeString == "dragend")
return EventType::DragEnd; return EventType::DragEnd;
if (eventTypeString == "dragover") if (eventTypeString == "dragover")
@ -269,6 +268,8 @@ std::optional<DragEvent> DragEvent::fromWeb(emscripten::val event, QWindow *targ
return EventType::DragStart; return EventType::DragStart;
if (eventTypeString == "drop") if (eventTypeString == "drop")
return EventType::Drop; return EventType::Drop;
if (eventTypeString == "dragleave")
return EventType::DragLeave;
return std::nullopt; return std::nullopt;
})(); })();
if (!eventType) if (!eventType)

View File

@ -25,6 +25,7 @@ enum class EventType {
DragEnd, DragEnd,
DragOver, DragOver,
DragStart, DragStart,
DragLeave,
Drop, Drop,
KeyDown, KeyDown,
KeyUp, KeyUp,

View File

@ -60,6 +60,13 @@ ClientArea::ClientArea(QWasmWindow *window, QWasmScreen *screen, emscripten::val
QWasmDrag::instance()->onNativeDragFinished(&event); QWasmDrag::instance()->onNativeDragFinished(&event);
}); });
m_dragLeaveCallback = std::make_unique<qstdweb::EventCallback>(
element, "dragleave", [this](emscripten::val webEvent) {
webEvent.call<void>("preventDefault");
auto event = *DragEvent::fromWeb(webEvent, m_window->window());
QWasmDrag::instance()->onNativeDragLeave(&event);
});
} }
bool ClientArea::processPointer(const PointerEvent &event) bool ClientArea::processPointer(const PointerEvent &event)

View File

@ -40,6 +40,7 @@ private:
std::unique_ptr<qstdweb::EventCallback> m_dragStartCallback; std::unique_ptr<qstdweb::EventCallback> m_dragStartCallback;
std::unique_ptr<qstdweb::EventCallback> m_dragEndCallback; std::unique_ptr<qstdweb::EventCallback> m_dragEndCallback;
std::unique_ptr<qstdweb::EventCallback> m_dropCallback; std::unique_ptr<qstdweb::EventCallback> m_dropCallback;
std::unique_ptr<qstdweb::EventCallback> m_dragLeaveCallback;
QMap<int, QWindowSystemInterface::TouchPoint> m_pointerIdToTouchPoints; QMap<int, QWindowSystemInterface::TouchPoint> m_pointerIdToTouchPoints;