diff --git a/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp b/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp index 51ee81c7d54..92afbe27e45 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/projectitem/converters.cpp @@ -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)); diff --git a/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.cpp b/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.cpp index 65c310ce497..63380fb5b9d 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.cpp @@ -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(); diff --git a/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.h b/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.h index fa6d700291a..6bfc351edff 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.h +++ b/src/plugins/qmlprojectmanager/buildsystem/projectitem/qmlprojectitem.h @@ -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 diff --git a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp index 701da75dd57..509bff6bcf7 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp +++ b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.cpp @@ -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(); diff --git a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.h b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.h index e76d8ba75c9..b2012ec858d 100644 --- a/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.h +++ b/src/plugins/qmlprojectmanager/buildsystem/qmlbuildsystem.h @@ -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(); diff --git a/tests/unit/tests/unittests/qmlprojectmanager/projectitem-test.cpp b/tests/unit/tests/unittests/qmlprojectmanager/projectitem-test.cpp index f3088a56bee..ab12a6e886e 100644 --- a/tests/unit/tests/unittests/qmlprojectmanager/projectitem-test.cpp +++ b/tests/unit/tests/unittests/qmlprojectmanager/projectitem-test.cpp @@ -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();