/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ #include "qmlprojectrunconfiguration.h" #include "qmlproject.h" #include "qmlprojectmanagerconstants.h" #include "qmlmainfileaspect.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Core; using namespace ProjectExplorer; using namespace QtSupport; using namespace Utils; namespace QmlProjectManager { // QmlProjectRunConfiguration QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target, Id id) : RunConfiguration(target, id) { auto envAspect = addAspect(); auto envModifier = [this](Environment env) { if (auto bs = dynamic_cast(activeBuildSystem())) env.modify(bs->environment()); return env; }; const Id deviceTypeId = DeviceTypeKitAspect::deviceTypeId(target->kit()); if (deviceTypeId == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) { envAspect->addPreferredBaseEnvironment(tr("System Environment"), [envModifier] { return envModifier(Environment::systemEnvironment()); }); } envAspect->addSupportedBaseEnvironment(tr("Clean Environment"), [envModifier] { return envModifier(Environment()); }); m_qmlViewerAspect = addAspect(); m_qmlViewerAspect->setLabelText(tr("QML Viewer:")); m_qmlViewerAspect->setPlaceHolderText(commandLine().executable().toString()); m_qmlViewerAspect->setDisplayStyle(BaseStringAspect::LineEditDisplay); m_qmlViewerAspect->setHistoryCompleter("QmlProjectManager.viewer.history"); auto argumentAspect = addAspect(); argumentAspect->setSettingsKey(Constants::QML_VIEWER_ARGUMENTS_KEY); setCommandLineGetter([this] { return CommandLine(qmlScenePath(), commandLineArguments(), CommandLine::Raw); }); m_qmlMainFileAspect = addAspect(target); connect(m_qmlMainFileAspect, &QmlMainFileAspect::changed, this, &RunConfiguration::update); connect(target, &Target::kitChanged, this, &RunConfiguration::update); setDisplayName(tr("QML Scene", "QMLRunConfiguration display name.")); update(); } Runnable QmlProjectRunConfiguration::runnable() const { Runnable r; r.setCommandLine(commandLine()); r.environment = aspect()->environment(); const QmlBuildSystem *bs = static_cast(activeBuildSystem()); r.workingDirectory = bs->targetDirectory().toString(); return r; } QString QmlProjectRunConfiguration::disabledReason() const { if (mainScript().isEmpty()) return tr("No script file to execute."); const FilePath viewer = qmlScenePath(); if (DeviceTypeKitAspect::deviceTypeId(target()->kit()) == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE && !viewer.exists()) { return tr("No qmlscene found."); } if (viewer.isEmpty()) return tr("No qmlscene binary specified for target device."); return RunConfiguration::disabledReason(); } FilePath QmlProjectRunConfiguration::qmlScenePath() const { const QString qmlViewer = m_qmlViewerAspect->value(); if (!qmlViewer.isEmpty()) return FilePath::fromString(qmlViewer); Kit *kit = target()->kit(); BaseQtVersion *version = QtKitAspect::qtVersion(kit); if (!version) // No Qt version in Kit. Don't try to run qmlscene. return {}; const Id deviceType = DeviceTypeKitAspect::deviceTypeId(kit); if (deviceType == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) { // If not given explicitly by Qt Version, try to pick it from $PATH. const bool isDesktop = version->type() == QtSupport::Constants::DESKTOPQT; return FilePath::fromString(isDesktop ? version->qmlsceneCommand() : QString("qmlscene")); } IDevice::ConstPtr dev = DeviceKitAspect::device(kit); if (dev.isNull()) // No device set. We don't know where to run qmlscene. return {}; const QString qmlscene = dev->qmlsceneCommand(); // If not given explicitly by device, try to pick it from $PATH. return FilePath::fromString(qmlscene.isEmpty() ? QString("qmlscene") : qmlscene); } QString QmlProjectRunConfiguration::commandLineArguments() const { // arguments in .user file QString args = aspect()->arguments(macroExpander()); const IDevice::ConstPtr device = DeviceKitAspect::device(target()->kit()); const OsType osType = device ? device->osType() : HostOsInfo::hostOs(); // arguments from .qmlproject file const QmlBuildSystem *bs = qobject_cast(target()->buildSystem()); foreach (const QString &importPath, QmlBuildSystem::makeAbsolute(bs->targetDirectory(), bs->customImportPaths())) { QtcProcess::addArg(&args, "-I", osType); QtcProcess::addArg(&args, importPath, osType); } for (const QString &fileSelector : bs->customFileSelectors()) { QtcProcess::addArg(&args, "-S", osType); QtcProcess::addArg(&args, fileSelector, osType); } if (Utils::HostOsInfo::isWindowsHost() && bs->forceFreeType()) { Utils::QtcProcess::addArg(&args, "-platform", osType); Utils::QtcProcess::addArg(&args, "windows:fontengine=freetype", osType); } const QString main = bs->targetFile(FilePath::fromString(mainScript())).toString(); if (!main.isEmpty()) QtcProcess::addArg(&args, main, osType); return args; } bool QmlProjectRunConfiguration::isEnabled() const { if (m_qmlMainFileAspect->isQmlFilePresent() && !commandLine().executable().isEmpty()) { BuildSystem *bs = activeBuildSystem(); return !bs->isParsing() && bs->hasParsingData(); } return false; } QString QmlProjectRunConfiguration::mainScript() const { return m_qmlMainFileAspect->mainScript(); } namespace Internal { QmlProjectRunConfigurationFactory::QmlProjectRunConfigurationFactory() : FixedRunConfigurationFactory(QmlProjectRunConfiguration::tr("QML Scene"), false) { registerRunConfiguration ("QmlProjectManager.QmlRunConfiguration.QmlScene"); addSupportedProjectType(QmlProjectManager::Constants::QML_PROJECT_ID); } } // namespace Internal } // namespace QmlProjectManager