aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/webassembly/webassemblysettings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/webassembly/webassemblysettings.cpp')
-rw-r--r--src/plugins/webassembly/webassemblysettings.cpp168
1 files changed, 168 insertions, 0 deletions
diff --git a/src/plugins/webassembly/webassemblysettings.cpp b/src/plugins/webassembly/webassemblysettings.cpp
new file mode 100644
index 00000000000..fb9293f2c84
--- /dev/null
+++ b/src/plugins/webassembly/webassemblysettings.cpp
@@ -0,0 +1,168 @@
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include "webassemblysettings.h"
+
+#include "webassemblyconstants.h"
+#include "webassemblyemsdk.h"
+#include "webassemblyqtversion.h"
+#include "webassemblytoolchain.h"
+#include "webassemblytr.h"
+
+#include <coreplugin/icore.h>
+
+#include <utils/aspects.h>
+#include <utils/environment.h>
+#include <utils/infolabel.h>
+#include <utils/layoutbuilder.h>
+#include <utils/pathchooser.h>
+#include <utils/utilsicons.h>
+
+#include <QGroupBox>
+#include <QTextBrowser>
+#include <QTimer>
+
+using namespace Utils;
+
+namespace WebAssembly {
+namespace Internal {
+
+static WebAssemblySettings *theSettings = nullptr;
+
+WebAssemblySettings *WebAssemblySettings::instance()
+{
+ return theSettings;
+}
+
+static QString environmentDisplay(const FilePath &sdkRoot)
+{
+ Environment env;
+ WebAssemblyEmSdk::addToEnvironment(sdkRoot, env);
+ QString result;
+ auto h4 = [](const QString &text) { return QString("<h4>" + text + "</h4>"); };
+ result.append(h4(Tr::tr("Adding directories to PATH:")));
+ result.append(env.value("PATH").replace(OsSpecificAspects::pathListSeparator(sdkRoot.osType()), "<br/>"));
+ result.append(h4(Tr::tr("Setting environment variables:")));
+ for (const QString &envVar : env.toStringList()) {
+ if (!envVar.startsWith("PATH")) // Path was already printed out above
+ result.append(envVar + "<br/>");
+ }
+ return result;
+}
+
+WebAssemblySettings::WebAssemblySettings()
+{
+ theSettings = this;
+
+ setSettingsGroup("WebAssembly");
+
+ setId(Id(Constants::SETTINGS_ID));
+ setDisplayName(Tr::tr("WebAssembly"));
+ setCategory(ProjectExplorer::Constants::DEVICE_SETTINGS_CATEGORY);
+
+ registerAspect(&emSdk);
+ emSdk.setSettingsKey("EmSdk");
+ emSdk.setExpectedKind(Utils::PathChooser::ExistingDirectory);
+ emSdk.setDefaultFilePath(FileUtils::homePath());
+
+ connect(this, &Utils::AspectContainer::applied, &WebAssemblyToolChain::registerToolChains);
+
+ setLayouter([this] {
+ auto instruction = new QLabel(
+ Tr::tr("Select the root directory of an installed %1. "
+ "Ensure that the activated SDK version is compatible with the %2 "
+ "or %3 version that you plan to develop against.")
+ .arg(R"(<a href="https://emscripten.org/docs/getting_started/downloads.html">Emscripten SDK</a>)")
+ .arg(R"(<a href="https://doc.qt.io/qt-5/wasm.html#install-emscripten">Qt 5</a>)")
+ .arg(R"(<a href="https://doc.qt.io/qt-6/wasm.html#install-emscripten">Qt 6</a>)"));
+ instruction->setOpenExternalLinks(true);
+ instruction->setWordWrap(true);
+
+ m_emSdkVersionDisplay = new InfoLabel;
+ m_emSdkVersionDisplay->setElideMode(Qt::ElideNone);
+ m_emSdkVersionDisplay->setWordWrap(true);
+
+ m_emSdkEnvDisplay = new QTextBrowser;
+ m_emSdkEnvDisplay->setLineWrapMode(QTextBrowser::NoWrap);
+
+ const QString minimumSupportedQtVersion =
+ WebAssemblyQtVersion::minimumSupportedQtVersion().toString();
+ m_qtVersionDisplay = new InfoLabel(
+ Tr::tr("Note: %1 supports Qt %2 for WebAssembly and higher. "
+ "Your installed lower Qt version(s) are not supported.")
+ .arg(Core::ICore::versionString(), minimumSupportedQtVersion),
+ InfoLabel::Warning);
+ m_qtVersionDisplay->setElideMode(Qt::ElideNone);
+ m_qtVersionDisplay->setWordWrap(true);
+
+ // _clang-format off
+ using namespace Layouting;
+ Column col {
+ Group {
+ title(Tr::tr("Emscripten SDK path:")),
+ Column {
+ instruction,
+ emSdk,
+ m_emSdkVersionDisplay,
+ },
+ },
+ Group {
+ title(Tr::tr("Emscripten SDK environment:")),
+ bindTo(&m_emSdkEnvGroupBox),
+ Column {
+ m_emSdkEnvDisplay,
+ },
+ },
+ m_qtVersionDisplay,
+ };
+ // _clang-format on
+
+ connect(emSdk.pathChooser(), &Utils::PathChooser::textChanged,
+ this, &WebAssemblySettings::updateStatus);
+
+ // updateStatus() uses m_emSdkEnvGroupBox which only exists
+ // after this here emerges. So delay the update a bit.
+ QTimer::singleShot(0, this, &WebAssemblySettings::updateStatus);
+
+ return col;
+ });
+
+ readSettings();
+}
+
+void WebAssemblySettings::updateStatus()
+{
+ WebAssemblyEmSdk::clearCaches();
+
+ const Utils::FilePath newEmSdk = emSdk.pathChooser()->filePath();
+ const bool sdkValid = newEmSdk.exists() && WebAssemblyEmSdk::isValid(newEmSdk);
+
+ QTC_ASSERT(m_emSdkVersionDisplay, return);
+ QTC_ASSERT(m_emSdkEnvGroupBox, return);
+ m_emSdkVersionDisplay->setVisible(sdkValid);
+ m_emSdkEnvGroupBox->setEnabled(sdkValid);
+
+ if (sdkValid) {
+ const QVersionNumber sdkVersion = WebAssemblyEmSdk::version(newEmSdk);
+ const QVersionNumber minVersion = WebAssemblyToolChain::minimumSupportedEmSdkVersion();
+ const bool versionTooLow = sdkVersion < minVersion;
+ m_emSdkVersionDisplay->setType(versionTooLow ? InfoLabel::NotOk : InfoLabel::Ok);
+ auto bold = [](const QString &text) { return QString("<b>" + text + "</b>"); };
+ m_emSdkVersionDisplay->setText(
+ versionTooLow ? Tr::tr("The activated version %1 is not supported by %2. "
+ "Activate version %3 or higher.")
+ .arg(bold(sdkVersion.toString()))
+ .arg(bold(Core::ICore::versionString()))
+ .arg(bold(minVersion.toString()))
+ : Tr::tr("Activated version: %1")
+ .arg(bold(sdkVersion.toString())));
+ m_emSdkEnvDisplay->setText(environmentDisplay(newEmSdk));
+ } else {
+ m_emSdkEnvDisplay->clear();
+ }
+
+ m_qtVersionDisplay->setVisible(WebAssemblyQtVersion::isUnsupportedQtVersionInstalled());
+}
+
+} // Internal
+} // WebAssembly