6#include <QtCore/qdir.h>
7#include <QtCore/qfile.h>
8#include <QtCore/qpoint.h>
9#include <QtCore/qrect.h>
10#include <QtGui/qimage.h>
11#include <private/qstdweb_p.h>
12#include <QtCore/qurl.h>
15#include <emscripten/wire.h>
41 : webDataTransfer(webDataTransfer) {
56 webDataTransfer.call<
void>(
"setDragImage", element, emscripten::val(hotspot.
x()),
57 emscripten::val(hotspot.
y()));
63 emscripten::val(std::move(
data)));
68 webDataTransfer.set(
"dropEffect", emscripten::val(dropActionToDropEffect(action)));
97 MimeContext(
int itemCount, std::function<
void(
QMimeData *)> callback)
98 :m_remainingItemCount(itemCount), m_callback(callback)
104 if (--m_remainingItemCount > 0)
114 for (
QUrl fileUrl: fileUrls)
121 QList<QUrl> fileUrls;
124 int m_remainingItemCount;
129 const int itemCount =
items[
"length"].as<
int>();
131 MimeContext *mimeContext =
new MimeContext(itemCount, callback);
133 for (
int i = 0;
i < itemCount; ++
i) {
135 const auto itemKind =
136 item[
"kind"].as<std::string>() ==
"string" ? ItemKind::String : ItemKind::File;
140 case ItemKind::File: {
143 if (webfile.size() > 1e+9) {
144 qWarning() <<
"File is too large (> 1GB) and will be skipped. File size is" << webfile.size();
145 mimeContext->deref();
154 webfile.stream(fileContent.data(), [=]() {
163 if (fileCount == 1 && mimeFormat.contains(
"image/")) {
165 if (image.loadFromData(fileContent))
166 mimeContext->mimeData->setImageData(image);
169 QDir qtTmpDir(
"/qt/tmp/");
170 qtTmpDir.
mkpath(qtTmpDir.path());
173 mimeContext->fileUrls.append(fileUrl);
177 qWarning() <<
"File was not opened";
178 mimeContext->deref();
185 mimeContext->deref();
189 case ItemKind::String:
192 mimeContext->deref();
197 "getData", emscripten::val(itemMimeType.toStdString())));
199 if (!
data.isEmpty()) {
200 if (itemMimeType ==
"text/html")
201 mimeContext->mimeData->setHtml(
data);
202 else if (itemMimeType.isEmpty() || itemMimeType ==
"text/plain")
203 mimeContext->mimeData->setText(
data);
206 if (
data.startsWith(
"QB64")) {
208 mimeContext->mimeData->setData(itemMimeType,
210 data.toStdString())));
212 mimeContext->mimeData->setData(itemMimeType,
data.toLocal8Bit());
216 mimeContext->deref();
227 for (
int i = 0;
i < webDataTransfer[
"items"][
"length"].as<
int>(); ++
i) {
228 const auto item = webDataTransfer[
"items"][
i];
229 if (
item[
"kind"].as<std::string>() ==
"file") {
230 uriList.append(
QUrl(
"blob://placeholder"));
236 data->setUrls(uriList);
243 element[
"classList"].call<
void>(
"add", emscripten::val(std::move(cssClassName)));
247 element[
"classList"].call<
void>(
"remove", emscripten::val(std::move(cssClassName)));
252 const auto sourceBoundingRect =
253 QRectF::fromDOMRect(
source.call<emscripten::val>(
"getBoundingClientRect"));
254 const auto targetBoundingRect =
255 QRectF::fromDOMRect(
target.call<emscripten::val>(
"getBoundingClientRect"));
257 const auto offset = sourceBoundingRect.topLeft() - targetBoundingRect.topLeft();
262 const QRect &sourceRect)
264 Q_ASSERT_X(destinationImageData[
"constructor"][
"name"].as<std::string>() ==
"ImageData",
265 Q_FUNC_INFO,
"The destination should be an ImageData instance");
267 constexpr int BytesPerColor = 4;
268 if (sourceRect.
width() == sourceImage.width()) {
275 auto imageMemory = emscripten::typed_memory_view(sourceRect.
width() * sourceRect.
height()
277 sourceImage.constScanLine(sourceRect.
y()));
278 destinationImageData[
"data"].call<
void>(
279 "set", imageMemory, sourceRect.
y() * sourceImage.width() * BytesPerColor);
289 auto scanlineMemory =
290 emscripten::typed_memory_view(sourceRect.
width() * BytesPerColor,
291 sourceImage.constScanLine(
row + sourceRect.
y())
292 + BytesPerColor * sourceRect.
x());
293 destinationImageData[
"data"].call<
void>(
"set", scanlineMemory,
294 (sourceRect.
y() +
row) * sourceImage.width()
296 + sourceRect.
x() * BytesPerColor);
static QByteArray fromStdString(const std::string &s)
static QByteArray fromBase64(const QByteArray &base64, Base64Options options=Base64Encoding)
bool startsWith(QByteArrayView bv) const
bool mkpath(const QString &dirPath) const
Creates the directory path dirPath.
void close() override
Calls QFileDevice::flush() and closes the file.
QFILE_MAYBE_NODISCARD bool open(OpenMode flags) override
Opens the file using OpenMode mode, returning true if successful; otherwise false.
qint64 write(const char *data, qint64 len)
Writes at most maxSize bytes of data from data to the device.
QByteArray data(const QString &mimetype) const
Returns the data stored in the object in the format described by the MIME type specified by mimeType.
virtual QStringList formats() const
Returns a list of formats supported by the object.
void setUrls(const QList< QUrl > &urls)
Sets the URLs stored in the MIME data object to those specified by urls.
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
constexpr int x() const noexcept
Returns the x coordinate of this point.
constexpr int y() const noexcept
Returns the y coordinate of this point.
\inmodule QtCore\reentrant
constexpr int height() const noexcept
Returns the height of the rectangle.
constexpr int x() const noexcept
Returns the x-coordinate of the rectangle's left edge.
constexpr int width() const noexcept
Returns the width of the rectangle.
constexpr int y() const noexcept
Returns the y-coordinate of the rectangle's top edge.
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromStdString(const std::string &s)
static QString fromLocal8Bit(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QUrl fromLocalFile(const QString &localfile)
Returns a QUrl representation of localFile, interpreted as a local file.
QString toLocalFile() const
Returns the path of this URL formatted as a local file path.
Combined button and popup list for selecting options.
constexpr Initialization Uninitialized
void syncCSSClassWith(emscripten::val element, std::string cssClassName, bool flag)
QPointF mapPoint(emscripten::val source, emscripten::val target, const QPointF &point)
void drawImageToWebImageDataArray(const QImage &sourceImage, emscripten::val destinationImageData, const QRect &sourceRect)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
GLboolean GLboolean GLboolean GLboolean a
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
GLint GLsizei GLsizei GLenum format
GLsizei GLsizei GLchar * source
GLenum GLenum GLsizei void * row
#define Q_ASSERT_X(cond, x, msg)
decltype(openFileForWriting({})) File
settings remove("monkey")
DataTransfer(emscripten::val webDataTransfer)
void toMimeDataWithFile(std::function< void(QMimeData *)> callback)
void setDragImage(emscripten::val element, const QPoint &hotspot)
void setDataFromMimeData(const QMimeData &mimeData)
DataTransfer & operator=(const DataTransfer &other)
emscripten::val webDataTransfer
void setData(std::string format, std::string data)
void setDropAction(Qt::DropAction dropAction)