diff --git a/src/plugins/webassembly/CMakeLists.txt b/src/plugins/webassembly/CMakeLists.txt index 3ee300b09ff..6609357f015 100644 --- a/src/plugins/webassembly/CMakeLists.txt +++ b/src/plugins/webassembly/CMakeLists.txt @@ -4,16 +4,16 @@ add_qtc_plugin(WebAssembly SOURCES webassembly.qrc webassembly_global.h - webassemblytr.h webassemblyconstants.h webassemblydevice.cpp webassemblydevice.h webassemblyemsdk.cpp webassemblyemsdk.h - webassemblyoptionspage.cpp webassemblyoptionspage.h webassemblyplugin.cpp webassemblyplugin.h webassemblyqtversion.cpp webassemblyqtversion.h - webassemblyrunconfigurationaspects.cpp webassemblyrunconfigurationaspects.h webassemblyrunconfiguration.cpp webassemblyrunconfiguration.h + webassemblyrunconfigurationaspects.cpp webassemblyrunconfigurationaspects.h + webassemblysettings.cpp webassemblysettings.h webassemblytoolchain.cpp webassemblytoolchain.h + webassemblytr.h ) extend_qtc_plugin(WebAssembly diff --git a/src/plugins/webassembly/webassembly.qbs b/src/plugins/webassembly/webassembly.qbs index b859ea538a2..12b639238cb 100644 --- a/src/plugins/webassembly/webassembly.qbs +++ b/src/plugins/webassembly/webassembly.qbs @@ -13,24 +13,25 @@ QtcPlugin { files: [ "webassembly.qrc", - "webassembly_global.h", "webassemblytr.h", + "webassembly_global.h", "webassemblyconstants.h", "webassemblydevice.cpp", "webassemblydevice.h", "webassemblyemsdk.cpp", "webassemblyemsdk.h", - "webassemblyoptionspage.cpp", - "webassemblyoptionspage.h", "webassemblyplugin.cpp", "webassemblyplugin.h", "webassemblyqtversion.cpp", "webassemblyqtversion.h", - "webassemblyrunconfigurationaspects.cpp", - "webassemblyrunconfigurationaspects.h", "webassemblyrunconfiguration.cpp", "webassemblyrunconfiguration.h", + "webassemblyrunconfigurationaspects.cpp", + "webassemblyrunconfigurationaspects.h", + "webassemblysettings.cpp", + "webassemblysettings.h", "webassemblytoolchain.cpp", "webassemblytoolchain.h", + "webassemblytr.h", ] QtcTestFiles { diff --git a/src/plugins/webassembly/webassemblyconstants.h b/src/plugins/webassembly/webassemblyconstants.h index 40f49f73a4f..56315b0b404 100644 --- a/src/plugins/webassembly/webassemblyconstants.h +++ b/src/plugins/webassembly/webassemblyconstants.h @@ -14,8 +14,5 @@ const char WEBASSEMBLY_DEVICE_DEVICE_ID[] = "WebAssembly Device"; const char WEBASSEMBLY_QT_VERSION[] = "Qt4ProjectManager.QtVersion.WebAssembly"; const char WEBASSEMBLY_RUNCONFIGURATION_EMRUN[] = "WebAssembly.RunConfiguration.Emrun"; -const char SETTINGS_GROUP[] = "WebAssembly"; -const char SETTINGS_KEY_EMSDK[] = "EmSdk"; - } // namespace WebAssembly } // namespace Constants diff --git a/src/plugins/webassembly/webassemblyemsdk.cpp b/src/plugins/webassembly/webassemblyemsdk.cpp index 42f8738a8e7..507c2949654 100644 --- a/src/plugins/webassembly/webassemblyemsdk.cpp +++ b/src/plugins/webassembly/webassemblyemsdk.cpp @@ -11,7 +11,6 @@ #include #include -#include using namespace Utils; @@ -99,21 +98,6 @@ QVersionNumber version(const FilePath &sdkRoot) return *emSdkVersionCache()->object(cacheKey); } -void registerEmSdk(const FilePath &sdkRoot) -{ - QSettings *s = Core::ICore::settings(); - s->setValue(QLatin1String(Constants::SETTINGS_GROUP) + '/' - + QLatin1String(Constants::SETTINGS_KEY_EMSDK), sdkRoot.toString()); -} - -FilePath registeredEmSdk() -{ - QSettings *s = Core::ICore::settings(); - const QString path = s->value(QLatin1String(Constants::SETTINGS_GROUP) + '/' - + QLatin1String(Constants::SETTINGS_KEY_EMSDK)).toString(); - return FilePath::fromUserInput(path); -} - void clearCaches() { emSdkEnvCache()->clear(); diff --git a/src/plugins/webassembly/webassemblyemsdk.h b/src/plugins/webassembly/webassemblyemsdk.h index 8310e0320f2..55d83abcd22 100644 --- a/src/plugins/webassembly/webassemblyemsdk.h +++ b/src/plugins/webassembly/webassemblyemsdk.h @@ -16,8 +16,6 @@ bool isValid(const Utils::FilePath &sdkRoot); void parseEmSdkEnvOutputAndAddToEnv(const QString &output, Utils::Environment &env); void addToEnvironment(const Utils::FilePath &sdkRoot, Utils::Environment &env); QVersionNumber version(const Utils::FilePath &sdkRoot); -void registerEmSdk(const Utils::FilePath &sdkRoot); -Utils::FilePath registeredEmSdk(); void clearCaches(); } // WebAssembly::Internal::WebAssemblyEmSdk diff --git a/src/plugins/webassembly/webassemblyoptionspage.cpp b/src/plugins/webassembly/webassemblyoptionspage.cpp deleted file mode 100644 index 1a4524b945a..00000000000 --- a/src/plugins/webassembly/webassemblyoptionspage.cpp +++ /dev/null @@ -1,175 +0,0 @@ -// 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 "webassemblyconstants.h" -#include "webassemblyemsdk.h" -#include "webassemblyoptionspage.h" -#include "webassemblyqtversion.h" -#include "webassemblytoolchain.h" -#include "webassemblytr.h" - -#include -#include -#include -#include -#include - -#include -#include -#include - -using namespace Utils; - -namespace WebAssembly { -namespace Internal { - -class WebAssemblyOptionsWidget : public Core::IOptionsPageWidget -{ -public: - WebAssemblyOptionsWidget(); - - void updateStatus(); - -private: - void apply() final; - void showEvent(QShowEvent *event) final; - - PathChooser *m_emSdkPathChooser; - InfoLabel *m_emSdkVersionDisplay; - QGroupBox *m_emSdkEnvGroupBox; - QTextBrowser *m_emSdkEnvDisplay; - InfoLabel *m_qtVersionDisplay; -}; - -WebAssemblyOptionsWidget::WebAssemblyOptionsWidget() -{ - auto mainLayout = new QVBoxLayout(this); - - { - auto pathChooserBox = new QGroupBox(Tr::tr("Emscripten SDK path:")); - pathChooserBox->setFlat(true); - auto layout = new QVBoxLayout(pathChooserBox); - 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"(Emscripten SDK)") - .arg(R"(Qt 5)") - .arg(R"(Qt 6)")); - - instruction->setOpenExternalLinks(true); - instruction->setWordWrap(true); - layout->addWidget(instruction); - m_emSdkPathChooser = new PathChooser(this); - m_emSdkPathChooser->setExpectedKind(PathChooser::Directory); - m_emSdkPathChooser->setInitialBrowsePathBackup(FileUtils::homePath()); - m_emSdkPathChooser->setFilePath(WebAssemblyEmSdk::registeredEmSdk()); - connect(m_emSdkPathChooser, &PathChooser::textChanged, - this, &WebAssemblyOptionsWidget::updateStatus); - layout->addWidget(m_emSdkPathChooser); - m_emSdkVersionDisplay = new InfoLabel(this); - m_emSdkVersionDisplay->setElideMode(Qt::ElideNone); - m_emSdkVersionDisplay->setWordWrap(true); - layout->addWidget(m_emSdkVersionDisplay); - mainLayout->addWidget(pathChooserBox); - } - - { - m_emSdkEnvGroupBox = new QGroupBox(Tr::tr("Emscripten SDK environment:")); - m_emSdkEnvGroupBox->setFlat(true); - m_emSdkEnvGroupBox->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::MinimumExpanding); - auto layout = new QVBoxLayout(m_emSdkEnvGroupBox); - m_emSdkEnvDisplay = new QTextBrowser; - m_emSdkEnvDisplay->setLineWrapMode(QTextBrowser::NoWrap); - m_emSdkEnvDisplay->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); - layout->addWidget(m_emSdkEnvDisplay); - mainLayout->addWidget(m_emSdkEnvGroupBox, 1); - } - - mainLayout->addStretch(); - - { - 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); - mainLayout->addWidget(m_qtVersionDisplay); - } -} - -static QString environmentDisplay(const FilePath &sdkRoot) -{ - Environment env; - WebAssemblyEmSdk::addToEnvironment(sdkRoot, env); - QString result; - auto h4 = [](const QString &text) { return QString("

" + text + "

"); }; - result.append(h4(Tr::tr("Adding directories to PATH:"))); - result.append(env.value("PATH").replace(OsSpecificAspects::pathListSeparator(sdkRoot.osType()), "
")); - 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 + "
"); - } - return result; -} - -void WebAssemblyOptionsWidget::updateStatus() -{ - WebAssemblyEmSdk::clearCaches(); - - const FilePath sdkPath = m_emSdkPathChooser->filePath(); - const bool sdkValid = sdkPath.exists() && WebAssemblyEmSdk::isValid(sdkPath); - - m_emSdkVersionDisplay->setVisible(sdkValid); - m_emSdkEnvGroupBox->setVisible(sdkValid); - - if (sdkValid) { - const QVersionNumber sdkVersion = WebAssemblyEmSdk::version(sdkPath); - 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("" + text + ""); }; - 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(sdkPath)); - } - - m_qtVersionDisplay->setVisible(WebAssemblyQtVersion::isUnsupportedQtVersionInstalled()); -} - -void WebAssemblyOptionsWidget::showEvent(QShowEvent *event) -{ - Q_UNUSED(event) - updateStatus(); -} - -void WebAssemblyOptionsWidget::apply() -{ - const FilePath sdkPath = m_emSdkPathChooser->filePath(); - if (!WebAssemblyEmSdk::isValid(sdkPath)) - return; - WebAssemblyEmSdk::registerEmSdk(sdkPath); - WebAssemblyToolChain::registerToolChains(); -} - -WebAssemblyOptionsPage::WebAssemblyOptionsPage() -{ - setId(Id(Constants::SETTINGS_ID)); - setDisplayName(Tr::tr("WebAssembly")); - setCategory(ProjectExplorer::Constants::DEVICE_SETTINGS_CATEGORY); - setWidgetCreator([] { return new WebAssemblyOptionsWidget; }); -} - -} // Internal -} // WebAssembly diff --git a/src/plugins/webassembly/webassemblyoptionspage.h b/src/plugins/webassembly/webassemblyoptionspage.h deleted file mode 100644 index 62a17a9b153..00000000000 --- a/src/plugins/webassembly/webassemblyoptionspage.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (C) 2020 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include - -namespace WebAssembly { -namespace Internal { - -class WebAssemblyOptionsPage final : public Core::IOptionsPage -{ -public: - WebAssemblyOptionsPage(); -}; - -} // namespace Internal -} // namespace WebAssmbly diff --git a/src/plugins/webassembly/webassemblyplugin.cpp b/src/plugins/webassembly/webassemblyplugin.cpp index 0857e43f2f9..28227884da7 100644 --- a/src/plugins/webassembly/webassemblyplugin.cpp +++ b/src/plugins/webassembly/webassemblyplugin.cpp @@ -8,9 +8,9 @@ #endif // WITH_TESTS #include "webassemblyconstants.h" #include "webassemblydevice.h" -#include "webassemblyoptionspage.h" #include "webassemblyqtversion.h" #include "webassemblyrunconfiguration.h" +#include "webassemblysettings.h" #include "webassemblytoolchain.h" #include "webassemblytr.h" @@ -39,7 +39,7 @@ public: WebAssemblyQtVersionFactory qtVersionFactory; EmrunRunConfigurationFactory emrunRunConfigurationFactory; EmrunRunWorkerFactory emrunRunWorkerFactory; - WebAssemblyOptionsPage optionsPage; + WebAssemblySettings settings; }; static WebAssemblyPluginPrivate *dd = nullptr; diff --git a/src/plugins/webassembly/webassemblysettings.cpp b/src/plugins/webassembly/webassemblysettings.cpp new file mode 100644 index 00000000000..3d85e2127fd --- /dev/null +++ b/src/plugins/webassembly/webassemblysettings.cpp @@ -0,0 +1,164 @@ +// 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 + +#include +#include +#include +#include +#include +#include + +#include +#include + +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("

" + text + "

"); }; + result.append(h4(Tr::tr("Adding directories to PATH:"))); + result.append(env.value("PATH").replace(OsSpecificAspects::pathListSeparator(sdkRoot.osType()), "
")); + 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 + "
"); + } + 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()); + + setLayouter([this](QWidget *widget) { + 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"(Emscripten SDK)") + .arg(R"(Qt 5)") + .arg(R"(Qt 6)")); + 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 { + 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, + }.attachTo(widget); + // _clang-format on + + updateStatus(); + connect(emSdk.pathChooser(), &Utils::PathChooser::textChanged, + this, &WebAssemblySettings::updateStatus); + }); + + readSettings(); +} + +void WebAssemblySettings::apply() +{ + WebAssemblyToolChain::registerToolChains(); + Core::IOptionsPage::apply(); +} + +void WebAssemblySettings::updateStatus() +{ + WebAssemblyEmSdk::clearCaches(); + + const Utils::FilePath newEmSdk = emSdk.pathChooser()->filePath(); + const bool sdkValid = newEmSdk.exists() && WebAssemblyEmSdk::isValid(newEmSdk); + + 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("" + text + ""); }; + 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 diff --git a/src/plugins/webassembly/webassemblysettings.h b/src/plugins/webassembly/webassemblysettings.h new file mode 100644 index 00000000000..1d92a5176d1 --- /dev/null +++ b/src/plugins/webassembly/webassemblysettings.h @@ -0,0 +1,35 @@ +// Copyright (C) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include + +QT_BEGIN_NAMESPACE +class QTextBrowser; +QT_END_NAMESPACE + +namespace WebAssembly { +namespace Internal { + +class WebAssemblySettings final : public Core::PagedSettings +{ +public: + WebAssemblySettings(); + + static WebAssemblySettings *instance(); + void apply() final; + + Utils::FilePathAspect emSdk; + +private: + QWidget *m_emSdkEnvGroupBox = nullptr; + Utils::InfoLabel *m_emSdkVersionDisplay = nullptr; + QTextBrowser *m_emSdkEnvDisplay = nullptr; + Utils::InfoLabel *m_qtVersionDisplay = nullptr; + + void updateStatus(); +}; + +} // namespace Internal +} // namespace WebAssmbly diff --git a/src/plugins/webassembly/webassemblytoolchain.cpp b/src/plugins/webassembly/webassemblytoolchain.cpp index c413f27566c..c554ee65cd5 100644 --- a/src/plugins/webassembly/webassemblytoolchain.cpp +++ b/src/plugins/webassembly/webassemblytoolchain.cpp @@ -1,9 +1,11 @@ // 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 "webassemblytoolchain.h" + #include "webassemblyconstants.h" #include "webassemblyemsdk.h" -#include "webassemblytoolchain.h" +#include "webassemblysettings.h" #include "webassemblytr.h" #include @@ -49,7 +51,8 @@ static void addRegisteredMinGWToEnvironment(Environment &env) void WebAssemblyToolChain::addToEnvironment(Environment &env) const { - WebAssemblyEmSdk::addToEnvironment(WebAssemblyEmSdk::registeredEmSdk(), env); + const FilePath emSdk = WebAssemblySettings::instance()->emSdk(); + WebAssemblyEmSdk::addToEnvironment(emSdk, env); if (env.osType() == OsTypeWindows) addRegisteredMinGWToEnvironment(env); } @@ -92,7 +95,7 @@ const QVersionNumber &WebAssemblyToolChain::minimumSupportedEmSdkVersion() static Toolchains doAutoDetect(const ToolchainDetector &detector) { - const FilePath sdk = WebAssemblyEmSdk::registeredEmSdk(); + const FilePath sdk = WebAssemblySettings::instance()->emSdk(); if (!WebAssemblyEmSdk::isValid(sdk)) return {};