diff --git a/src/plugins/qmlprojectmanager/CMakeLists.txt b/src/plugins/qmlprojectmanager/CMakeLists.txt index 8b9fa9f2828..ab8f29bc7fb 100644 --- a/src/plugins/qmlprojectmanager/CMakeLists.txt +++ b/src/plugins/qmlprojectmanager/CMakeLists.txt @@ -6,6 +6,7 @@ add_qtc_plugin(QmlProjectManager fileformat/filefilteritems.cpp fileformat/filefilteritems.h fileformat/qmlprojectfileformat.cpp fileformat/qmlprojectfileformat.h fileformat/qmlprojectitem.cpp fileformat/qmlprojectitem.h + projectfilecontenttools.cpp projectfilecontenttools.h qmlmainfileaspect.cpp qmlmainfileaspect.h qmlmultilanguageaspect.cpp qmlmultilanguageaspect.h qmlproject.cpp qmlproject.h diff --git a/src/plugins/qmlprojectmanager/projectfilecontenttools.cpp b/src/plugins/qmlprojectmanager/projectfilecontenttools.cpp new file mode 100644 index 00000000000..fd2efad0488 --- /dev/null +++ b/src/plugins/qmlprojectmanager/projectfilecontenttools.cpp @@ -0,0 +1,129 @@ +/**************************************************************************** +** +** Copyright (C) 2022 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 "projectfilecontenttools.h" + +#include + +#include +#include + +namespace QmlProjectManager { +namespace ProjectFileContentTools { + +QRegularExpression qdsVerRegexp(R"x(qdsVersion: "(.*)")x"); + +const Utils::FilePaths rootCmakeFiles(ProjectExplorer::Project *project) +{ + if (!project) + project = ProjectExplorer::SessionManager::startupProject(); + if (!project) + return {}; + return project->projectDirectory().dirEntries({QList("CMakeLists.txt"), QDir::Files}); +} + +const QString readFileContents(const Utils::FilePath &filePath) +{ + Utils::FileReader reader; + if (!reader.fetch(filePath)) + return {}; + return QString::fromUtf8(reader.data()); +} + +const QString qdsVersion(const Utils::FilePath &projectFilePath) +{ + const QString projectFileContent = readFileContents(projectFilePath); + QRegularExpressionMatch match = qdsVerRegexp.match(projectFileContent); + if (!match.hasMatch()) + return {}; + QString version = match.captured(1); + return version.isEmpty() ? QObject::tr("Unknown") : version; +} + +QRegularExpression qt6Regexp("(qt6project:)\\s*\"*(true|false)\"*", QRegularExpression::CaseInsensitiveOption); + +const QString qtVersion(const Utils::FilePath &projectFilePath) +{ + const QString defaultReturn = QObject::tr("Unknown"); + const QString data = readFileContents(projectFilePath); + QRegularExpressionMatch match = qt6Regexp.match(data); + if (!match.hasMatch()) + return defaultReturn; + return match.captured(2).contains("true", Qt::CaseInsensitive) + ? QObject::tr("Qt6 or later") + : QObject::tr("Qt5 or earlier"); +} + +bool isQt6Project(const Utils::FilePath &projectFilePath) +{ + const QString data = readFileContents(projectFilePath); + QRegularExpressionMatch match = qt6Regexp.match(data); + if (!match.hasMatch()) + return false; + return match.captured(2).contains("true", Qt::CaseInsensitive); +} + +const QString getMainQmlFile(const Utils::FilePath &projectFilePath) +{ + const QString defaultReturn = "content/App.qml"; + const QString data = readFileContents(projectFilePath); + QRegularExpression regexp(R"x(mainFile: "(.*)")x"); + QRegularExpressionMatch match = regexp.match(data); + if (!match.hasMatch()) + return defaultReturn; + return match.captured(1); +} + +const QString appQmlFile(const Utils::FilePath &projectFilePath) +{ + return projectFilePath.toFileInfo().dir().absolutePath() + "/" + getMainQmlFile(projectFilePath); +} + +const Resolution resolutionFromConstants(const Utils::FilePath &projectFilePath) +{ + const QFileInfo fileInfo = projectFilePath.toFileInfo(); + const QString fileName = fileInfo.dir().absolutePath() + + "/" + "imports" + "/" + fileInfo.baseName() + "/Constants.qml"; + Utils::FileReader reader; + if (!reader.fetch(Utils::FilePath::fromString(fileName))) + return {}; + const QByteArray data = reader.data(); + const QRegularExpression regexpWidth(R"x(readonly\s+property\s+int\s+width:\s+(\d*))x"); + const QRegularExpression regexpHeight(R"x(readonly\s+property\s+int\s+height:\s+(\d*))x"); + int width = -1; + int height = -1; + QRegularExpressionMatch match = regexpHeight.match(QString::fromUtf8(data)); + if (match.hasMatch()) + height = match.captured(1).toInt(); + match = regexpWidth.match(QString::fromUtf8(data)); + if (match.hasMatch()) + width = match.captured(1).toInt(); + if (width > 0 && height > 0) + return {width, height}; + return {}; +} + +} //ProjectFileContentTools +} //QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/projectfilecontenttools.h b/src/plugins/qmlprojectmanager/projectfilecontenttools.h new file mode 100644 index 00000000000..3fe4fd003a5 --- /dev/null +++ b/src/plugins/qmlprojectmanager/projectfilecontenttools.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2022 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. +** +****************************************************************************/ + +#pragma once + +#include "qmlprojectmanager_global.h" + +#include +#include + +#include + +namespace QmlProjectManager { +namespace ProjectFileContentTools { + +struct QMLPROJECTMANAGER_EXPORT Resolution { + int width; + int height; +}; + +const Utils::FilePaths QMLPROJECTMANAGER_EXPORT rootCmakeFiles(ProjectExplorer::Project *project = nullptr); +const QString QMLPROJECTMANAGER_EXPORT readFileContents(const Utils::FilePath &filePath); +const QString QMLPROJECTMANAGER_EXPORT qdsVersion(const Utils::FilePath &projectFilePath); +const QString QMLPROJECTMANAGER_EXPORT qtVersion(const Utils::FilePath &projectFilePath); +const QString QMLPROJECTMANAGER_EXPORT getMainQmlFile(const Utils::FilePath &projectFilePath); +const QString QMLPROJECTMANAGER_EXPORT appQmlFile(const Utils::FilePath &projectFilePath); +const Resolution QMLPROJECTMANAGER_EXPORT resolutionFromConstants(const Utils::FilePath &projectFilePath); + +} //ProjectFileContentTools +} //QmlProjectManager + diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs b/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs index 1a160bff1cd..0822c8ae11a 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs +++ b/src/plugins/qmlprojectmanager/qmlprojectmanager.qbs @@ -15,6 +15,7 @@ QtcPlugin { Group { name: "General" files: [ + "projectfilecontenttools.cpp", "projectfilecontenttools.h", "qmlmainfileaspect.cpp", "qmlmainfileaspect.h", "qmlmultilanguageaspect.cpp", "qmlmultilanguageaspect.h", "qmlproject.cpp", "qmlproject.h", diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp index bc7b6f3bde9..44f8bfad9af 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp @@ -27,6 +27,7 @@ #include "qmlproject.h" #include "qmlprojectconstants.h" #include "qmlprojectrunconfiguration.h" +#include "projectfilecontenttools.h" #include #include @@ -259,7 +260,7 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage) Core::FileIconProvider::registerIconOverlayForSuffix(":/qmlproject/images/qmlproject.png", "qmlproject"); return true; -} // namespace Internal +} } // namespace Internal } // namespace QmlProjectManager diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp index f692cbc6297..800aa3cf494 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp +++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp @@ -44,6 +44,7 @@ #include #include +#include #include #include @@ -325,43 +326,10 @@ int ProjectModel::rowCount(const QModelIndex &) const QString getQDSVersion(const QString &projectFilePath) { - const QString defaultReturn = ""; - Utils::FileReader reader; - if (!reader.fetch(Utils::FilePath::fromString(projectFilePath))) - return defaultReturn; + const QString qdsVersion = QmlProjectManager::ProjectFileContentTools::qdsVersion( + Utils::FilePath::fromString(projectFilePath)); - const QByteArray data = reader.data(); - - QRegularExpression regexp(R"x(qdsVersion: "(.*)")x"); - QRegularExpressionMatch match = regexp.match(QString::fromUtf8(data)); - - if (!match.hasMatch()) - return defaultReturn; - - return ProjectModel::tr("Created with Qt Design Studio version: %1").arg(match.captured(1)); -} - -QString getMainQmlFile(const QString &projectFilePath) -{ - const QString defaultReturn = "content/App.qml"; - Utils::FileReader reader; - if (!reader.fetch(Utils::FilePath::fromString(projectFilePath))) - return defaultReturn; - - const QByteArray data = reader.data(); - - QRegularExpression regexp(R"x(mainFile: "(.*)")x"); - QRegularExpressionMatch match = regexp.match(QString::fromUtf8(data)); - - if (!match.hasMatch()) - return defaultReturn; - - return match.captured(1); -} - -QString appQmlFile(const QString &projectFilePath) -{ - return QFileInfo(projectFilePath).dir().absolutePath() + "/" + getMainQmlFile(projectFilePath); + return ProjectModel::tr("Created with Qt Design Studio version: %1").arg(qdsVersion); } static QString fromCamelCase(const QString &s) { @@ -377,32 +345,12 @@ static QString fromCamelCase(const QString &s) { static QString resolutionFromConstants(const QString &projectFilePath) { - const QFileInfo fileInfo(projectFilePath); - const QString fileName = fileInfo.dir().absolutePath() - + "/" + "imports" + "/" + fileInfo.baseName() + "/Constants.qml"; + QmlProjectManager::ProjectFileContentTools::Resolution res = + QmlProjectManager::ProjectFileContentTools::resolutionFromConstants( + Utils::FilePath::fromString(projectFilePath)); - Utils::FileReader reader; - if (!reader.fetch(Utils::FilePath::fromString(fileName))) - return {}; - - const QByteArray data = reader.data(); - - const QRegularExpression regexpWidth(R"x(readonly\s+property\s+int\s+width:\s+(\d*))x"); - const QRegularExpression regexpHeight(R"x(readonly\s+property\s+int\s+height:\s+(\d*))x"); - - int width = -1; - int height = -1; - - QRegularExpressionMatch match = regexpHeight.match(QString::fromUtf8(data)); - if (match.hasMatch()) - height = match.captured(1).toInt(); - - match = regexpWidth.match(QString::fromUtf8(data)); - if (match.hasMatch()) - width = match.captured(1).toInt(); - - if (width > 0 && height > 0) - return ProjectModel::tr("Resolution: %1x%2").arg(width).arg(height); + if (res.width > 0 && res.height > 0) + return ProjectModel::tr("Resolution: %1x%2").arg(res.width).arg(res.height); return {}; } @@ -455,7 +403,9 @@ QVariant ProjectModel::data(const QModelIndex &index, int role) const case PrettyFilePathRole: return Utils::withTildeHomePath(QFileInfo(data.first).dir().absolutePath()); case PreviewUrl: - return QVariant(QStringLiteral("image://project_preview/") + appQmlFile(data.first)); + return QVariant(QStringLiteral("image://project_preview/") + + QmlProjectManager::ProjectFileContentTools::appQmlFile( + Utils::FilePath::fromString(data.first))); case TagData: return tags(data.first); case Description: