From 0aecc6ad160056c7af291632946d3d4181da4fca Mon Sep 17 00:00:00 2001 From: Morten Sorvig <morten.sorvig@qt.io> Date: Mon, 22 Jan 2024 15:47:57 +0000 Subject: [PATCH] QDS-11148 - Qt6.6 integration --- README.md | 78 ++++++---------- cicd/gitlab-ci.yml | 5 +- cicd/stages/build.yml | 51 ++++------- cicd/stages/release.yml | 2 +- cicd/stages/trigger.yml | 2 +- resources/dvicon-new.png | Bin 0 -> 39926 bytes src/designviewer.cpp | 193 +++++++++++++-------------------------- src/designviewer.h | 2 + www/index.html | 6 +- www/scripts/script.js | 93 +++++++++---------- 10 files changed, 162 insertions(+), 270 deletions(-) create mode 100644 resources/dvicon-new.png diff --git a/README.md b/README.md index 249afcf..b2e0988 100644 --- a/README.md +++ b/README.md @@ -8,62 +8,19 @@ Qt Design Viewer works in a variety of web browsers which support WebAssembly, o ## Prerequisites * CMake 3.16 or newer -* Android - * Qt6.5.0 or newer - * OpenSSL (<https://github.com/KDAB/android_openssl>) - * Android SDK and NDK (<https://developer.android.com/studio>) * WebAssembly * Qt6.4.3 or newer * EMSDK (<https://emscripten.org/docs/getting_started/downloads.html>) ## Building -Build instructions are provided for Linux, macOS hosts and for Android and WebAssembly targets. Windows should work as well but is not tested. -> Note: +> Note 1: +> Build instructions are provided for Linux, macOS hosts and for WebAssembly target. Windows should work as well but is not tested. +> +> Note 2: > If you're building in a Docker container and you've mounted the source directory into the container, you may need to change the build path pointing out somewhere out of the source directory. Otherwise you may get errors like the following; > `CMake Error at /opt/qt-v.6.5.0/android-arm64-v8a/lib/cmake/Qt6/QtSyncQtHelpers.cmake:235 (message): syncqt.cpp failed for module QtQuickStudioApplication: Unable to remove file ...` -### Android - -> Note: -> Android build instructions can also be used on desktop (or host) for testing purposes. Just replace the `CMAKE_TOOLCHAIN_FILE` path with the path to your Qt host installation. - -First build and install QtQuickDesigner Components for Android: - -```bash -cd qtquickdesigner-components -cmake \ - -S . \ - -B build \ - -G Ninja \ - -DCMAKE_TOOLCHAIN_FILE=<qt-android-path>/lib/cmake/Qt6/qt.toolchain.cmake \ - -DCMAKE_INSTALL_PREFIX=<qt-android-path> \ - -DANDROID_SDK_ROOT=<android-sdk-path> \ - -DANDROID_NDK_ROOT=<android-sdk-path>/ndk/<ndk-version> \ - -DANDROID_OPENSSL_PATH=<openssl-path> - -cmake --build build -cmake --install build -cd .. -``` - -Then build the Qt Design Viewer: - -```bash -cmake \ - -S . \ - -B build \ - -G Ninja \ - -DCMAKE_TOOLCHAIN_FILE=<qt-android-path>/lib/cmake/Qt6/qt.toolchain.cmake \ - -DANDROID_SDK_ROOT=<android-sdk-path> \ - -DANDROID_NDK_ROOT=<android-sdk-path>/ndk/<ndk-version> \ - -DANDROID_OPENSSL_PATH=<openssl-path> - -cmake --build build -``` - -### WebAssembly - First activate the correct EMSDK version: ```bash @@ -82,8 +39,9 @@ cmake \ -S . \ -B build \ -G Ninja \ - -DCMAKE_TOOLCHAIN_FILE=<qt-wasm-path>/wasm/lib/cmake/Qt6/qt.toolchain.cmake \ - -DCMAKE_INSTALL_PREFIX=<qt-wasm-path> + -DCMAKE_PREFIX_PATH=<qt-wasm-path> \ + -DCMAKE_INSTALL_PREFIX=<qt-wasm-path> \ + -DCMAKE_TOOLCHAIN_FILE=<qt-wasm-path>/wasm/lib/cmake/Qt6/qt.toolchain.cmake cmake --build build cmake --install build @@ -97,11 +55,33 @@ cmake \ -S . \ -B build \ -G Ninja \ + -DCMAKE_PREFIX_PATH=<qt-wasm-path> \ + -DCMAKE_INSTALL_PREFIX=build/install \ -DCMAKE_TOOLCHAIN_FILE=<qt-wasm-path>/wasm/lib/cmake/Qt6/qt.toolchain.cmake cmake --build build +cmake --install build +``` + +## Running + +You can use 'qtwasmserver' package to run the Qt Design Viewer: + +To install the package: + +```bash +python -m pip install qtwasmserver ``` +And then run the server: + +```bash +cd build/install +qtwasmserver . +``` + +Then open <http://localhost:8000> in Your web browser. + ## Usage Compress Your Qml project as a _.zip_ file, ideally including a _.qmlproject_ file. Or use the _Build -> Generate Resource File_ feature of Qt Design Studio 1.3+ to pack Your project in a _.qmlrc_ file. diff --git a/cicd/gitlab-ci.yml b/cicd/gitlab-ci.yml index 33058bb..1299a52 100644 --- a/cicd/gitlab-ci.yml +++ b/cicd/gitlab-ci.yml @@ -1,9 +1,6 @@ variables: QDS_CI_QT_VERSION: - value: "643" - options: - - "643" - - "652" + value: "6.6.1" description: "Qt version for build" QDS_CI_ARTIFACTS_PATH: "${CI_PROJECT_DIR}/artifacts" DEBIAN_FRONTEND: non-interactive diff --git a/cicd/stages/build.yml b/cicd/stages/build.yml index fbcdc4d..d8a7abe 100644 --- a/cicd/stages/build.yml +++ b/cicd/stages/build.yml @@ -1,27 +1,14 @@ # QDS_CI_BUILD_QT_VERSION_ANDROID and QDS_CI_BUILD_QT_VERSION_WASM are the tags for the docker images. # https://git.qt.io/design-studio/maintenance/docker-images/container_registry - -.build-base: - rules: - - if: $CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "web" - -build-wasm-multiarch: +build-wasm: stage: build - extends: .build-base tags: - linux-blade rules: - - if: $QDS_CI_QT_VERSION == "643" && $QDS_CI_JOB_TARGET_ARCH == "32" - - if: $QDS_CI_QT_VERSION != "643" && $QDS_CI_JOB_TARGET_ARCH == "singlethread" - - if: $QDS_CI_QT_VERSION != "643" && $QDS_CI_JOB_TARGET_ARCH == "multithread" - parallel: - matrix: - - QDS_CI_JOB_TARGET_ARCH: - - "32" - - "singlethread" - - "multithread" + - if: $CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "web" || $CI_PIPELINE_SOURCE == "merge_request_event" variables: - QDS_BUILD_PATH: "${CI_PROJECT_DIR}/outdir/build" + QDS_CI_BUILD_PATH: "${CI_PROJECT_DIR}/outdir/build" + QDS_CI_JOB_TARGET_ARCH: "singlethread" QDS_CI_JOB_TARGET_PLATFORM: "wasm" QDS_CI_JOB_ARTIFACTS_PATH: ${QDS_CI_ARTIFACTS_PATH}/${QDS_CI_JOB_TARGET_PLATFORM}/${QDS_CI_JOB_TARGET_ARCH} artifacts: @@ -31,46 +18,42 @@ build-wasm-multiarch: - ${QDS_CI_ARTIFACTS_PATH} reports: dotenv: build.env - image: "git.qt.io:4567/design-studio/maintenance/docker-images/${QDS_CI_JOB_TARGET_PLATFORM}:${QDS_CI_QT_VERSION}-${QDS_CI_JOB_TARGET_PLATFORM}_${QDS_CI_JOB_TARGET_ARCH}" + image: "git.qt.io:4567/design-studio/maintenance/docker-images/qt-full:${QDS_CI_QT_VERSION}" script: - mkdir -p ${QDS_CI_JOB_ARTIFACTS_PATH} - - | - if [[ ${QDS_CI_QT_VERSION} == "643" ]]; then - EMSDK_VERSION="3.1.14" - elif [[ ${QDS_CI_QT_VERSION} == "652" ]]; then - EMSDK_VERSION="3.1.25" - fi - | cd emsdk - ./emsdk install ${EMSDK_VERSION} - ./emsdk activate ${EMSDK_VERSION} + ./emsdk install 3.1.37 + ./emsdk activate 3.1.37 source emsdk_env.sh cd .. + - echo ${DOCKER_ENV_QT_PATH_WASM_SINGLETHREAD} + - echo ${DOCKER_ENV_QT_PATH_LINUX_GCC_64} - | cd qtquickdesigner-components cmake \ -S . \ -G Ninja \ - -DCMAKE_TOOLCHAIN_FILE=${QT_PATH}/${QT_VERSION}/${QDS_CI_JOB_TARGET_PLATFORM}_${QDS_CI_JOB_TARGET_ARCH}/lib/cmake/Qt6/qt.toolchain.cmake \ - -DQT_HOST_PATH=${QT_PATH}/${QT_VERSION}/gcc_64 \ + -DCMAKE_TOOLCHAIN_FILE=${DOCKER_ENV_QT_PATH_WASM_SINGLETHREAD}/lib/cmake/Qt6/qt.toolchain.cmake \ + -DQT_HOST_PATH=${DOCKER_ENV_QT_PATH_LINUX_GCC_64} \ -DCMAKE_C_COMPILER=${EMSDK}/upstream/emscripten/emcc \ -DCMAKE_CXX_COMPILER=${EMSDK}/upstream/emscripten/em++ \ - -DCMAKE_INSTALL_PREFIX=${QT_PATH}/${QT_VERSION}/${QDS_CI_JOB_TARGET_PLATFORM}_${QDS_CI_JOB_TARGET_ARCH} + -DCMAKE_INSTALL_PREFIX=${DOCKER_ENV_QT_PATH_WASM_SINGLETHREAD} - cmake --build . - cmake --install . - cd .. - | cmake \ -S . \ - -B ${QDS_BUILD_PATH} \ + -B ${QDS_CI_BUILD_PATH} \ -G Ninja \ -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_TOOLCHAIN_FILE=${QT_PATH}/${QT_VERSION}/${QDS_CI_JOB_TARGET_PLATFORM}_${QDS_CI_JOB_TARGET_ARCH}/lib/cmake/Qt6/qt.toolchain.cmake \ - -DQT_HOST_PATH=${QT_PATH}/${QT_VERSION}/gcc_64 \ + -DCMAKE_TOOLCHAIN_FILE=${DOCKER_ENV_QT_PATH_WASM_SINGLETHREAD}/lib/cmake/Qt6/qt.toolchain.cmake \ + -DQT_HOST_PATH=${DOCKER_ENV_QT_PATH_LINUX_GCC_64} \ -DCMAKE_C_COMPILER=${EMSDK}/upstream/emscripten/emcc \ -DCMAKE_CXX_COMPILER=${EMSDK}/upstream/emscripten/em++ \ -DCMAKE_INSTALL_PREFIX=${QDS_CI_JOB_ARTIFACTS_PATH} - - cmake --build ${QDS_BUILD_PATH} - - cmake --install ${QDS_BUILD_PATH} + - cmake --build ${QDS_CI_BUILD_PATH} + - cmake --install ${QDS_CI_BUILD_PATH} - echo "PREVIOUS_JOB_ID=${CI_JOB_ID}" >> build.env - echo "JOB_TARGET_ARCH=${QDS_CI_JOB_TARGET_ARCH}" >> build.env diff --git a/cicd/stages/release.yml b/cicd/stages/release.yml index 0eda911..7f652bb 100644 --- a/cicd/stages/release.yml +++ b/cicd/stages/release.yml @@ -6,7 +6,7 @@ create-packages: rules: - if: $CI_COMMIT_TAG needs: - - job: build-wasm-multiarch + - job: build-wasm optional: true artifacts: true variables: diff --git a/cicd/stages/trigger.yml b/cicd/stages/trigger.yml index c01011c..b097b13 100644 --- a/cicd/stages/trigger.yml +++ b/cicd/stages/trigger.yml @@ -6,7 +6,7 @@ QDS_CI_PARENT_PROJECT_ID: ${CI_PROJECT_ID} QDS_CI_PARENT_PIPELINE_ARCH: ${JOB_TARGET_ARCH} needs: - - job: build-wasm-multiarch + - job: build-wasm artifacts: true optional: true trigger: diff --git a/resources/dvicon-new.png b/resources/dvicon-new.png new file mode 100644 index 0000000000000000000000000000000000000000..554b5eee2046e491e36ea9c489a20fa602b72bd7 GIT binary patch literal 39926 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 VF`Fx|MuIWWQInHL$__h5{0r8`Yt;Y% literal 0 HcmV?d00001 diff --git a/src/designviewer.cpp b/src/designviewer.cpp index f9cd839..7eb3fe6 100644 --- a/src/designviewer.cpp +++ b/src/designviewer.cpp @@ -24,9 +24,9 @@ ****************************************************************************/ #include "designviewer.h" -#if defined(Q_OS_WASM) #include <emscripten.h> +#include <emscripten/val.h> #include <functional> #include <QBuffer> @@ -38,7 +38,13 @@ #include <QResource> #include <QTemporaryDir> #include <QTemporaryFile> -#include <private/qzipreader_p.h> +#include <QTimer> + +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) +#include <QtCore/private/qzipreader_p.h> +#else +#include <QtGui/private/qzipreader_p.h> +#endif #define printErr(x) printError(x, __FILE_NAME__, __LINE__) @@ -56,55 +62,29 @@ extern "C" EMSCRIPTEN_KEEPALIVE void qt_callSetFileData(char *content, DesignViewer::DesignViewer() { + printLog("DesignViewer constructor"); QString projectFileName; QByteArray projectData; + printLog("Fetching project"); fetchProject(&projectData, &projectFileName); - if (!runProject(projectData, projectFileName)) - printError("Failed to run project", projectFileName, 0); + printLog("Running project"); + if (!runProject(projectData, projectFileName)) { + printErr("Failed to run project"); + } + printLog("DesignViewer constructor done"); } void DesignViewer::fetchProject(QByteArray *data, QString *fileName) { - // Call qt_callSetFileData to make sure the emscripten linker does not - // optimize it away, which may happen if the function is called from JavaScript - // only. Set g_setFileDataCallback to null to make it a no-op. - ::g_setFileDataCallback = nullptr; - ::qt_callSetFileData(nullptr, 0, nullptr); - - auto setFileDataCallback = - [data, fileName](char *content, size_t contentSize, char *projectFilename) - { - data->setRawData(content, contentSize); - *fileName = QString::fromUtf8(projectFilename); - }; - g_setFileDataCallback = setFileDataCallback; - - EM_ASM_({ - // Copy the file file content to the C++ heap. - // Note: this could be simplified by passing the content as an - // "array" type to ccall and then let it copy to C++ memory. - // However, this built-in solution does not handle files larger - // than ~15M (Chrome). Instead, allocate memory manually and - // pass a pointer to the C++ side (which will free() it when done). - - // TODO: consider slice()ing the file to read it picewise and - // then assembling it in a QByteArray on the C++ side. - - const contentSize = contentArray.byteLength; - const heapPointer = _malloc(contentSize); - const heapBytes = new Uint8Array(Module.HEAPU8.buffer, heapPointer, contentSize); - heapBytes.set(contentArray); - - // Null out the first data copy to enable GC - reader = null; - contentArray = null; - - // Call the C++ file data ready callback - ccall("qt_callSetFileData", - null, - [ "number", "number", "string" ], - [ heapPointer, contentSize, projectfileName ]); - }); + printLog("Init project data"); + // Access global variables set by index.html + emscripten::val jsData = emscripten::val::global("contentArray"); + emscripten::val jsFileName = emscripten::val::global("projectfileName"); + + printLog("Copying project data"); + // Copy project data to the C++ heap and convert string + *data = QByteArray::fromEcmaUint8Array(jsData); + *fileName = QString::fromStdString(jsFileName.as<std::string>()); } QString DesignViewer::unpackProject(const QByteArray &project, bool extractZip) @@ -163,84 +143,7 @@ QString DesignViewer::unpackProject(const QByteArray &project, bool extractZip) projectLocation = ":" + resourcePath; } - // create a temporary directory and copy the project there - QTemporaryDir tempDir; - tempDir.setAutoRemove(false); - if (!tempDir.isValid()) { - printErr("Could not create a temporary directory."); - return ""; - } - - const QString tempDirPath = tempDir.path(); - printLog("Temporary directory: " + tempDirPath); - - QDir tempDirDir(tempDirPath); - if (!tempDirDir.exists()) { - printErr("Temporary directory does not exist."); - return ""; - } - - if (!QDir(projectLocation).exists()) { - printErr("Project directory does not exist."); - return ""; - } - - // copy all files and directories from projectLocation to tempDirPath - QDirIterator it(projectLocation, - QDir::AllEntries | QDir::NoDotAndDotDot, - QDirIterator::Subdirectories); - printLog("Files in project location: " + projectLocation); - while (it.hasNext()) { - const QString filePath = it.next(); - printLog("Found file: " + filePath); - const QFileInfo fileInfo(filePath); - const QString relativeFilePath = fileInfo.filePath().remove(projectLocation); - const QString newFilePath = tempDirPath + relativeFilePath; - printLog("Copying file: " + filePath + " to " + newFilePath); - if (fileInfo.isDir()) { - QDir().mkpath(newFilePath); - } else if (!QFile::copy(filePath, newFilePath)) { - printErr("Could not copy file: " + filePath + " to " + newFilePath); - return ""; - } - } - - // find all .qml files in the temporary directory and remove the Qt versions from 6.5 to 6.9 - // at the end of the import statements. example "import <modulename> 6.5" -> "import <modulename>" - QDirIterator it2(tempDirPath, {"*.qml"}, QDir::Files, QDirIterator::Subdirectories); - - printLog("Files in temporary directory: " + tempDirPath); - while (it2.hasNext()) { - const QString filePath = it2.next(); - QFile file(filePath); - // set file permissions to read and write - file.setPermissions(QFile::ReadOwner | QFile::WriteOwner); - if (!file.open(QIODevice::ReadWrite)) { - printErr("Could not open file: " + filePath); - return ""; - } - - const QRegularExpression importRegExp("import\\s+\\S+\\s+6\\.[5-9]"); - QString content = QString::fromUtf8(file.readAll()); - while (content.contains(importRegExp)) { - const QRegularExpressionMatch match = importRegExp.match(content); - const QStringList textList = match.capturedTexts(); - - for (const QString &text : textList) { - const QString newText = QString(text).remove(QRegularExpression("\\s+6\\.[5-9]")); - printLog("Found text to replace: " + text + " with " + newText + " in file " - + filePath); - content.replace(text, newText); - } - } - - file.resize(0); - file.write(content.toUtf8()); - file.close(); - } - - // return the temporary directory path - return tempDirPath; + return projectLocation; } QString DesignViewer::findFile(const QString &dir, const QString &filter) @@ -354,7 +257,7 @@ bool DesignViewer::runProject(const QByteArray &projectData, const QString &proj printLog("Found mainQmlFile: " + mainQmlFilePath); QUrl mainQmlUrl = QUrl::fromUserInput(mainQmlFilePath); - QFile file(mainQmlUrl.path()); + QFile file(mainQmlUrl.path().prepend(":")); if (!file.open(QIODevice::ReadOnly)) { printErr("Could not open mainQmlfile for reading! " + file.fileName() + ": " + file.errorString()); return false; @@ -450,21 +353,53 @@ void DesignViewer::printWarn(const QString &message) void DesignViewer::printError(const QString &message, const QString &fileName, int line) { + fprintf(stderr, "ERROR:%s\n", qPrintable(message)); QString escaped = message; escaped.replace("'", "\'"); escaped.replace("\n", "\\n"); - emscripten_run_script("alert('" + escaped.toUtf8() + "');"); - emscripten_run_script("location.hash = ''; location.reload();"); + emscripten::val location = emscripten::val::global("window")["location"]; + location.set("hash", std::string()); + location.call<void>("reload"); } void DesignViewer::showAppWindow() { printLog("Resizing the QML app window"); const QSize size; - const QString command = QString::fromLatin1("setScreenSize(%1, %2);").arg(size.width()).arg(size.height()); - emscripten_run_script(command.toUtf8()); + + printLog("Getting the QML app window container"); + emscripten::val qtContainer = emscripten::val::global("qtcontainer"); // global from index.html + printLog("Getting the QML app window style"); + emscripten::val qtContainerStyle = qtContainer["style"]; + + printLog("Setting the QML app window size"); + if (size.isEmpty()) { + printLog("Setting the QML app window size to 100%"); + qtContainerStyle.set("width", std::string("100%")); + // qtContainerStyle.set("height", + // std::string( + // "100%")); // ### FIXME: 100% height gives 0px height for some reason + } else { + printLog("Setting the QML app window size to " + + QString("%1x%2").arg(size.width()).arg(size.height())); + qtContainerStyle.set("width", QString("%1px").arg(size.width()).toStdString()); + qtContainerStyle.set("height", QString("%1px").arg(size.height()).toStdString()); + } + + printLog("Setting the QML app window position"); + + // Make Qt pick up the new container size by calling the resizeCanvasElement() + // qtloader API. This needs to be done on delay after initial setup to make + // sure qtloader is initialized. + // QTimer::singleShot(0, [&]() { + // emscripten::val instance = emscripten::val::global("instance"); + // if (instance.isNull()) { + // printErr("instance is null"); + // return; + // } + // instance.call<void>("qtResizeContainerElement", qtContainer); + // printLog("QML app window position set"); + // }); printLog("Showing the QML app window"); m_quickWindow->show(); } - -#endif // Q_OS_WASM diff --git a/src/designviewer.h b/src/designviewer.h index f7f28c9..1736277 100644 --- a/src/designviewer.h +++ b/src/designviewer.h @@ -47,6 +47,8 @@ private: QQmlEngine m_qmlEngine; QQmlComponent m_qmlComponent{&m_qmlEngine}; + QWidget *m_appWindow = nullptr; + void printLog(const QString &message); void printWarn(const QString &message); void printError(const QString &message, const QString &fileName, int line); diff --git a/www/index.html b/www/index.html index f632168..962aba2 100644 --- a/www/index.html +++ b/www/index.html @@ -61,6 +61,7 @@ > </center> </figure> + <div id="qtcontainer"></div> <div id="dropzone"> <div id="instruction">Drop your qmlrc file or zip file here</div> @@ -119,9 +120,10 @@ </div> <canvas - id="qtcanvas" + id="canvas" oncontextmenu="event.preventDefault()" contenteditable="true" + style="display: none" ></canvas> <div id="footer"> <div id="alertBox" class="alert"> @@ -148,7 +150,7 @@ </p> <p id="versioninfo_main">Version: 1.0.0</p> </div> - + <script src="qtdesignviewer.js"></script> <script src="scripts/script.js" type="text/javascript"></script> <script src="qtloader.js" type="text/javascript"></script> </body> diff --git a/www/scripts/script.js b/www/scripts/script.js index 25576da..4f3e9e6 100644 --- a/www/scripts/script.js +++ b/www/scripts/script.js @@ -1,8 +1,8 @@ var contentArray; var projectfileName; var reader; -var spinner = document.querySelector("#qtspinner"); -var canvas = document.querySelector("#qtcanvas"); + +var canvas = document.querySelector("#canvas"); var uploadform = document.querySelector("#uploadform"); var fileinput = document.querySelector("#fileinput"); var dropzone = document.querySelector("#dropzone"); @@ -17,8 +17,8 @@ var alertBox = document.querySelector("#alertBox"); var passwordDialog = document.querySelector("#passwordDialog"); var alertText = document.querySelector("#alertText"); var passwordInput = document.querySelector("#passwordInput"); -var qtLoader; var versionInfo = undefined; +var instance; function showAlert(text) { alertText.innerHTML = text; @@ -206,63 +206,56 @@ function init() { }; } -function restart() { - qtLoader.loadEmscriptenModule("qtdesignviewer"); -} - -function loadProjector() { - qtLoader = QtLoader({ - canvasElements: [canvas], - showLoader: function (loaderStatus) { - spinner.style.display = "block"; - canvas.style.display = "none"; - if (loaderStatus === "Downloading/Compiling") - loaderStatus = "Starting"; - launchstatustext.innerHTML = loaderStatus; - }, - showError: function (errorText) { - launchstatustext.innerHTML = errorText; - spinner.style.display = "block"; - canvas.style.display = "none"; - }, - showExit: function () { - launchstatustext.innerHTML = "Application exit"; - if (qtLoader.exitCode !== undefined) - launchstatustext.innerHTML += " with code " + qtLoader.exitCode; - if (qtLoader.exitText !== undefined) - launchstatustext.innerHTML += " (" + qtLoader.exitText + ")"; - spinner.style.display = "block"; - canvas.style.display = "none"; - }, - showCanvas: function () { - spinner.style.display = "none"; - canvas.style.display = "block"; - launchstatus.style.display = "none"; - appheader.style.display = "block"; - }, - }); +async function loadProjector() { + const spinner = document.querySelector("#qtspinner"); + const container = document.querySelector('#qtcontainer'); + const status = document.querySelector('#qtstatus'); - // workaround for making sure that self.module is set up before - // running setScreenSize - self.moduleConfig.preRun = []; - self.moduleConfig.preRun.push(function (module) { - self.module = module; - }); + const showUi = (ui) => { + [spinner, container].forEach(element => element.style.display = 'none'); + if (container === ui) + container.style.position = 'default'; + ui.style.display = 'block'; + } - qtLoader.loadEmscriptenModule("qtdesignviewer"); + try { + showUi(spinner); + status.innerHTML = 'Loading...'; + instance = await qtLoad({ + qt: { + onLoaded: () => { + setContainerSize(container, window.innerWidth, window.innerHeight); + showUi(container); + }, + onExit: exitData => { + console.log("onExit"); + status.innerHTML = 'Application exit'; + status.innerHTML += + exitData.code !== undefined ? ` with code ` : ''; + status.innerHTML += + exitData.text !== undefined ? ` ()` : ''; + showUi(spinner); + }, + entryFunction: window.createQtAppInstance, + containerElements: [container] + } + }); + } catch (e) { + console.error(e); + console.error(e.stack); + } } -function setScreenSize(width, height) { +function setContainerSize(container, width, height) { if (width > 1 && height > 1) { - canvas.style.width = `${width}px`; - canvas.style.height = `${height}px`; + container.style.width = `${width}px`; + container.style.height = `${height}px`; } else { // undefined root size - canvas.style.width = canvas.style.height = "100%"; + container.style.width = container.style.height = "100%"; document.documentElement.style.height = document.body.style.height = "100%"; document.documentElement.style.overflow = document.body.style.overflow = "hidden"; } - qtLoader.resizeCanvasElement(canvas); } -- GitLab