diff options
Diffstat (limited to 'src/plugins/platforms/wasm/qwasmclipboard.cpp')
-rw-r--r-- | src/plugins/platforms/wasm/qwasmclipboard.cpp | 116 |
1 files changed, 25 insertions, 91 deletions
diff --git a/src/plugins/platforms/wasm/qwasmclipboard.cpp b/src/plugins/platforms/wasm/qwasmclipboard.cpp index 80f71707482..de2a87db358 100644 --- a/src/plugins/platforms/wasm/qwasmclipboard.cpp +++ b/src/plugins/platforms/wasm/qwasmclipboard.cpp @@ -2,20 +2,18 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "qwasmclipboard.h" +#include "qwasmdom.h" #include "qwasmwindow.h" #include "qwasmstring.h" #include <private/qstdweb_p.h> -#include <emscripten.h> -#include <emscripten/html5.h> -#include <emscripten/bind.h> -#include <emscripten/val.h> - #include <QCoreApplication> #include <qpa/qwindowsysteminterface.h> #include <QBuffer> #include <QString> +#include <emscripten/val.h> + QT_BEGIN_NAMESPACE using namespace emscripten; @@ -68,93 +66,29 @@ static void qClipboardCopyTo(val event) commonCopyEvent(event); } -static void qWasmClipboardPaste(QMimeData *mData) -{ - // Persist clipboard data so that the app can read it when handling the CTRL+V - QWasmIntegration::get()->clipboard()-> - QPlatformClipboard::setMimeData(mData, QClipboard::Clipboard); - - QWindowSystemInterface::handleKeyEvent( - 0, QEvent::KeyPress, Qt::Key_V, Qt::ControlModifier, "V"); -} - -static void qClipboardPasteTo(val dataTransfer) +static void qClipboardPasteTo(val event) { - enum class ItemKind { - File, - String, - }; - - struct Data - { - std::unique_ptr<QMimeData> data; - int fileCount = 0; - int doneCount = 0; - }; - - auto sharedData = std::make_shared<Data>(); - sharedData->data = std::make_unique<QMimeData>(); - - auto continuation = [sharedData]() { - Q_ASSERT(sharedData->doneCount <= sharedData->fileCount); - if (sharedData->doneCount < sharedData->fileCount) - return; - - if (!sharedData->data->formats().isEmpty()) - qWasmClipboardPaste(sharedData->data.release()); - }; - - const val clipboardData = dataTransfer["clipboardData"]; - const val items = clipboardData["items"]; - for (int i = 0; i < items["length"].as<int>(); ++i) { - const val item = items[i]; - const auto itemKind = - item["kind"].as<std::string>() == "string" ? ItemKind::String : ItemKind::File; - const auto itemMimeType = QString::fromStdString(item["type"].as<std::string>()); - - switch (itemKind) { - case ItemKind::File: { - ++sharedData->fileCount; - - qstdweb::File file(item.call<emscripten::val>("getAsFile")); - - QByteArray fileContent(file.size(), Qt::Uninitialized); - file.stream(fileContent.data(), - [continuation, itemMimeType, fileContent, sharedData]() { - if (!fileContent.isEmpty()) { - if (itemMimeType.startsWith("image/")) { - QImage image; - image.loadFromData(fileContent, nullptr); - sharedData->data->setImageData(image); - } else { - sharedData->data->setData(itemMimeType, fileContent.data()); - } - } - ++sharedData->doneCount; - continuation(); - }); - break; - } - case ItemKind::String: - if (itemMimeType.contains("STRING", Qt::CaseSensitive) - || itemMimeType.contains("TEXT", Qt::CaseSensitive)) { - break; - } - const QString data = QWasmString::toQString( - clipboardData.call<val>("getData", val(itemMimeType.toStdString()))); - - if (!data.isEmpty()) { - if (itemMimeType == "text/html") - sharedData->data->setHtml(data); - else if (itemMimeType.isEmpty() || itemMimeType == "text/plain") - sharedData->data->setText(data); // the type can be empty - else - sharedData->data->setData(itemMimeType, data.toLocal8Bit()); - } - break; - } - } - continuation(); + event.call<void>("preventDefault"); // prevent browser from handling drop event + + static std::shared_ptr<qstdweb::CancellationFlag> readDataCancellation = nullptr; + readDataCancellation = qstdweb::readDataTransfer( + event["clipboardData"], + [](QByteArray fileContent) { + QImage image; + image.loadFromData(fileContent, nullptr); + return image; + }, + [event](std::unique_ptr<QMimeData> data) { + if (data->formats().isEmpty()) + return; + + // Persist clipboard data so that the app can read it when handling the CTRL+V + QWasmIntegration::get()->clipboard()->QPlatformClipboard::setMimeData( + data.release(), QClipboard::Clipboard); + + QWindowSystemInterface::handleKeyEvent(0, QEvent::KeyPress, Qt::Key_V, + Qt::ControlModifier, "V"); + }); } EMSCRIPTEN_BINDINGS(qtClipboardModule) { |