diff options
author | Morten Sørvig <[email protected]> | 2024-11-14 22:03:48 +0100 |
---|---|---|
committer | Morten Sørvig <[email protected]> | 2024-12-04 11:53:40 +0100 |
commit | 60982bd0b2366f3c9e248bc16eef230e4bb101d8 (patch) | |
tree | 6e54a43aadc68c36fd7c4c2eadecf18483805c03 | |
parent | ea52aad50e3fd01f911b83a1d60bb3e72e1da67e (diff) |
wasm: streamline drag event handling
Set the event type from the event handler instead of
determining the event type at run-time based on string
comparison.
Change-Id: I1df299bd0c8fd1c989e4e283aa1cb04cddafc1ce
Reviewed-by: Even Oscar Andersen <[email protected]>
Reviewed-by: Lorn Potter <[email protected]>
-rw-r--r-- | src/plugins/platforms/wasm/qwasmdrag.cpp | 9 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmevent.cpp | 21 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmevent.h | 2 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmwindowclientarea.cpp | 65 |
4 files changed, 40 insertions, 57 deletions
diff --git a/src/plugins/platforms/wasm/qwasmdrag.cpp b/src/plugins/platforms/wasm/qwasmdrag.cpp index cf424557f28..730816b9a99 100644 --- a/src/plugins/platforms/wasm/qwasmdrag.cpp +++ b/src/plugins/platforms/wasm/qwasmdrag.cpp @@ -109,6 +109,9 @@ void QWasmDrag::onNativeDragStarted(DragEvent *event) { Q_ASSERT_X(event->type == EventType::DragStart, Q_FUNC_INFO, "The event is not a DragStart event"); + + event->webEvent.call<void>("preventDefault"); + // It is possible for a drag start event to arrive from another window. if (!m_dragState || m_dragState->window != event->targetWindow) { event->cancelDragStart(); @@ -124,6 +127,8 @@ void QWasmDrag::onNativeDragStarted(DragEvent *event) void QWasmDrag::onNativeDragOver(DragEvent *event) { + event->webEvent.call<void>("preventDefault"); + auto mimeDataPreview = event->dataTransfer.toMimeDataPreview(); const Qt::DropActions actions = m_dragState @@ -144,6 +149,8 @@ void QWasmDrag::onNativeDragOver(DragEvent *event) void QWasmDrag::onNativeDrop(DragEvent *event) { + event->webEvent.call<void>("preventDefault"); + QWasmWindow *wasmWindow = QWasmWindow::fromWindow(event->targetWindow); const auto screenElementPos = dom::mapPoint( @@ -183,12 +190,14 @@ void QWasmDrag::onNativeDrop(DragEvent *event) void QWasmDrag::onNativeDragFinished(DragEvent *event) { + event->webEvent.call<void>("preventDefault"); m_dragState->dropAction = event->dropAction; m_dragState->quitEventLoopClosure(); } void QWasmDrag::onNativeDragLeave(DragEvent *event) { + event->webEvent.call<void>("preventDefault"); m_dragState->dropAction = event->dropAction; event->dataTransfer.setDropAction(Qt::DropAction::IgnoreAction); } diff --git a/src/plugins/platforms/wasm/qwasmevent.cpp b/src/plugins/platforms/wasm/qwasmevent.cpp index 126a2023119..721418f42f1 100644 --- a/src/plugins/platforms/wasm/qwasmevent.cpp +++ b/src/plugins/platforms/wasm/qwasmevent.cpp @@ -193,27 +193,6 @@ DragEvent::DragEvent(EventType type, emscripten::val event, QWindow *window) })(); } -std::optional<DragEvent> DragEvent::fromWeb(emscripten::val event, QWindow *targetWindow) -{ - const auto eventType = ([&event]() -> std::optional<EventType> { - const auto eventTypeString = event["type"].as<std::string>(); - if (eventTypeString == "dragend") - return EventType::DragEnd; - if (eventTypeString == "dragover") - return EventType::DragOver; - if (eventTypeString == "dragstart") - return EventType::DragStart; - if (eventTypeString == "drop") - return EventType::Drop; - if (eventTypeString == "dragleave") - return EventType::DragLeave; - return std::nullopt; - })(); - if (!eventType) - return std::nullopt; - return DragEvent(*eventType, event, targetWindow); -} - void DragEvent::cancelDragStart() { Q_ASSERT_X(type == EventType::DragStart, Q_FUNC_INFO, "Only supported for DragStart"); diff --git a/src/plugins/platforms/wasm/qwasmevent.h b/src/plugins/platforms/wasm/qwasmevent.h index cee32747f90..913fb83d905 100644 --- a/src/plugins/platforms/wasm/qwasmevent.h +++ b/src/plugins/platforms/wasm/qwasmevent.h @@ -140,8 +140,6 @@ struct PointerEvent : public MouseEvent struct DragEvent : public MouseEvent { - static std::optional<DragEvent> fromWeb(emscripten::val webEvent, QWindow *targetQWindow); - DragEvent(EventType type, emscripten::val webEvent, QWindow *targetQWindow); void cancelDragStart(); diff --git a/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp b/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp index 04c3267bb65..4403740fa47 100644 --- a/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp +++ b/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp @@ -32,40 +32,37 @@ ClientArea::ClientArea(QWasmWindow *window, QWasmScreen *screen, emscripten::val [this](emscripten::val event){ processPointer(PointerEvent(EventType::PointerCancel, event)); } ); - element.call<void>("setAttribute", emscripten::val("draggable"), emscripten::val("true")); - - m_dragStartCallback = std::make_unique<qstdweb::EventCallback>( - element, "dragstart", [this](emscripten::val webEvent) { - webEvent.call<void>("preventDefault"); - auto event = *DragEvent::fromWeb(webEvent, m_window->window()); - QWasmDrag::instance()->onNativeDragStarted(&event); - }); - m_dragOverCallback = std::make_unique<qstdweb::EventCallback>( - element, "dragover", [this](emscripten::val webEvent) { - webEvent.call<void>("preventDefault"); - auto event = *DragEvent::fromWeb(webEvent, m_window->window()); - QWasmDrag::instance()->onNativeDragOver(&event); - }); - m_dropCallback = std::make_unique<qstdweb::EventCallback>( - element, "drop", [this](emscripten::val webEvent) { - webEvent.call<void>("preventDefault"); - auto event = *DragEvent::fromWeb(webEvent, m_window->window()); - QWasmDrag::instance()->onNativeDrop(&event); - }); - m_dragEndCallback = std::make_unique<qstdweb::EventCallback>( - element, "dragend", [this](emscripten::val webEvent) { - webEvent.call<void>("preventDefault"); - auto event = *DragEvent::fromWeb(webEvent, m_window->window()); - 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); - }); - + element.call<void>("setAttribute", emscripten::val("draggable"), emscripten::val("true")); + m_dragStartCallback = std::make_unique<qstdweb::EventCallback>(element, "dragstart", + [this](emscripten::val event) { + DragEvent dragEvent(EventType::DragStart, event, m_window->window()); + QWasmDrag::instance()->onNativeDragStarted(&dragEvent); + } + ); + m_dragOverCallback = std::make_unique<qstdweb::EventCallback>(element, "dragover", + [this](emscripten::val event) { + DragEvent dragEvent(EventType::DragOver, event, m_window->window()); + QWasmDrag::instance()->onNativeDragOver(&dragEvent); + } + ); + m_dropCallback = std::make_unique<qstdweb::EventCallback>(element, "drop", + [this](emscripten::val event) { + DragEvent dragEvent(EventType::Drop, event, m_window->window()); + QWasmDrag::instance()->onNativeDrop(&dragEvent); + } + ); + m_dragEndCallback = std::make_unique<qstdweb::EventCallback>(element, "dragend", + [this](emscripten::val event) { + DragEvent dragEvent(EventType::DragEnd, event, m_window->window()); + QWasmDrag::instance()->onNativeDragFinished(&dragEvent); + } + ); + m_dragLeaveCallback = std::make_unique<qstdweb::EventCallback>(element, "dragleave", + [this](emscripten::val event) { + DragEvent dragEvent(EventType::DragLeave, event, m_window->window()); + QWasmDrag::instance()->onNativeDragLeave(&dragEvent); + } + ); } void ClientArea::processPointer(const PointerEvent &event) |