WebAssembly: Base Settings handling on Core::PagedSettings

Change-Id: If28afd8046367eb1b8b12e54d2dae4235dbc821f
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Alessandro Portale
2023-05-17 16:10:10 +02:00
parent 7501d7587f
commit 5acecd4ef9
11 changed files with 216 additions and 227 deletions

View File

@@ -4,16 +4,16 @@ add_qtc_plugin(WebAssembly
SOURCES SOURCES
webassembly.qrc webassembly.qrc
webassembly_global.h webassembly_global.h
webassemblytr.h
webassemblyconstants.h webassemblyconstants.h
webassemblydevice.cpp webassemblydevice.h webassemblydevice.cpp webassemblydevice.h
webassemblyemsdk.cpp webassemblyemsdk.h webassemblyemsdk.cpp webassemblyemsdk.h
webassemblyoptionspage.cpp webassemblyoptionspage.h
webassemblyplugin.cpp webassemblyplugin.h webassemblyplugin.cpp webassemblyplugin.h
webassemblyqtversion.cpp webassemblyqtversion.h webassemblyqtversion.cpp webassemblyqtversion.h
webassemblyrunconfigurationaspects.cpp webassemblyrunconfigurationaspects.h
webassemblyrunconfiguration.cpp webassemblyrunconfiguration.h webassemblyrunconfiguration.cpp webassemblyrunconfiguration.h
webassemblyrunconfigurationaspects.cpp webassemblyrunconfigurationaspects.h
webassemblysettings.cpp webassemblysettings.h
webassemblytoolchain.cpp webassemblytoolchain.h webassemblytoolchain.cpp webassemblytoolchain.h
webassemblytr.h
) )
extend_qtc_plugin(WebAssembly extend_qtc_plugin(WebAssembly

View File

@@ -13,24 +13,25 @@ QtcPlugin {
files: [ files: [
"webassembly.qrc", "webassembly.qrc",
"webassembly_global.h", "webassemblytr.h", "webassembly_global.h",
"webassemblyconstants.h", "webassemblyconstants.h",
"webassemblydevice.cpp", "webassemblydevice.cpp",
"webassemblydevice.h", "webassemblydevice.h",
"webassemblyemsdk.cpp", "webassemblyemsdk.cpp",
"webassemblyemsdk.h", "webassemblyemsdk.h",
"webassemblyoptionspage.cpp",
"webassemblyoptionspage.h",
"webassemblyplugin.cpp", "webassemblyplugin.cpp",
"webassemblyplugin.h", "webassemblyplugin.h",
"webassemblyqtversion.cpp", "webassemblyqtversion.cpp",
"webassemblyqtversion.h", "webassemblyqtversion.h",
"webassemblyrunconfigurationaspects.cpp",
"webassemblyrunconfigurationaspects.h",
"webassemblyrunconfiguration.cpp", "webassemblyrunconfiguration.cpp",
"webassemblyrunconfiguration.h", "webassemblyrunconfiguration.h",
"webassemblyrunconfigurationaspects.cpp",
"webassemblyrunconfigurationaspects.h",
"webassemblysettings.cpp",
"webassemblysettings.h",
"webassemblytoolchain.cpp", "webassemblytoolchain.cpp",
"webassemblytoolchain.h", "webassemblytoolchain.h",
"webassemblytr.h",
] ]
QtcTestFiles { QtcTestFiles {

View File

@@ -14,8 +14,5 @@ const char WEBASSEMBLY_DEVICE_DEVICE_ID[] = "WebAssembly Device";
const char WEBASSEMBLY_QT_VERSION[] = "Qt4ProjectManager.QtVersion.WebAssembly"; const char WEBASSEMBLY_QT_VERSION[] = "Qt4ProjectManager.QtVersion.WebAssembly";
const char WEBASSEMBLY_RUNCONFIGURATION_EMRUN[] = "WebAssembly.RunConfiguration.Emrun"; const char WEBASSEMBLY_RUNCONFIGURATION_EMRUN[] = "WebAssembly.RunConfiguration.Emrun";
const char SETTINGS_GROUP[] = "WebAssembly";
const char SETTINGS_KEY_EMSDK[] = "EmSdk";
} // namespace WebAssembly } // namespace WebAssembly
} // namespace Constants } // namespace Constants

View File

@@ -11,7 +11,6 @@
#include <utils/hostosinfo.h> #include <utils/hostosinfo.h>
#include <QCache> #include <QCache>
#include <QSettings>
using namespace Utils; using namespace Utils;
@@ -99,21 +98,6 @@ QVersionNumber version(const FilePath &sdkRoot)
return *emSdkVersionCache()->object(cacheKey); 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() void clearCaches()
{ {
emSdkEnvCache()->clear(); emSdkEnvCache()->clear();

View File

@@ -16,8 +16,6 @@ bool isValid(const Utils::FilePath &sdkRoot);
void parseEmSdkEnvOutputAndAddToEnv(const QString &output, Utils::Environment &env); void parseEmSdkEnvOutputAndAddToEnv(const QString &output, Utils::Environment &env);
void addToEnvironment(const Utils::FilePath &sdkRoot, Utils::Environment &env); void addToEnvironment(const Utils::FilePath &sdkRoot, Utils::Environment &env);
QVersionNumber version(const Utils::FilePath &sdkRoot); QVersionNumber version(const Utils::FilePath &sdkRoot);
void registerEmSdk(const Utils::FilePath &sdkRoot);
Utils::FilePath registeredEmSdk();
void clearCaches(); void clearCaches();
} // WebAssembly::Internal::WebAssemblyEmSdk } // WebAssembly::Internal::WebAssemblyEmSdk

View File

@@ -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 <coreplugin/icore.h>
#include <utils/environment.h>
#include <utils/infolabel.h>
#include <utils/pathchooser.h>
#include <utils/utilsicons.h>
#include <QGroupBox>
#include <QTextBrowser>
#include <QVBoxLayout>
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"(<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);
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("<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;
}
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("<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(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

View File

@@ -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 <coreplugin/dialogs/ioptionspage.h>
namespace WebAssembly {
namespace Internal {
class WebAssemblyOptionsPage final : public Core::IOptionsPage
{
public:
WebAssemblyOptionsPage();
};
} // namespace Internal
} // namespace WebAssmbly

View File

@@ -8,9 +8,9 @@
#endif // WITH_TESTS #endif // WITH_TESTS
#include "webassemblyconstants.h" #include "webassemblyconstants.h"
#include "webassemblydevice.h" #include "webassemblydevice.h"
#include "webassemblyoptionspage.h"
#include "webassemblyqtversion.h" #include "webassemblyqtversion.h"
#include "webassemblyrunconfiguration.h" #include "webassemblyrunconfiguration.h"
#include "webassemblysettings.h"
#include "webassemblytoolchain.h" #include "webassemblytoolchain.h"
#include "webassemblytr.h" #include "webassemblytr.h"
@@ -39,7 +39,7 @@ public:
WebAssemblyQtVersionFactory qtVersionFactory; WebAssemblyQtVersionFactory qtVersionFactory;
EmrunRunConfigurationFactory emrunRunConfigurationFactory; EmrunRunConfigurationFactory emrunRunConfigurationFactory;
EmrunRunWorkerFactory emrunRunWorkerFactory; EmrunRunWorkerFactory emrunRunWorkerFactory;
WebAssemblyOptionsPage optionsPage; WebAssemblySettings settings;
}; };
static WebAssemblyPluginPrivate *dd = nullptr; static WebAssemblyPluginPrivate *dd = nullptr;

View File

@@ -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 <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>
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());
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"(<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 {
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("<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

View File

@@ -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 <coreplugin/dialogs/ioptionspage.h>
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

View File

@@ -1,9 +1,11 @@
// Copyright (C) 2020 The Qt Company Ltd. // Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "webassemblytoolchain.h"
#include "webassemblyconstants.h" #include "webassemblyconstants.h"
#include "webassemblyemsdk.h" #include "webassemblyemsdk.h"
#include "webassemblytoolchain.h" #include "webassemblysettings.h"
#include "webassemblytr.h" #include "webassemblytr.h"
#include <projectexplorer/devicesupport/devicemanager.h> #include <projectexplorer/devicesupport/devicemanager.h>
@@ -49,7 +51,8 @@ static void addRegisteredMinGWToEnvironment(Environment &env)
void WebAssemblyToolChain::addToEnvironment(Environment &env) const 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) if (env.osType() == OsTypeWindows)
addRegisteredMinGWToEnvironment(env); addRegisteredMinGWToEnvironment(env);
} }
@@ -92,7 +95,7 @@ const QVersionNumber &WebAssemblyToolChain::minimumSupportedEmSdkVersion()
static Toolchains doAutoDetect(const ToolchainDetector &detector) static Toolchains doAutoDetect(const ToolchainDetector &detector)
{ {
const FilePath sdk = WebAssemblyEmSdk::registeredEmSdk(); const FilePath sdk = WebAssemblySettings::instance()->emSdk();
if (!WebAssemblyEmSdk::isValid(sdk)) if (!WebAssemblyEmSdk::isValid(sdk))
return {}; return {};