QmlProjectItem: ability to extend existing qml module list

Task-number: QDS-13811
Change-Id: I63be5d7c8640df340d266b57924cb46b3b23bdc3
Reviewed-by: Sivert Krøvel <sivert.krovel@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Rafal Stawarski
2024-10-18 18:30:27 +02:00
parent e376992d01
commit 2af197a2b8
6 changed files with 98 additions and 1 deletions

View File

@@ -530,6 +530,7 @@ QJsonObject qmlProjectTojson(const Utils::FilePath &projectFile)
QStringList qmlProjectDependencies;
qmlProjectDependencies.append(qmlprojectsFromImportPaths(importPaths, projectRootPath));
qmlProjectDependencies.append(qmlprojectsFromFilesNodes(fileGroupsObject, projectRootPath));
qmlProjectDependencies.removeDuplicates();
qmlProjectDependencies.sort();
rootObject.insert("qmlprojectDependencies", QJsonArray::fromStringList(qmlProjectDependencies));

View File

@@ -238,6 +238,28 @@ QStringList QmlProjectItem::qmlProjectModules() const
return m_project["qmlprojectDependencies"].toVariant().toStringList();
}
void QmlProjectItem::setQmlProjectModules(const QStringList &paths)
{
if (qmlProjectModules() == paths)
return;
auto jsonArray = QJsonArray::fromStringList(paths);
updateFileGroup("Module", "files", jsonArray);
insertAndUpdateProjectFile("qmlprojectDependencies", jsonArray);
}
void QmlProjectItem::addQmlProjectModule(const QString &modulePath)
{
QJsonArray qmlModules = m_project["qmlprojectDependencies"].toArray();
if (qmlModules.contains(modulePath))
return;
qmlModules.append(modulePath);
updateFileGroup("Module", "files", qmlModules);
insertAndUpdateProjectFile("qmlprojectDependencies", qmlModules);
}
QStringList QmlProjectItem::fileSelectors() const
{
return m_project["runConfig"].toObject()["fileSelectors"].toVariant().toStringList();
@@ -444,10 +466,35 @@ void QmlProjectItem::addShaderToolFile(const QString &file)
void QmlProjectItem::insertAndUpdateProjectFile(const QString &key, const QJsonValue &value)
{
m_project[key] = value;
if (!m_skipRewrite)
m_projectFile.writeFileContents(Converters::jsonToQmlProject(m_project).toUtf8());
}
void QmlProjectItem::updateFileGroup(const QString &groupType,
const QString &property,
const QJsonValue &value)
{
auto arr = m_project["fileGroups"].toArray();
auto found = std::find_if(arr.begin(), arr.end(), [groupType](const QJsonValue &elem) {
return elem["type"].toString() == groupType;
});
if (found == arr.end()) {
qWarning() << "fileGroups - unable to find group:" << groupType;
return;
}
auto obj = found->toObject();
obj[property] = value;
arr.removeAt(std::distance(arr.begin(), found));
arr.append(obj);
m_project["fileGroups"] = arr;
m_content.clear();
setupFileFilters();
}
bool QmlProjectItem::enableCMakeGeneration() const
{
return m_project["deployment"].toObject()["enableCMakeGeneration"].toBool();

View File

@@ -50,6 +50,8 @@ public:
void setMockImports(const QStringList &paths);
QStringList qmlProjectModules() const;
void setQmlProjectModules(const QStringList &paths);
void addQmlProjectModule(const QString &modulePath);
QStringList fileSelectors() const;
void setFileSelectors(const QStringList &selectors);
@@ -121,6 +123,7 @@ private:
// file update functions
void insertAndUpdateProjectFile(const QString &key, const QJsonValue &value);
void updateFileGroup(const QString &groupType, const QString &property, const QJsonValue &value);
};
} // namespace QmlProjectManager

View File

@@ -446,6 +446,11 @@ QmlBuildSystem *QmlBuildSystem::getStartupBuildSystem()
return nullptr;
}
void QmlBuildSystem::addQmlProjectModule(const Utils::FilePath &path)
{
m_projectItem->addQmlProjectModule(path.toFSPathString());
}
Utils::FilePath QmlBuildSystem::mainFilePath() const
{
const QString fileName = mainFile();
@@ -727,6 +732,11 @@ QStringList QmlBuildSystem::importPaths() const
return m_projectItem->importPaths();
}
void QmlBuildSystem::addImportPath(const Utils::FilePath &path)
{
m_projectItem->addImportPath(path.toFSPathString());
}
QStringList QmlBuildSystem::mockImports() const
{
return m_projectItem->mockImports();

View File

@@ -74,12 +74,14 @@ public:
Utils::EnvironmentItems environment() const;
QStringList allImports() const;
QStringList importPaths() const;
QStringList mockImports() const;
QStringList absoluteImportPaths() const;
QStringList targetImportPaths() const;
QStringList fileSelectors() const;
QStringList importPaths() const;
void addImportPath(const Utils::FilePath &path);
bool multilanguageSupport() const;
QStringList supportedLanguages() const;
void setSupportedLanguages(QStringList languages);
@@ -115,6 +117,8 @@ public:
static QmlBuildSystem *getStartupBuildSystem();
void addQmlProjectModule(const Utils::FilePath &path);
signals:
void projectChanged();

View File

@@ -762,6 +762,38 @@ TEST_F(QmlProjectItem, qmlproject_modules)
"../converter/test-set-mcu-2/testfile.qmlproject"));
}
TEST_F(QmlProjectItem, set_empty_qmlproject_modules)
{
projectItemSetters->setQmlProjectModules({});
auto qmlProjectModules = projectItemSetters->qmlProjectModules();
ASSERT_THAT(qmlProjectModules, IsEmpty());
}
TEST_F(QmlProjectItem, set_qmlproject_modules)
{
projectItemSetters->setQmlProjectModules({"testModule.qmlproject", "testModule2.qmlproject"});
auto qmlProjectModules = projectItemSetters->qmlProjectModules();
ASSERT_THAT(qmlProjectModules,
UnorderedElementsAre("testModule.qmlproject", "testModule2.qmlproject"));
}
TEST_F(QmlProjectItem, add_qmlproject_module)
{
auto currentModules = projectItemSetters->qmlProjectModules();
projectItemSetters->addQmlProjectModule("test.qmlproject");
projectItemSetters->addQmlProjectModule("test2.qmlproject");
auto qmlProjectModules = projectItemSetters->qmlProjectModules();
ASSERT_THAT(qmlProjectModules,
UnorderedElementsAreArray(currentModules
+ QStringList{"test.qmlproject", "test2.qmlproject"}));
}
TEST_F(QmlProjectItem, no_qmlproject_modules)
{
auto qmlProjectModules = projectItemEmpty->qmlProjectModules();