summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorten Sørvig <[email protected]>2024-11-14 22:03:48 +0100
committerMorten Sørvig <[email protected]>2024-12-04 11:53:40 +0100
commit60982bd0b2366f3c9e248bc16eef230e4bb101d8 (patch)
tree6e54a43aadc68c36fd7c4c2eadecf18483805c03
parentea52aad50e3fd01f911b83a1d60bb3e72e1da67e (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.cpp9
-rw-r--r--src/plugins/platforms/wasm/qwasmevent.cpp21
-rw-r--r--src/plugins/platforms/wasm/qwasmevent.h2
-rw-r--r--src/plugins/platforms/wasm/qwasmwindowclientarea.cpp65
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)