// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "qmlproject.h" #include "qmlprojectconstants.h" #include #include #include #include #include #include #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 Utils; using namespace Qt::Literals::StringLiterals; namespace { Utils::Result mcuInstallationRoot() { ExtensionSystem::IPlugin *mcuSupportPlugin = QmlProjectManager::findMcuSupportPlugin(); if (mcuSupportPlugin == nullptr) { return make_unexpected("Failed to find MCU Support plugin"_L1); } Utils::Result root; QMetaObject::invokeMethod(mcuSupportPlugin, "installationRoot", Qt::DirectConnection, Q_RETURN_ARG(Utils::Result, root)); return root; } } // namespace namespace QmlProjectManager { ExtensionSystem::IPlugin *findMcuSupportPlugin() { const QString pluginId = "mcusupport"; const ExtensionSystem::PluginSpec *pluginSpec = Utils::findOrDefault( ExtensionSystem::PluginManager::plugins(), Utils::equal(&ExtensionSystem::PluginSpec::id, pluginId)); if (pluginSpec == nullptr) { return nullptr; } return pluginSpec->plugin(); } Utils::Result mcuFontsDir() { Utils::Result mcuRoot = mcuInstallationRoot(); if (!mcuRoot) { return mcuRoot; } return *mcuRoot / "src" / "3rdparty" / "fonts"; } QmlProject::QmlProject(const Utils::FilePath &fileName) : Project(Utils::Constants::QMLPROJECT_MIMETYPE, fileName) { setType(QmlProjectManager::Constants::QML_PROJECT_ID); setProjectLanguages(Core::Context(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID)); setDisplayName(fileName.completeBaseName()); setSupportsBuilding(false); setIsEditModePreferred(true); setBuildSystemCreator(); if (fileName.endsWith(Constants::fakeProjectName)) { auto uiFile = fileName.toUrlishString(); uiFile.remove(Constants::fakeProjectName); auto parentDir = Utils::FilePath::fromString(uiFile).parentDir(); setDisplayName(parentDir.completeBaseName()); } connect(this, &QmlProject::anyParsingFinished, this, &QmlProject::parsingFinished); } void QmlProject::openStartupQmlFile() { const auto qmlBuildSystem = qobject_cast(activeBuildSystem()); if (!qmlBuildSystem) return; disconnect(ProjectManager::instance(), &ProjectManager::projectAdded, this, &QmlProject::openStartupQmlFile); const Utils::FilePath fileToOpen = qmlBuildSystem->getStartupQmlFileWithFallback(); QTimer::singleShot(0, qmlBuildSystem, [fileToOpen]() { if (!fileToOpen.isEmpty() && fileToOpen.exists() && !fileToOpen.isDir()) Core::EditorManager::openEditor(fileToOpen, Utils::Id()); }); } void QmlProject::parsingFinished(bool success) { // trigger only once disconnect(this, &QmlProject::anyParsingFinished, this, &QmlProject::parsingFinished); if (!success) return; if (activeBuildSystem()) { openStartupQmlFile(); return; } connect(ProjectManager::instance(), &ProjectManager::projectAdded, this, &QmlProject::openStartupQmlFile); } Project::RestoreResult QmlProject::fromMap(const Store &map, QString *errorMessage) { RestoreResult result = Project::fromMap(map, errorMessage); if (result != RestoreResult::Ok) return result; if (!activeTarget()) { // find a kit that matches prerequisites (prefer default one) const QList kits = Utils::filtered(KitManager::kits(), [this](const Kit *k) { return !containsType(projectIssues(k), Task::TaskType::Error) && RunDeviceTypeKitAspect::deviceTypeId(k) == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE; }); if (!kits.isEmpty()) { if (kits.contains(KitManager::defaultKit())) addTargetForDefaultKit(); else addTargetForKit(kits.first()); } } // For projects created with Qt Creator < 17. for (Target * const t : targets()) { if (t->buildConfigurations().isEmpty()) t->updateDefaultBuildConfigurations(); QTC_CHECK(!t->buildConfigurations().isEmpty()); } return RestoreResult::Ok; } DeploymentKnowledge QmlProject::deploymentKnowledge() const { return DeploymentKnowledge::Perfect; } bool QmlProject::isMCUs() { const QmlProjectManager::QmlBuildSystem *buildSystem = qobject_cast(activeBuildSystemForActiveProject()); return buildSystem && buildSystem->qtForMCUs(); } } // namespace QmlProjectManager