From dc18d4b9ee88178241df9b51fbba2c4a3216cd12 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 9 May 2023 13:49:50 +0200 Subject: [PATCH] CMakePM: Display presets as part of the project outline Fixes: QTCREATORBUG-28966 Change-Id: Iae0f77956bf6f4682ea8a25e08d05de3331c7420 Reviewed-by: Alessandro Portale Reviewed-by: Reviewed-by: hjk --- .../cmakeprojectmanager/cmakeproject.cpp | 8 +++++ .../cmakeprojectmanager/cmakeprojectnodes.cpp | 9 ++++++ .../cmakeprojectmanager/cmakeprojectnodes.h | 6 ++++ .../fileapidataextractor.cpp | 3 ++ .../cmakeprojectmanager/projecttreehelper.cpp | 30 +++++++++++++++++++ .../cmakeprojectmanager/projecttreehelper.h | 2 ++ 6 files changed, 58 insertions(+) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 71b96610db5..8bd96f239ef 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -93,6 +93,14 @@ Internal::PresetsData CMakeProject::combinePresets(Internal::PresetsData &cmakeP result.version = cmakePresetsData.version; result.cmakeMinimimRequired = cmakePresetsData.cmakeMinimimRequired; + result.include = cmakePresetsData.include; + if (result.include) { + if (cmakeUserPresetsData.include) + result.include->append(cmakeUserPresetsData.include.value()); + } else { + result.include = cmakeUserPresetsData.include; + } + auto combinePresetsInternal = [](auto &presetsHash, auto &presets, auto &userPresets, diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp index 10f18fbf675..b26f9a70b5b 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp @@ -30,6 +30,15 @@ CMakeInputsNode::CMakeInputsNode(const FilePath &cmakeLists) : setListInProject(false); } +CMakePresetsNode::CMakePresetsNode(const FilePath &projectPath) : + ProjectExplorer::ProjectNode(projectPath) +{ + setPriority(Node::DefaultPriority - 9); + setDisplayName(Tr::tr("CMake Presets")); + setIcon(DirectoryIcon(ProjectExplorer::Constants::FILEOVERLAY_PRODUCT)); + setListInProject(false); +} + CMakeListsNode::CMakeListsNode(const FilePath &cmakeListPath) : ProjectExplorer::ProjectNode(cmakeListPath) { diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.h b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.h index 5d248020abe..94cde6dfef1 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.h +++ b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.h @@ -15,6 +15,12 @@ public: CMakeInputsNode(const Utils::FilePath &cmakeLists); }; +class CMakePresetsNode : public ProjectExplorer::ProjectNode +{ +public: + CMakePresetsNode(const Utils::FilePath &projectPath); +}; + class CMakeListsNode : public ProjectExplorer::ProjectNode { public: diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index c6f8f1225c8..1ef71721686 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -711,6 +711,9 @@ std::unique_ptr generateRootProjectNode( std::move(data.cmakeNodesBuild), std::move(data.cmakeNodesOther)); + + addCMakePresets(result.get(), sourceDirectory); + data.cmakeNodesSource.clear(); // Remove all the nullptr in the vector... data.cmakeNodesBuild.clear(); // Remove all the nullptr in the vector... data.cmakeNodesOther.clear(); // Remove all the nullptr in the vector... diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp index 4069ca6aa1f..7b9efb07b94 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp @@ -3,9 +3,11 @@ #include "projecttreehelper.h" +#include "cmakeproject.h" #include "cmakeprojectmanagertr.h" #include +#include #include #include @@ -88,6 +90,34 @@ void addCMakeInputs(FolderNode *root, root->addNode(std::move(cmakeVFolder)); } +void addCMakePresets(FolderNode *root, const Utils::FilePath &sourceDir) +{ + QStringList presetFileNames; + presetFileNames << "CMakePresets.json"; + presetFileNames << "CMakeUserPresets.json"; + + const CMakeProject *cp = static_cast( + ProjectManager::projectForFile(sourceDir.pathAppended("CMakeLists.txt"))); + + if (cp && cp->presetsData().include) + presetFileNames.append(cp->presetsData().include.value()); + + std::vector> presets; + for (const auto &fileName : presetFileNames) { + Utils::FilePath file = sourceDir.pathAppended(fileName); + if (file.exists()) + presets.push_back(std::make_unique(file, Node::fileTypeForFileName(file))); + } + + if (presets.empty()) + return; + + std::unique_ptr cmakeVFolder = std::make_unique(root->filePath()); + addCMakeVFolder(cmakeVFolder.get(), sourceDir, 1000, QString(), std::move(presets)); + + root->addNode(std::move(cmakeVFolder)); +} + QHash addCMakeLists( CMakeProjectNode *root, std::vector> &&cmakeLists) { diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.h b/src/plugins/cmakeprojectmanager/projecttreehelper.h index 66cde4aea9b..34a8723759f 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.h +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.h @@ -30,6 +30,8 @@ void addCMakeInputs(ProjectExplorer::FolderNode *root, std::vector> &&buildInputs, std::vector> &&rootInputs); +void addCMakePresets(ProjectExplorer::FolderNode *root, const Utils::FilePath &sourceDir); + QHash addCMakeLists( CMakeProjectNode *root, std::vector> &&cmakeLists);