WebAssembly: Move special aspect closer to its only use

WebBrowserSelectionAspect is not too far off from a normal
SelectionAspect, and may be one later.

Change-Id: I4d9d3a77244fe3f30f29746e67f5420ae9c6c3f0
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
hjk
2023-07-13 18:27:51 +02:00
parent 64d16786af
commit 108c64fc7a
7 changed files with 119 additions and 163 deletions

View File

@@ -10,7 +10,6 @@ add_qtc_plugin(WebAssembly
webassemblyplugin.cpp webassemblyplugin.h webassemblyplugin.cpp webassemblyplugin.h
webassemblyqtversion.cpp webassemblyqtversion.h webassemblyqtversion.cpp webassemblyqtversion.h
webassemblyrunconfiguration.cpp webassemblyrunconfiguration.h webassemblyrunconfiguration.cpp webassemblyrunconfiguration.h
webassemblyrunconfigurationaspects.cpp webassemblyrunconfigurationaspects.h
webassemblysettings.cpp webassemblysettings.h webassemblysettings.cpp webassemblysettings.h
webassemblytoolchain.cpp webassemblytoolchain.h webassemblytoolchain.cpp webassemblytoolchain.h
webassemblytr.h webassemblytr.h

View File

@@ -25,8 +25,6 @@ QtcPlugin {
"webassemblyqtversion.h", "webassemblyqtversion.h",
"webassemblyrunconfiguration.cpp", "webassemblyrunconfiguration.cpp",
"webassemblyrunconfiguration.h", "webassemblyrunconfiguration.h",
"webassemblyrunconfigurationaspects.cpp",
"webassemblyrunconfigurationaspects.h",
"webassemblysettings.cpp", "webassemblysettings.cpp",
"webassemblysettings.h", "webassemblysettings.h",
"webassemblytoolchain.cpp", "webassemblytoolchain.cpp",

View File

@@ -4,7 +4,7 @@
#include "webassembly_test.h" #include "webassembly_test.h"
#include "webassemblyemsdk.h" #include "webassemblyemsdk.h"
#include "webassemblyrunconfigurationaspects.h" #include "webassemblyrunconfiguration.h"
#include <utils/environment.h> #include <utils/environment.h>
@@ -77,7 +77,7 @@ void WebAssemblyTest::testEmrunBrowserListParsing()
QFETCH(QByteArray, emrunOutput); QFETCH(QByteArray, emrunOutput);
QFETCH(WebBrowserEntries, expectedBrowsers); QFETCH(WebBrowserEntries, expectedBrowsers);
QCOMPARE(WebBrowserSelectionAspect::parseEmrunOutput(emrunOutput), expectedBrowsers); QCOMPARE(parseEmrunOutput(emrunOutput), expectedBrowsers);
} }
void WebAssemblyTest::testEmrunBrowserListParsing_data() void WebAssemblyTest::testEmrunBrowserListParsing_data()

View File

