summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wasm/qwasmdrag.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmdrag.cpp')
-rw-r--r--src/plugins/platforms/wasm/qwasmdrag.cpp66
1 files changed, 48 insertions, 18 deletions
diff --git a/src/plugins/platforms/wasm/qwasmdrag.cpp b/src/plugins/platforms/wasm/qwasmdrag.cpp
index 730816b9a99..6447d1e399f 100644
--- a/src/plugins/platforms/wasm/qwasmdrag.cpp
+++ b/src/plugins/platforms/wasm/qwasmdrag.cpp
@@ -16,6 +16,9 @@
#include <QtCore/qtimer.h>
#include <QFile>
+#include <private/qshapedpixmapdndwindow_p.h>
+#include <private/qdnd_p.h>
+
#include <functional>
#include <string>
#include <utility>
@@ -91,16 +94,13 @@ Qt::DropAction QWasmDrag::drag(QDrag *drag)
return Qt::IgnoreAction;
Qt::DropAction dragResult = Qt::IgnoreAction;
- if (qstdweb::haveJspi()) {
- QEventLoop loop;
- m_dragState = std::make_unique<DragState>(drag, window, [&loop]() { loop.quit(); });
- loop.exec();
- dragResult = m_dragState->dropAction;
+ if (qstdweb::haveAsyncify()) {
+ m_dragState = std::make_unique<DragState>(drag, window, [this]() { QSimpleDrag::cancelDrag(); });
+ dragResult = QSimpleDrag::drag(drag);
m_dragState.reset();
- }
-
- if (dragResult == Qt::IgnoreAction)
+ } else {
dragResult = QBasicDrag::drag(drag);
+ }
return dragResult;
}
@@ -110,13 +110,16 @@ 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();
return;
}
+ setExecutedDropAction(event->dropAction);
+
+ // We have our own window
+ if (shapedPixmapWindow())
+ shapedPixmapWindow()->setVisible(false);
m_dragState->dragImage = std::make_unique<DragState::DragImage>(
m_dragState->drag->pixmap(), m_dragState->drag->mimeData(), event->targetWindow);
@@ -141,8 +144,10 @@ void QWasmDrag::onNativeDragOver(DragEvent *event)
event->mouseButton, event->modifiers);
event->acceptDragOver();
if (dragResponse.isAccepted()) {
+ setExecutedDropAction(dragResponse.acceptedAction());
event->dataTransfer.setDropAction(dragResponse.acceptedAction());
} else {
+ setExecutedDropAction(Qt::DropAction::IgnoreAction);
event->dataTransfer.setDropAction(Qt::DropAction::IgnoreAction);
}
}
@@ -170,19 +175,22 @@ void QWasmDrag::onNativeDrop(DragEvent *event)
// files, but the browser expects that accepted state is set before any
// async calls.
event->acceptDrop();
+ setExecutedDropAction(event->dropAction);
+ std::shared_ptr<DragState> dragState = m_dragState;
- const auto dropCallback = [&m_dragState = m_dragState, wasmWindow, targetWindowPos,
+ const auto dropCallback = [dragState, wasmWindow, targetWindowPos,
actions, mouseButton, modifiers](QMimeData *mimeData) {
-
- auto dropResponse = std::make_shared<QPlatformDropQtResponse>(true, Qt::DropAction::CopyAction);
- *dropResponse = QWindowSystemInterface::handleDrop(wasmWindow->window(), mimeData,
+ if (mimeData) {
+ auto dropResponse = std::make_shared<QPlatformDropQtResponse>(true, Qt::DropAction::CopyAction);
+ *dropResponse = QWindowSystemInterface::handleDrop(wasmWindow->window(), mimeData,
targetWindowPos, actions,
mouseButton, modifiers);
- if (dropResponse->isAccepted())
- m_dragState->dropAction = dropResponse->acceptedAction();
+ if (dragState && dropResponse->isAccepted())
+ dragState->dropAction = dropResponse->acceptedAction();
- delete mimeData;
+ delete mimeData;
+ }
};
event->dataTransfer.toMimeDataWithFile(dropCallback);
@@ -192,13 +200,35 @@ void QWasmDrag::onNativeDragFinished(DragEvent *event)
{
event->webEvent.call<void>("preventDefault");
m_dragState->dropAction = event->dropAction;
+ setExecutedDropAction(event->dropAction);
m_dragState->quitEventLoopClosure();
}
+void QWasmDrag::onNativeDragEnter(DragEvent *event)
+{
+ event->webEvent.call<void>("preventDefault");
+
+ // Already dragging
+ if (QDragManager::self() && QDragManager::self()->object())
+ return;
+
+ // Event coming from external browser, start a drag
+ if (m_dragState)
+ m_dragState->dropAction = event->dropAction;
+
+ setExecutedDropAction(event->dropAction);
+
+ QDrag *drag = new QDrag(this);
+ drag->setMimeData(new QMimeData());
+ drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction);
+}
+
void QWasmDrag::onNativeDragLeave(DragEvent *event)
{
event->webEvent.call<void>("preventDefault");
- m_dragState->dropAction = event->dropAction;
+ if (m_dragState)
+ m_dragState->dropAction = event->dropAction;
+ setExecutedDropAction(event->dropAction);
event->dataTransfer.setDropAction(Qt::DropAction::IgnoreAction);
}