summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@gmail.com>2023-10-05 13:07:00 +1000
committerLorn Potter <lorn.potter@gmail.com>2023-12-20 00:44:28 +0000
commit585f348f3c8137cec4ab503eecc28296da2798f7 (patch)
treee180bb312b11733d48e7443414e58b3289eab905
parentc6d3b91549ceaafa81cbcedf243f798f1114a467 (diff)
wasm: add QWindow parameter to DragEvent
Perparing for enhanced Darg Drop support Done-with: Mikolaj.Boc@qt.io Change-Id: I24ce72570ce0754c8a5c152a92192eebeae5b340 Pick-to: 6.7 Reviewed-by: Lorn Potter <lorn.potter@gmail.com>
-rw-r--r--src/plugins/platforms/wasm/qwasmevent.cpp41
-rw-r--r--src/plugins/platforms/wasm/qwasmevent.h18
-rw-r--r--src/plugins/platforms/wasm/qwasmwindow.cpp8
-rw-r--r--src/plugins/platforms/wasm/qwasmwindowclientarea.cpp2
-rw-r--r--src/plugins/platforms/wasm/qwasmwindownonclientarea.cpp4
5 files changed, 55 insertions, 18 deletions
diff --git a/src/plugins/platforms/wasm/qwasmevent.cpp b/src/plugins/platforms/wasm/qwasmevent.cpp
index 6353cce48f..5a50a4d14d 100644
--- a/src/plugins/platforms/wasm/qwasmevent.cpp
+++ b/src/plugins/platforms/wasm/qwasmevent.cpp
@@ -86,7 +86,10 @@ QFlags<Qt::KeyboardModifier> getForEvent<EmscriptenKeyboardEvent>(
}
} // namespace KeyboardModifier
-Event::Event(EventType type, emscripten::val target) : type(type), target(target) { }
+Event::Event(EventType type, emscripten::val webEvent)
+ : webEvent(webEvent), type(type)
+{
+}
Event::~Event() = default;
@@ -98,7 +101,7 @@ Event &Event::operator=(const Event &other) = default;
Event &Event::operator=(Event &&other) = default;
-KeyEvent::KeyEvent(EventType type, emscripten::val event) : Event(type, event["target"])
+KeyEvent::KeyEvent(EventType type, emscripten::val event) : Event(type, event)
{
const auto code = event["code"].as<std::string>();
const auto webKey = event["key"].as<std::string>();
@@ -143,7 +146,7 @@ std::optional<KeyEvent> KeyEvent::fromWebWithDeadKeyTranslation(emscripten::val
return result;
}
-MouseEvent::MouseEvent(EventType type, emscripten::val event) : Event(type, event["target"])
+MouseEvent::MouseEvent(EventType type, emscripten::val event) : Event(type, event)
{
mouseButton = MouseEvent::buttonFromWeb(event["button"].as<int>());
mouseButtons = MouseEvent::buttonsFromWeb(event["buttons"].as<unsigned short>());
@@ -218,8 +221,8 @@ std::optional<PointerEvent> PointerEvent::fromWeb(emscripten::val event)
return PointerEvent(*eventType, event);
}
-DragEvent::DragEvent(EventType type, emscripten::val event)
- : MouseEvent(type, event), dataTransfer(event["dataTransfer"])
+DragEvent::DragEvent(EventType type, emscripten::val event, QWindow *window)
+ : MouseEvent(type, event), dataTransfer(event["dataTransfer"]), targetWindow(window)
{
dropAction = ([event]() {
const std::string effect = event["dataTransfer"]["dropEffect"].as<std::string>();
@@ -244,18 +247,42 @@ DragEvent &DragEvent::operator=(const DragEvent &other) = default;
DragEvent &DragEvent::operator=(DragEvent &&other) = default;
-std::optional<DragEvent> DragEvent::fromWeb(emscripten::val event)
+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;
return std::nullopt;
})();
if (!eventType)
return std::nullopt;
- return DragEvent(*eventType, event);
+ return DragEvent(*eventType, event, targetWindow);
+}
+
+void DragEvent::cancelDragStart()
+{
+ Q_ASSERT_X(type == EventType::DragStart, Q_FUNC_INFO, "Only supported for DragStart");
+ webEvent.call<void>("preventDefault");
+}
+
+void DragEvent::acceptDragOver()
+{
+ Q_ASSERT_X(type == EventType::DragOver, Q_FUNC_INFO, "Only supported for DragOver");
+ webEvent.call<void>("preventDefault");
+}
+
+void DragEvent::acceptDrop()
+{
+ Q_ASSERT_X(type == EventType::Drop, Q_FUNC_INFO, "Only supported for Drop");
+ webEvent.call<void>("preventDefault");
}
WheelEvent::WheelEvent(EventType type, emscripten::val event) : MouseEvent(type, event)
diff --git a/src/plugins/platforms/wasm/qwasmevent.h b/src/plugins/platforms/wasm/qwasmevent.h
index 012b1b235b..5ad441f2fb 100644
--- a/src/plugins/platforms/wasm/qwasmevent.h
+++ b/src/plugins/platforms/wasm/qwasmevent.h
@@ -18,8 +18,12 @@
QT_BEGIN_NAMESPACE
class QWasmDeadKeySupport;
+class QWindow;
enum class EventType {
+ DragEnd,
+ DragOver,
+ DragStart,
Drop,
KeyDown,
KeyUp,
@@ -119,15 +123,16 @@ QFlags<Qt::KeyboardModifier> getForEvent<EmscriptenKeyboardEvent>(
struct Event
{
- Event(EventType type, emscripten::val target);
+ Event(EventType type, emscripten::val webEvent);
~Event();
Event(const Event &other);
Event(Event &&other);
Event &operator=(const Event &other);
Event &operator=(Event &&other);
+ emscripten::val webEvent;
EventType type;
- emscripten::val target = emscripten::val::undefined();
+ emscripten::val target() const { return webEvent["target"]; }
};
struct KeyEvent : public Event
@@ -221,17 +226,22 @@ struct PointerEvent : public MouseEvent
struct DragEvent : public MouseEvent
{
- static std::optional<DragEvent> fromWeb(emscripten::val webEvent);
+ static std::optional<DragEvent> fromWeb(emscripten::val webEvent, QWindow *targetQWindow);
- DragEvent(EventType type, emscripten::val webEvent);
+ DragEvent(EventType type, emscripten::val webEvent, QWindow *targetQWindow);
~DragEvent();
DragEvent(const DragEvent &other);
DragEvent(DragEvent &&other);
DragEvent &operator=(const DragEvent &other);
DragEvent &operator=(DragEvent &&other);
+ void cancelDragStart();
+ void acceptDragOver();
+ void acceptDrop();
+
Qt::DropAction dropAction;
emscripten::val dataTransfer;
+ QWindow *targetWindow;
};
struct WheelEvent : public MouseEvent
diff --git a/src/plugins/platforms/wasm/qwasmwindow.cpp b/src/plugins/platforms/wasm/qwasmwindow.cpp
index 11ce724b01..bf2fdf4773 100644
--- a/src/plugins/platforms/wasm/qwasmwindow.cpp
+++ b/src/plugins/platforms/wasm/qwasmwindow.cpp
@@ -117,7 +117,7 @@ QWasmWindow::QWasmWindow(QWindow *w, QWasmDeadKeySupport *deadKeySupport,
m_dropCallback = std::make_unique<qstdweb::EventCallback>(
m_qtWindow, "drop", [this](emscripten::val event) {
- if (processDrop(*DragEvent::fromWeb(event)))
+ if (processDrop(*DragEvent::fromWeb(event, window())))
event.call<void>("preventDefault");
});
@@ -188,7 +188,7 @@ void QWasmWindow::onNonClientAreaInteraction()
bool QWasmWindow::onNonClientEvent(const PointerEvent &event)
{
QPointF pointInScreen = platformScreen()->mapFromLocal(
- dom::mapPoint(event.target, platformScreen()->element(), event.localPoint));
+ dom::mapPoint(event.target(), platformScreen()->element(), event.localPoint));
return QWindowSystemInterface::handleMouseEvent(
window(), QWasmIntegration::getTimestamp(), window()->mapFromGlobal(pointInScreen),
pointInScreen, event.mouseButtons, event.mouseButton,
@@ -521,7 +521,7 @@ bool QWasmWindow::processPointer(const PointerEvent &event)
switch (event.type) {
case EventType::PointerEnter: {
const auto pointInScreen = platformScreen()->mapFromLocal(
- dom::mapPoint(event.target, platformScreen()->element(), event.localPoint));
+ dom::mapPoint(event.target(), platformScreen()->element(), event.localPoint));
QWindowSystemInterface::handleEnterEvent(
window(), m_window->mapFromGlobal(pointInScreen), pointInScreen);
break;
@@ -575,7 +575,7 @@ bool QWasmWindow::processWheel(const WheelEvent &event)
})();
const auto pointInScreen = platformScreen()->mapFromLocal(
- dom::mapPoint(event.target, platformScreen()->element(), event.localPoint));
+ dom::mapPoint(event.target(), platformScreen()->element(), event.localPoint));
return QWindowSystemInterface::handleWheelEvent(
window(), QWasmIntegration::getTimestamp(), window()->mapFromGlobal(pointInScreen),
diff --git a/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp b/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp
index d6a73116cb..0cea2690c4 100644
--- a/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp
+++ b/src/plugins/platforms/wasm/qwasmwindowclientarea.cpp
@@ -57,7 +57,7 @@ bool ClientArea::processPointer(const PointerEvent &event)
bool ClientArea::deliverEvent(const PointerEvent &event)
{
const auto pointInScreen = m_screen->mapFromLocal(
- dom::mapPoint(event.target, m_screen->element(), event.localPoint));
+ dom::mapPoint(event.target(), m_screen->element(), event.localPoint));
const auto geometryF = m_screen->geometry().toRectF();
const QPointF targetPointClippedToScreen(
diff --git a/src/plugins/platforms/wasm/qwasmwindownonclientarea.cpp b/src/plugins/platforms/wasm/qwasmwindownonclientarea.cpp
index 00ae1aaeb3..00fa8fb236 100644
--- a/src/plugins/platforms/wasm/qwasmwindownonclientarea.cpp
+++ b/src/plugins/platforms/wasm/qwasmwindownonclientarea.cpp
@@ -208,7 +208,7 @@ void Resizer::startResize(Qt::Edges resizeEdges, const PointerEvent &event)
m_currentResizeData.reset(new ResizeData{
.edges = resizeEdges,
.originInScreenCoords = dom::mapPoint(
- event.target, m_window->platformScreen()->element(), event.localPoint),
+ event.target(), m_window->platformScreen()->element(), event.localPoint),
});
const auto resizeConstraints = getResizeConstraints();
@@ -225,7 +225,7 @@ void Resizer::startResize(Qt::Edges resizeEdges, const PointerEvent &event)
void Resizer::continueResize(const PointerEvent &event)
{
const auto pointInScreen =
- dom::mapPoint(event.target, m_window->platformScreen()->element(), event.localPoint);
+ dom::mapPoint(event.target(), m_window->platformScreen()->element(), event.localPoint);
const auto amount = (pointInScreen - m_currentResizeData->originInScreenCoords).toPoint();
const QPoint cappedGrowVector(
std::min(m_currentResizeData->maxGrow.x(),