summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmevent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmevent.cpp')
-rw-r--r--src/plugins/platforms/wasm/qwasmevent.cpp113
1 files changed, 93 insertions, 20 deletions
diff --git a/src/plugins/platforms/wasm/qwasmevent.cpp b/src/plugins/platforms/wasm/qwasmevent.cpp
index 19730c2c68..b6568e13fa 100644
--- a/src/plugins/platforms/wasm/qwasmevent.cpp
+++ b/src/plugins/platforms/wasm/qwasmevent.cpp
@@ -16,10 +16,63 @@ QFlags<Qt::KeyboardModifier> getForEvent<EmscriptenKeyboardEvent>(
}
} // namespace KeyboardModifier
-std::optional<PointerEvent> PointerEvent::fromWeb(emscripten::val event)
+Event::Event(EventType type, emscripten::val target) : type(type), target(target) { }
+
+Event::~Event() = default;
+
+Event::Event(const Event &other) = default;
+
+Event::Event(Event &&other) = default;
+
+Event &Event::operator=(const Event &other) = default;
+
+Event &Event::operator=(Event &&other) = default;
+
+MouseEvent::MouseEvent(EventType type, emscripten::val event) : Event(type, event["target"])
+{
+ mouseButton = MouseEvent::buttonFromWeb(event["button"].as<int>());
+ mouseButtons = MouseEvent::buttonsFromWeb(event["buttons"].as<unsigned short>());
+ // The current button state (event.buttons) may be out of sync for some PointerDown
+ // events where the "down" state is very brief, for example taps on Apple trackpads.
+ // Qt expects that the current button state is in sync with the event, so we sync
+ // it up here.
+ if (type == EventType::PointerDown)
+ mouseButtons |= mouseButton;
+ localPoint = QPoint(event["offsetX"].as<int>(), event["offsetY"].as<int>());
+ pointInPage = QPoint(event["pageX"].as<int>(), event["pageY"].as<int>());
+ pointInViewport = QPoint(event["clientX"].as<int>(), event["clientY"].as<int>());
+ modifiers = KeyboardModifier::getForEvent(event);
+}
+
+MouseEvent::~MouseEvent() = default;
+
+MouseEvent::MouseEvent(const MouseEvent &other) = default;
+
+MouseEvent::MouseEvent(MouseEvent &&other) = default;
+
+MouseEvent &MouseEvent::operator=(const MouseEvent &other) = default;
+
+MouseEvent &MouseEvent::operator=(MouseEvent &&other) = default;
+
+PointerEvent::PointerEvent(EventType type, emscripten::val event) : MouseEvent(type, event)
{
- PointerEvent ret;
+ pointerId = event["pointerId"].as<int>();
+ pointerType = event["pointerType"].as<std::string>() == "mouse" ? PointerType::Mouse
+ : PointerType::Other;
+}
+
+PointerEvent::~PointerEvent() = default;
+
+PointerEvent::PointerEvent(const PointerEvent &other) = default;
+
+PointerEvent::PointerEvent(PointerEvent &&other) = default;
+
+PointerEvent &PointerEvent::operator=(const PointerEvent &other) = default;
+PointerEvent &PointerEvent::operator=(PointerEvent &&other) = default;
+
+std::optional<PointerEvent> PointerEvent::fromWeb(emscripten::val event)
+{
const auto eventType = ([&event]() -> std::optional<EventType> {
const auto eventTypeString = event["type"].as<std::string>();
@@ -38,27 +91,47 @@ std::optional<PointerEvent> PointerEvent::fromWeb(emscripten::val event)
if (!eventType)
return std::nullopt;
- ret.type = *eventType;
- ret.target = event["target"];
- ret.pointerType = event["pointerType"].as<std::string>() == "mouse" ?
- PointerType::Mouse : PointerType::Other;
- ret.mouseButton = MouseEvent::buttonFromWeb(event["button"].as<int>());
- ret.mouseButtons = MouseEvent::buttonsFromWeb(event["buttons"].as<unsigned short>());
+ return PointerEvent(*eventType, event);
+}
- // The current button state (event.buttons) may be out of sync for some PointerDown
- // events where the "down" state is very brief, for example taps on Apple trackpads.
- // Qt expects that the current button state is in sync with the event, so we sync
- // it up here.
- if (*eventType == EventType::PointerDown)
- ret.mouseButtons |= ret.mouseButton;
+DragEvent::DragEvent(EventType type, emscripten::val event)
+ : MouseEvent(type, event), dataTransfer(event["dataTransfer"])
+{
+ dropAction = ([event]() {
+ const std::string effect = event["dataTransfer"]["dropEffect"].as<std::string>();
+
+ if (effect == "copy")
+ return Qt::CopyAction;
+ else if (effect == "move")
+ return Qt::MoveAction;
+ else if (effect == "link")
+ return Qt::LinkAction;
+ return Qt::IgnoreAction;
+ })();
+}
- ret.localPoint = QPoint(event["offsetX"].as<int>(), event["offsetY"].as<int>());
- ret.pointInPage = QPoint(event["pageX"].as<int>(), event["pageY"].as<int>());
- ret.pointInViewport = QPoint(event["clientX"].as<int>(), event["clientY"].as<int>());
- ret.pointerId = event["pointerId"].as<int>();
- ret.modifiers = KeyboardModifier::getForEvent(event);
+DragEvent::~DragEvent() = default;
- return ret;
+DragEvent::DragEvent(const DragEvent &other) = default;
+
+DragEvent::DragEvent(DragEvent &&other) = default;
+
+DragEvent &DragEvent::operator=(const DragEvent &other) = default;
+
+DragEvent &DragEvent::operator=(DragEvent &&other) = default;
+
+std::optional<DragEvent> DragEvent::fromWeb(emscripten::val event)
+{
+ const auto eventType = ([&event]() -> std::optional<EventType> {
+ const auto eventTypeString = event["type"].as<std::string>();
+
+ if (eventTypeString == "drop")
+ return EventType::Drop;
+ return std::nullopt;
+ })();
+ if (!eventType)
+ return std::nullopt;
+ return DragEvent(*eventType, event);
}
QT_END_NAMESPACE