QmlProject: Refactor QmlProjectManager

- feature: JSON based project manager plugin
- feature: functionality to write QmlProject file
- tests: tests for QmlProjectItem

Task-number: QDS-8810
Change-Id: I8989e54577e9cd883bd76346e22774cc7f7ed93f
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Burak Hancerli
2023-02-13 00:49:09 +01:00
parent 4871e472c4
commit 66d72433a6
230 changed files with 4464 additions and 1387 deletions

View File

@@ -1,150 +1,31 @@
// Copyright (C) 2016 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+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#pragma once
#include "buildsystem/qmlbuildsystem.h" // IWYU pragma: keep
#include "qmlprojectmanager_global.h"
#include <projectexplorer/buildsystem.h>
#include <projectexplorer/project.h>
#include <utils/environment.h>
#include <QPointer>
namespace QmlProjectManager {
class QmlProject;
class QmlProjectItem;
class QMLPROJECTMANAGER_EXPORT QmlBuildSystem : public ProjectExplorer::BuildSystem
{
Q_OBJECT
public:
explicit QmlBuildSystem(ProjectExplorer::Target *target);
~QmlBuildSystem();
void triggerParsing() final;
bool supportsAction(ProjectExplorer::Node *context,
ProjectExplorer::ProjectAction action,
const ProjectExplorer::Node *node) const override;
bool addFiles(ProjectExplorer::Node *context,
const Utils::FilePaths &filePaths, Utils::FilePaths *notAdded = nullptr) override;
bool deleteFiles(ProjectExplorer::Node *context,
const Utils::FilePaths &filePaths) override;
bool renameFile(ProjectExplorer::Node *context,
const Utils::FilePath &oldFilePath, const Utils::FilePath &newFilePath) override;
QString name() const override { return QLatin1String("qml"); }
QmlProject *qmlProject() const;
QVariant additionalData(Utils::Id id) const override;
enum RefreshOption {
ProjectFile = 0x01,
Files = 0x02,
Configuration = 0x04,
Everything = ProjectFile | Files | Configuration
};
Q_DECLARE_FLAGS(RefreshOptions,RefreshOption)
void refresh(RefreshOptions options);
Utils::FilePath canonicalProjectDir() const;
Utils::FilePath mainFile() const;
Utils::FilePath mainUiFile() const;
Utils::FilePath mainFilePath() const;
Utils::FilePath mainUiFilePath() const;
bool setMainFileInProjectFile(const Utils::FilePath &newMainFilePath);
bool setMainUiFileInProjectFile(const Utils::FilePath &newMainUiFilePath);
bool setMainUiFileInMainFile(const Utils::FilePath &newMainUiFilePath);
bool qtForMCUs() const;
bool qt6Project() const;
void setMainFile(const QString &mainFilePath);
Utils::FilePath targetDirectory() const;
Utils::FilePath targetFile(const Utils::FilePath &sourceFile) const;
Utils::EnvironmentItems environment() const;
QStringList customImportPaths() const;
QStringList customFileSelectors() const;
bool multilanguageSupport() const;
QStringList supportedLanguages() const;
void setSupportedLanguages(QStringList languages);
QString primaryLanguage() const;
void setPrimaryLanguage(QString language);
bool forceFreeType() const;
bool widgetApp() const;
QStringList shaderToolArgs() const;
QStringList shaderToolFiles() const;
QStringList importPaths() const;
QStringList files() const;
bool addFiles(const QStringList &filePaths);
void refreshProjectFile();
static Utils::FilePath activeMainFilePath();
static QStringList makeAbsolute(const Utils::FilePath &path, const QStringList &relativePaths);
void generateProjectTree();
void updateDeploymentData();
void refreshFiles(const QSet<QString> &added, const QSet<QString> &removed);
void refreshTargetDirectory();
void onActiveTargetChanged(ProjectExplorer::Target *target);
void onKitChanged();
// plain format
void parseProject(RefreshOptions options);
signals:
void projectChanged();
private:
bool setFileSettingInProjectFile(const QString &setting,
const Utils::FilePath &mainFilePath,
const Utils::FilePath &oldFile);
std::unique_ptr<QmlProjectItem> m_projectItem;
Utils::FilePath m_canonicalProjectDir;
bool m_blockFilesUpdate = false;
friend class FilesUpdateBlocker;
};
class FilesUpdateBlocker {
public:
FilesUpdateBlocker(QmlBuildSystem* bs): m_bs(bs) {
if (m_bs)
m_bs->m_blockFilesUpdate = true;
}
~FilesUpdateBlocker() {
if (m_bs) {
m_bs->m_blockFilesUpdate = false;
m_bs->refresh(QmlBuildSystem::Everything);
}
}
private:
QPointer<QmlBuildSystem> m_bs;
};
class QMLPROJECTMANAGER_EXPORT QmlProject : public ProjectExplorer::Project
{
Q_OBJECT
public:
explicit QmlProject(const Utils::FilePath &filename);
ProjectExplorer::Tasks projectIssues(const ProjectExplorer::Kit *k) const final;
~QmlProject(){
qDebug() << "Closing the project";
};
static bool isQtDesignStudio();
static bool isQtDesignStudioStartedFromQtC();
bool isEditModePreferred() const override;
ProjectExplorer::Tasks projectIssues(const ProjectExplorer::Kit *k) const final;
protected:
RestoreResult fromMap(const QVariantMap &map, QString *errorMessage) override;
@@ -153,9 +34,35 @@ private:
Utils::FilePaths collectUiQmlFilesForFolder(const Utils::FilePath &folder) const;
Utils::FilePaths collectQmlFiles() const;
QMetaObject::Connection m_openFileConnection;
bool setKitWithVersion(const int qtMajorVersion, const QList<ProjectExplorer::Kit *> kits);
bool allowOnlySingleProject();
int preferedQtTarget(ProjectExplorer::Target *target);
private slots:
void parsingFinished(const ProjectExplorer::Target *target, bool success);
};
class FilesUpdateBlocker
{
public:
FilesUpdateBlocker(QmlBuildSystem *bs)
: m_bs(bs)
{
if (m_bs)
m_bs->m_blockFilesUpdate = true;
}
~FilesUpdateBlocker()
{
if (m_bs) {
m_bs->m_blockFilesUpdate = false;
m_bs->refresh(QmlBuildSystem::RefreshOptions::Project);
}
}
private:
QPointer<QmlBuildSystem> m_bs;
};
} // namespace QmlProjectManager
Q_DECLARE_OPERATORS_FOR_FLAGS(QmlProjectManager::QmlBuildSystem::RefreshOptions)