diff options
Diffstat (limited to 'tests/manual/wasm/localfiles/main.cpp')
-rw-r--r-- | tests/manual/wasm/localfiles/main.cpp | 228 |
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" |