@@ -1,9 +1,9 @@
// 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 "webassemblyconstants.h"
#include "webassemblyrunconfiguration.h" #include "webassemblyrunconfiguration.h"
#include "webassemblyrunconfigurationaspects.h"
#include "webassemblyconstants.h"
#include "webassemblytr.h" #include "webassemblytr.h"
#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildconfiguration.h>
@@ -12,14 +12,37 @@
#include <projectexplorer/devicesupport/deviceusedportsgatherer.h> #include <projectexplorer/devicesupport/deviceusedportsgatherer.h>
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/runconfigurationaspects.h>
#include <projectexplorer/runcontrol.h> #include <projectexplorer/runcontrol.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <utils/layoutbuilder.h>
#include <utils/process.h>
#include <utils/qtcassert.h>
#include <QComboBox>
#include <QTextStream>
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace Utils; using namespace Utils;
namespace WebAssembly::Internal { namespace WebAssembly::Internal {
WebBrowserEntries parseEmrunOutput(const QByteArray &output)
{
WebBrowserEntries result;
QTextStream ts(output);
QString line;
static const QRegularExpression regExp(R"( - (.*):\s*(.*))"); // ' - firefox: Mozilla Firefox'
// ^__1__^ ^______2______^
while (ts.readLineInto(&line)) {
const QRegularExpressionMatch match = regExp.match(line);
if (match.hasMatch())
result.push_back({match.captured(1), match.captured(2)});
}
return result;
}
static FilePath pythonInterpreter(const Environment &env) static FilePath pythonInterpreter(const Environment &env)
{ {
const QString emsdkPythonEnvVarKey("EMSDK_PYTHON"); const QString emsdkPythonEnvVarKey("EMSDK_PYTHON");
@@ -63,12 +86,94 @@ static CommandLine emrunCommand(const Target *target,
return {}; return {};
} }
static const char BROWSER_KEY[] = "WASM.WebBrowserSelectionAspect.Browser";
static WebBrowserEntries emrunBrowsers(Target *target)
{
WebBrowserEntries result;
result.append(qMakePair(QString(), Tr::tr("Default Browser")));
if (auto bc = target->activeBuildConfiguration()) {
const Environment environment = bc->environment();
const FilePath emrunPath = environment.searchInPath("emrun");
Process browserLister;
browserLister.setEnvironment(environment);
browserLister.setCommand({emrunPath, {"--list_browsers"}});
browserLister.start();
if (browserLister.waitForFinished())
result.append(parseEmrunOutput(browserLister.readAllRawStandardOutput()));
}
return result;
}
class WebBrowserSelectionAspect : public BaseAspect
{
Q_OBJECT
public:
WebBrowserSelectionAspect(AspectContainer *container)
: BaseAspect(container)
{}
void setTarget(Target *target)
{
m_availableBrowsers = emrunBrowsers(target);
if (!m_availableBrowsers.isEmpty()) {
const int defaultIndex = qBound(0, m_availableBrowsers.count() - 1, 1);
m_currentBrowser = m_availableBrowsers.at(defaultIndex).first;
}
setDisplayName(Tr::tr("Web Browser"));
setId("WebBrowserAspect");
setSettingsKey("RunConfiguration.WebBrowser");
addDataExtractor(this, &WebBrowserSelectionAspect::currentBrowser, &Data::currentBrowser);
}
void addToLayout(Layouting::LayoutItem &parent) override
{
QTC_CHECK(!m_webBrowserComboBox);
m_webBrowserComboBox = new QComboBox;
for (const WebBrowserEntry &be : m_availableBrowsers)
m_webBrowserComboBox->addItem(be.second, be.first);
m_webBrowserComboBox->setCurrentIndex(m_webBrowserComboBox->findData(m_currentBrowser));
connect(m_webBrowserComboBox, &QComboBox::currentIndexChanged, this, [this] {
m_currentBrowser = m_webBrowserComboBox->currentData().toString();
emit changed();
});
parent.addItems({Tr::tr("Web browser:"), m_webBrowserComboBox});
}
void fromMap(const QVariantMap &map) override
{
if (!m_availableBrowsers.isEmpty())
m_currentBrowser = map.value(BROWSER_KEY, m_availableBrowsers.first().first).toString();
}
void toMap(QVariantMap &map) const override
{
map.insert(BROWSER_KEY, m_currentBrowser);
}
QString currentBrowser() const { return m_currentBrowser; }
struct Data : BaseAspect::Data
{
QString currentBrowser;
};
private:
QComboBox *m_webBrowserComboBox = nullptr;
QString m_currentBrowser;
WebBrowserEntries m_availableBrowsers;
};
// Runs a webassembly application via emscripten's "emrun" tool // Runs a webassembly application via emscripten's "emrun" tool
// https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html // https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html
class EmrunRunConfiguration : public ProjectExplorer::RunConfiguration class EmrunRunConfiguration : public RunConfiguration
{ {
public: public:
EmrunRunConfiguration(Target *target, Utils::Id id) EmrunRunConfiguration(Target *target, Id id)
: RunConfiguration(target, id) : RunConfiguration(target, id)
{ {
webBrowser.setTarget(target); webBrowser.setTarget(target);
@@ -130,3 +235,5 @@ EmrunRunWorkerFactory::EmrunRunWorkerFactory()
} }
} // Webassembly::Internal } // Webassembly::Internal
#include "webassemblyrunconfiguration.moc"

View File

@@ -8,6 +8,12 @@
namespace WebAssembly::Internal { namespace WebAssembly::Internal {
using WebBrowserEntry = QPair<QString, QString>; // first: id, second: display name
using WebBrowserEntries = QList<WebBrowserEntry>;
WebBrowserEntries parseEmrunOutput(const QByteArray &output);
class EmrunRunConfigurationFactory final : public ProjectExplorer::RunConfigurationFactory class EmrunRunConfigurationFactory final : public ProjectExplorer::RunConfigurationFactory
{ {
public: public:

View File

@@ -1,108 +0,0 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "webassemblyrunconfigurationaspects.h"
#include "webassemblytr.h"
#include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/target.h>
#include <utils/layoutbuilder.h>
#include <utils/process.h>
#include <utils/qtcassert.h>
#include <QComboBox>
#include <QTextStream>
using namespace Utils;
namespace WebAssembly {
namespace Internal {
static const char BROWSER_KEY[] = "WASM.WebBrowserSelectionAspect.Browser";
static WebBrowserEntries emrunBrowsers(ProjectExplorer::Target *target)
{
WebBrowserEntries result;
result.append(qMakePair(QString(), Tr::tr("Default Browser")));
if (auto bc = target->activeBuildConfiguration()) {
const Utils::Environment environment = bc->environment();
const Utils::FilePath emrunPath = environment.searchInPath("emrun");
Process browserLister;
browserLister.setEnvironment(environment);
browserLister.setCommand({emrunPath, {"--list_browsers"}});
browserLister.start();
if (browserLister.waitForFinished())
result.append(WebBrowserSelectionAspect::parseEmrunOutput(
browserLister.readAllRawStandardOutput()));
}
return result;
}
WebBrowserSelectionAspect::WebBrowserSelectionAspect(AspectContainer *container)
: BaseAspect(container)
{}
void WebBrowserSelectionAspect::setTarget(ProjectExplorer::Target *target)
{
m_availableBrowsers = emrunBrowsers(target);
if (!m_availableBrowsers.isEmpty()) {
const int defaultIndex = qBound(0, m_availableBrowsers.count() - 1, 1);
m_currentBrowser = m_availableBrowsers.at(defaultIndex).first;
}
setDisplayName(Tr::tr("Web Browser"));
setId("WebBrowserAspect");
setSettingsKey("RunConfiguration.WebBrowser");
addDataExtractor(this, &WebBrowserSelectionAspect::currentBrowser, &Data::currentBrowser);
}
void WebBrowserSelectionAspect::addToLayout(Layouting::LayoutItem &parent)
{
QTC_CHECK(!m_webBrowserComboBox);
m_webBrowserComboBox = new QComboBox;
for (const WebBrowserEntry &be : m_availableBrowsers)
m_webBrowserComboBox->addItem(be.second, be.first);
m_webBrowserComboBox->setCurrentIndex(m_webBrowserComboBox->findData(m_currentBrowser));
connect(m_webBrowserComboBox, &QComboBox::currentIndexChanged, this, [this] {
m_currentBrowser = m_webBrowserComboBox->currentData().toString();
emit changed();
});
parent.addItems({Tr::tr("Web browser:"), m_webBrowserComboBox});
}
void WebBrowserSelectionAspect::fromMap(const QVariantMap &map)
{
if (!m_availableBrowsers.isEmpty())
m_currentBrowser = map.value(BROWSER_KEY, m_availableBrowsers.first().first).toString();
}
void WebBrowserSelectionAspect::toMap(QVariantMap &map) const
{
map.insert(BROWSER_KEY, m_currentBrowser);
}
QString WebBrowserSelectionAspect::currentBrowser() const
{
return m_currentBrowser;
}
WebBrowserEntries WebBrowserSelectionAspect::parseEmrunOutput(const QByteArray &output)
{
WebBrowserEntries result;
QTextStream ts(output);
QString line;
static const QRegularExpression regExp(R"( - (.*):\s*(.*))"); // ' - firefox: Mozilla Firefox'
// ^__1__^ ^______2______^
while (ts.readLineInto(&line)) {
const QRegularExpressionMatch match = regExp.match(line);
if (match.hasMatch())
result.push_back({match.captured(1), match.captured(2)});
}
return result;
}
} // namespace Internal
} // namespace Webassembly

View File

@@ -1,46 +0,0 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include <projectexplorer/runconfigurationaspects.h>
QT_FORWARD_DECLARE_CLASS(QComboBox)
namespace WebAssembly {
namespace Internal {
using WebBrowserEntry = QPair<QString, QString>; // first: id, second: display name
using WebBrowserEntries = QList<WebBrowserEntry>;
class WebBrowserSelectionAspect : public Utils::BaseAspect
{
Q_OBJECT
public:
WebBrowserSelectionAspect(Utils::AspectContainer *container);
void setTarget(ProjectExplorer::Target *target);
void addToLayout(Layouting::LayoutItem &parent) override;
void fromMap(const QVariantMap &map) override;
void toMap(QVariantMap &map) const override;
QString currentBrowser() const;
static WebBrowserEntries parseEmrunOutput(const QByteArray &output);
struct Data : BaseAspect::Data
{
QString currentBrowser;
};
private:
QComboBox *m_webBrowserComboBox = nullptr;
QString m_currentBrowser;
WebBrowserEntries m_availableBrowsers;
};
} // namespace Internal
} // namespace Webassembly