summaryrefslogtreecommitdiffstats
path: root/tests/manual/wasm/localfiles/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual/wasm/localfiles/main.cpp')
-rw-r--r--tests/manual/wasm/localfiles/main.cpp228
1 files changed, 133 insertions, 95 deletions
diff --git a/tests/manual/wasm/localfiles/main.cpp b/tests/manual/wasm/localfiles/main.cpp
index 9dfc30885c..862bff50a4 100644
--- a/tests/manual/wasm/localfiles/main.cpp
+++ b/tests/manual/wasm/localfiles/main.cpp
@@ -1,100 +1,138 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtWidgets/QtWidgets>
+#include <emscripten/val.h>
+#include <emscripten.h>
+
+class AppWindow : public QObject
+{
+Q_OBJECT
+public:
+ AppWindow() : m_layout(new QVBoxLayout(&m_loadFileUi)),
+ m_window(emscripten::val::global("window")),
+ m_showOpenFilePickerFunction(m_window["showOpenFilePicker"]),
+ m_showSaveFilePickerFunction(m_window["showSaveFilePicker"])
+ {
+ addWidget<QLabel>("Filename filter");
+
+ const bool localFileApiAvailable =
+ !m_showOpenFilePickerFunction.isUndefined() && !m_showSaveFilePickerFunction.isUndefined();
+
+ m_useLocalFileApisCheckbox = addWidget<QCheckBox>("Use the window.showXFilePicker APIs");
+ m_useLocalFileApisCheckbox->setEnabled(localFileApiAvailable);
+ m_useLocalFileApisCheckbox->setChecked(localFileApiAvailable);
+
+ m_filterEdit = addWidget<QLineEdit>("Images (*.png *.jpg);;PDF (*.pdf);;*.txt");
+
+ auto* loadFile = addWidget<QPushButton>("Load File");
+
+ m_fileInfo = addWidget<QLabel>("Opened file:");
+ m_fileInfo->setTextInteractionFlags(Qt::TextSelectableByMouse);
+
+ m_fileHash = addWidget<QLabel>("Sha256:");
+ m_fileHash->setTextInteractionFlags(Qt::TextSelectableByMouse);
+
+ addWidget<QLabel>("Saved file name");
+ m_savedFileNameEdit = addWidget<QLineEdit>("qttestresult");
+
+ m_saveFile = addWidget<QPushButton>("Save File");
+ m_saveFile->setEnabled(false);
+
+ m_layout->addStretch();
+
+ m_loadFileUi.setLayout(m_layout);
+
+ QObject::connect(m_useLocalFileApisCheckbox, &QCheckBox::toggled, std::bind(&AppWindow::onUseLocalFileApisCheckboxToggled, this));
+
+ QObject::connect(loadFile, &QPushButton::clicked, this, &AppWindow::onLoadClicked);
+
+ QObject::connect(m_saveFile, &QPushButton::clicked, std::bind(&AppWindow::onSaveClicked, this));
+ }
+
+ void show() {
+ m_loadFileUi.show();
+ }
+
+ ~AppWindow() = default;
+
+private Q_SLOTS:
+ void onUseLocalFileApisCheckboxToggled()
+ {
+ m_window.set("showOpenFilePicker",
+ m_useLocalFileApisCheckbox->isChecked() ?
+ m_showOpenFilePickerFunction : emscripten::val::undefined());
+ m_window.set("showSaveFilePicker",
+ m_useLocalFileApisCheckbox->isChecked() ?
+ m_showSaveFilePickerFunction : emscripten::val::undefined());
+ }
+
+ void onFileContentReady(const QString &fileName, const QByteArray &fileContents)
+ {
+ m_fileContent = fileContents;
+ m_fileInfo->setText(QString("Opened file: %1 size: %2").arg(fileName).arg(fileContents.size()));
+ m_saveFile->setEnabled(true);
+
+ QTimer::singleShot(100, this, &AppWindow::computeAndDisplayFileHash); // update UI before computing hash
+ }
+
+ void computeAndDisplayFileHash()
+ {
+ QByteArray hash = QCryptographicHash::hash(m_fileContent, QCryptographicHash::Sha256);
+ m_fileHash->setText(QString("Sha256: %1").arg(QString(hash.toHex())));
+ }
+
+ void onFileSaved(bool success)
+ {
+ m_fileInfo->setText(QString("File save result: %1").arg(success ? "success" : "failed"));
+ }
+
+ void onLoadClicked()
+ {
+ QFileDialog::getOpenFileContent(
+ m_filterEdit->text(),
+ std::bind(&AppWindow::onFileContentReady, this, std::placeholders::_1, std::placeholders::_2),
+ &m_loadFileUi);
+ }
+
+ void onSaveClicked()
+ {
+ m_fileInfo->setText("Saving file... (no result information with current API)");
+ QFileDialog::saveFileContent(m_fileContent, m_savedFileNameEdit->text());
+ }
+
+private:
+ template <class T, class... Args>
+ T* addWidget(Args... args)
+ {
+ T* widget = new T(std::forward<Args>(args)..., &m_loadFileUi);
+ m_layout->addWidget(widget);
+ return widget;
+ }
+
+ QWidget m_loadFileUi;
+
+ QCheckBox* m_useLocalFileApisCheckbox;
+ QLineEdit* m_filterEdit;
+ QVBoxLayout *m_layout;
+ QLabel* m_fileInfo;
+ QLabel* m_fileHash;
+ QLineEdit* m_savedFileNameEdit;
+ QPushButton* m_saveFile;
+
+ emscripten::val m_window;
+ emscripten::val m_showOpenFilePickerFunction;
+ emscripten::val m_showSaveFilePickerFunction;
+
+ QByteArray m_fileContent;
+};
+
int main(int argc, char **argv)
{
- QApplication app(argc, argv);
-
- QByteArray content;
-
- QWidget loadFileUi;
- QVBoxLayout *layout = new QVBoxLayout();
- QPushButton *loadFile = new QPushButton("Load File");
- QLabel *fileInfo = new QLabel("Opened file:");
- fileInfo->setTextInteractionFlags(Qt::TextSelectableByMouse);
- QLabel *fileHash = new QLabel("Sha256:");
- fileHash->setTextInteractionFlags(Qt::TextSelectableByMouse);
- QPushButton *saveFile = new QPushButton("Save File");
- saveFile->setEnabled(false);
-
- auto onFileReady = [=, &content](const QString &fileName, const QByteArray &fileContents) {
- content = fileContents;
- fileInfo->setText(QString("Opened file: %1 size: %2").arg(fileName).arg(fileContents.size()));
- saveFile->setEnabled(true);
-
- auto computeDisplayFileHash = [=](){
- QByteArray hash = QCryptographicHash::hash(fileContents, QCryptographicHash::Sha256);
- fileHash->setText(QString("Sha256: %1").arg(QString(hash.toHex())));
- };
-
- QTimer::singleShot(100, computeDisplayFileHash); // update UI before computing hash
- };
- auto onLoadClicked = [=](){
- QFileDialog::getOpenFileContent("*.*", onFileReady);
- };
- QObject::connect(loadFile, &QPushButton::clicked, onLoadClicked);
-
- auto onSaveClicked = [=, &content]() {
- QFileDialog::saveFileContent(content, "qtsavefiletest.dat");
- };
- QObject::connect(saveFile, &QPushButton::clicked, onSaveClicked);
-
- layout->addWidget(loadFile);
- layout->addWidget(fileInfo);
- layout->addWidget(fileHash);
- layout->addWidget(saveFile);
- layout->addStretch();
-
- loadFileUi.setLayout(layout);
- loadFileUi.show();
-
- return app.exec();
+ QApplication application(argc, argv);
+ AppWindow window;
+ window.show();
+ return application.exec();
}
+
+#include "main.moc"