From f76e0de7bc98a3d7171390d682bb5046ddfce634 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 11 Apr 2024 18:29:36 +0200 Subject: [PATCH] CMakePM: Do not show subfolders for custom source_groups CMake does have a few default source groups (cmMakefile.cxx): this->AddSourceGroup("", "^.*$"); this->AddSourceGroup("Source Files", CM_SOURCE_REGEX); this->AddSourceGroup("Header Files", CM_HEADER_REGEX); this->AddSourceGroup("Precompile Header File", CM_PCH_REGEX); this->AddSourceGroup("CMake Rules", "\\.rule$"); this->AddSourceGroup("Resources", CM_RESOURCE_REGEX); this->AddSourceGroup("Object Files", "\\.(lo|o|obj)$"); This commit will get Qt Creator to display the actual subfolder structure only if the CMake setting "Show subfolders inside source group folders" is set and for "Source Files" and "Header Files" source groups. Any other source group or a custom source group defined by `source_group` will not get this treatment, since this what the oder IDEs (e.g. Visual Studio) and what the users expect to have. Task-number: QTCREATORBUG-27432 Fixes: QTCREATORBUG-30620 Change-Id: I3c30814df2f76d18ee5fd4fd1356d4dfc4b9b09b Reviewed-by: Marcus Tillmanns Reviewed-by: --- src/plugins/cmakeprojectmanager/fileapidataextractor.cpp | 7 ++++++- src/plugins/cmakeprojectmanager/projecttreehelper.cpp | 8 ++++++-- src/plugins/cmakeprojectmanager/projecttreehelper.h | 2 ++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index e9f6d4351d4..ea156be8a11 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -654,7 +654,6 @@ static void addCompileGroups(ProjectNode *targetRoot, const FilePath &buildDirectory, const TargetDetails &td) { - const bool showSourceFolders = settings().showSourceSubFolders(); const bool inSourceBuild = (sourceDirectory == buildDirectory); QSet alreadyListed; @@ -685,6 +684,9 @@ static void addCompileGroups(ProjectNode *targetRoot, if (isPchFile(buildDirectory, sourcePath) || isUnityFile(buildDirectory, sourcePath)) node->setIsGenerated(true); + const bool showSourceFolders = settings().showSourceSubFolders() + && sourcesOrHeadersFolder(td.sourceGroups[si.sourceGroup]); + // Where does the file node need to go? if (showSourceFolders && sourcePath.isChildOf(buildDirectory) && !inSourceBuild) { buildFileNodes.emplace_back(std::move(node)); @@ -696,6 +698,9 @@ static void addCompileGroups(ProjectNode *targetRoot, } for (size_t i = 0; i < sourceGroupFileNodes.size(); ++i) { + const bool showSourceFolders = settings().showSourceSubFolders() + && sourcesOrHeadersFolder(td.sourceGroups[i]); + std::vector> ¤t = sourceGroupFileNodes[i]; FolderNode *insertNode = td.sourceGroups[i] == "TREE" ? targetRoot diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp index 7987fdb0c56..d23f6a4f972 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp @@ -18,6 +18,11 @@ using namespace ProjectExplorer; namespace CMakeProjectManager::Internal { +bool sourcesOrHeadersFolder(const QString &displayName) +{ + return displayName == "Source Files" || displayName == "Header Files"; +} + std::unique_ptr createCMakeVFolder(const Utils::FilePath &basePath, int priority, const QString &displayName) @@ -25,8 +30,7 @@ std::unique_ptr createCMakeVFolder(const Utils::FilePath &basePath, auto newFolder = std::make_unique(basePath); newFolder->setPriority(priority); newFolder->setDisplayName(displayName); - newFolder->setIsSourcesOrHeaders(displayName == "Source Files" - || displayName == "Header Files"); + newFolder->setIsSourcesOrHeaders(sourcesOrHeadersFolder(displayName)); return newFolder; } diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.h b/src/plugins/cmakeprojectmanager/projecttreehelper.h index 5a7ffaa8b25..258e0a63231 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.h +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.h @@ -11,6 +11,8 @@ namespace CMakeProjectManager::Internal { +bool sourcesOrHeadersFolder(const QString &displayName); + std::unique_ptr createCMakeVFolder(const Utils::FilePath &basePath, int priority, const QString &displayName);