diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp index 50789ec0a20..f9a58dc3919 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp @@ -43,6 +43,8 @@ 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"); return newFolder; } diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index ad20f200f1a..1ba9625ecf2 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -399,7 +399,14 @@ void FlatModel::addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet< if (m_filterDisabledFiles && !node->isEnabled()) continue; if (FolderNode *subFolderNode = node->asFolderNode()) { - const bool isHidden = m_filterProjects && !subFolderNode->showInSimpleTree(); + bool isHidden = m_filterProjects && !subFolderNode->showInSimpleTree(); + if (!m_showSourceGroups) { + if (subFolderNode->isVirtualFolderType()) { + auto vnode = static_cast(subFolderNode); + if (vnode->isSourcesOrHeaders()) + isHidden = true; + } + } if (!isHidden && !seen->contains(subFolderNode)) { seen->insert(subFolderNode); auto node = new WrapperNode(subFolderNode); @@ -800,6 +807,14 @@ void FlatModel::setTrimEmptyDirectories(bool filter) rebuildModel(); } +void FlatModel::setShowSourceGroups(bool filter) +{ + if (filter == m_showSourceGroups) + return; + m_showSourceGroups = filter; + rebuildModel(); +} + bool FlatModel::projectFilterEnabled() { return m_filterProjects; diff --git a/src/plugins/projectexplorer/projectmodels.h b/src/plugins/projectexplorer/projectmodels.h index 25e2dbe6e85..4c7b4012706 100644 --- a/src/plugins/projectexplorer/projectmodels.h +++ b/src/plugins/projectexplorer/projectmodels.h @@ -82,10 +82,12 @@ public: bool generatedFilesFilterEnabled(); bool disabledFilesFilterEnabled() const { return m_filterDisabledFiles; } bool trimEmptyDirectoriesEnabled(); + bool showSourceGroups() { return m_showSourceGroups; } void setProjectFilterEnabled(bool filter); void setGeneratedFilesFilterEnabled(bool filter); void setDisabledFilesFilterEnabled(bool filter); void setTrimEmptyDirectories(bool filter); + void setShowSourceGroups(bool filter); void onExpanded(const QModelIndex &idx); void onCollapsed(const QModelIndex &idx); @@ -98,6 +100,7 @@ private: bool m_filterGeneratedFiles = true; bool m_filterDisabledFiles = false; bool m_trimEmptyDirectories = true; + bool m_showSourceGroups = true; static const QLoggingCategory &logger(); diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 8fd2092ecc1..bba13fe5f15 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -356,6 +356,12 @@ public: bool isFolderNodeType() const override { return false; } bool isVirtualFolderType() const override { return true; } + + bool isSourcesOrHeaders() const { return m_isSourcesOrHeaders; } + void setIsSourcesOrHeaders(bool on) { m_isSourcesOrHeaders = on; } + +private: + bool m_isSourcesOrHeaders; // "Sources" or "Headers" }; // Documentation inside. diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp index dbaed8d983f..54afde7d053 100644 --- a/src/plugins/projectexplorer/projecttreewidget.cpp +++ b/src/plugins/projectexplorer/projecttreewidget.cpp @@ -273,6 +273,12 @@ ProjectTreeWidget::ProjectTreeWidget(QWidget *parent) : QWidget(parent) connect(m_trimEmptyDirectoriesAction, &QAction::toggled, this, &ProjectTreeWidget::setTrimEmptyDirectories); + m_showSourceGroupsAction = new QAction(tr("Show Source and Header Groups"), this); + m_showSourceGroupsAction->setCheckable(true); + m_showSourceGroupsAction->setChecked(true); + connect(m_showSourceGroupsAction, &QAction::toggled, + this, &ProjectTreeWidget::setShowSourceGroups); + // connections connect(m_model, &FlatModel::renamed, this, &ProjectTreeWidget::renamed); @@ -442,6 +448,7 @@ QList ProjectTreeWidget::createToolButtons() filterMenu->addAction(m_filterGeneratedFilesAction); filterMenu->addAction(m_filterDisabledFilesAction); filterMenu->addAction(m_trimEmptyDirectoriesAction); + filterMenu->addAction(m_showSourceGroupsAction); filter->setMenu(filterMenu); auto toggleSync = new QToolButton; @@ -586,6 +593,12 @@ void ProjectTreeWidget::setTrimEmptyDirectories(bool filter) m_trimEmptyDirectoriesAction->setChecked(filter); } +void ProjectTreeWidget::setShowSourceGroups(bool filter) +{ + m_model->setShowSourceGroups(filter); + m_showSourceGroupsAction->setChecked(filter); +} + bool ProjectTreeWidget::generatedFilesFilter() { return m_model->generatedFilesFilterEnabled(); @@ -601,6 +614,11 @@ bool ProjectTreeWidget::trimEmptyDirectoriesFilter() return m_model->trimEmptyDirectoriesEnabled(); } +bool ProjectTreeWidget::showSourceGroups() +{ + return m_model->showSourceGroups(); +} + bool ProjectTreeWidget::projectFilter() { return m_model->projectFilterEnabled(); @@ -625,6 +643,7 @@ const bool kProjectFilterDefault = false; const bool kHideGeneratedFilesDefault = true; const bool kHideDisabledFilesDefault = false; const bool kTrimEmptyDirsDefault = true; +const bool kShowSourceGroupsDefault = true; const bool kSyncDefault = true; const char kBaseKey[] = "ProjectTreeWidget."; const char kProjectFilterKey[] = ".ProjectFilter"; @@ -632,6 +651,7 @@ const char kHideGeneratedFilesKey[] = ".GeneratedFilter"; const char kHideDisabledFilesKey[] = ".DisabledFilesFilter"; const char kTrimEmptyDirsKey[] = ".TrimEmptyDirsFilter"; const char kSyncKey[] = ".SyncWithEditor"; +const char kShowSourceGroupsKey[] = ".ShowSourceGroups"; void ProjectTreeWidgetFactory::saveSettings(QtcSettings *settings, int position, QWidget *widget) { @@ -650,6 +670,9 @@ void ProjectTreeWidgetFactory::saveSettings(QtcSettings *settings, int position, settings->setValueWithDefault(baseKey + kTrimEmptyDirsKey, ptw->trimEmptyDirectoriesFilter(), kTrimEmptyDirsDefault); + settings->setValueWithDefault(baseKey + kShowSourceGroupsKey, + ptw->showSourceGroups(), + kShowSourceGroupsDefault); settings->setValueWithDefault(baseKey + kSyncKey, ptw->autoSynchronization(), kSyncDefault); } @@ -666,5 +689,7 @@ void ProjectTreeWidgetFactory::restoreSettings(QSettings *settings, int position settings->value(baseKey + kHideDisabledFilesKey, kHideDisabledFilesDefault).toBool()); ptw->setTrimEmptyDirectories( settings->value(baseKey + kTrimEmptyDirsKey, kTrimEmptyDirsDefault).toBool()); + ptw->setShowSourceGroups( + settings->value(baseKey + kShowSourceGroupsKey, kShowSourceGroupsDefault).toBool()); ptw->setAutoSynchronization(settings->value(baseKey + kSyncKey, kSyncDefault).toBool()); } diff --git a/src/plugins/projectexplorer/projecttreewidget.h b/src/plugins/projectexplorer/projecttreewidget.h index 4909d0bbd82..8daf6be4b9e 100644 --- a/src/plugins/projectexplorer/projecttreewidget.h +++ b/src/plugins/projectexplorer/projecttreewidget.h @@ -58,6 +58,7 @@ public: bool generatedFilesFilter(); bool disabledFilesFilter(); bool trimEmptyDirectoriesFilter(); + bool showSourceGroups(); Node *currentNode(); void sync(ProjectExplorer::Node *node); void showMessage(ProjectExplorer::Node *node, const QString &message); @@ -77,6 +78,7 @@ private: void setGeneratedFilesFilter(bool filter); void setDisabledFilesFilter(bool filter); void setTrimEmptyDirectories(bool filter); + void setShowSourceGroups(bool filter); void handleCurrentItemChange(const QModelIndex ¤t); void showContextMenu(const QPoint &pos); @@ -98,6 +100,7 @@ private: QAction *m_filterDisabledFilesAction = nullptr; QAction *m_trimEmptyDirectoriesAction = nullptr; QAction *m_toggleSync = nullptr; + QAction *m_showSourceGroupsAction = nullptr; QString m_modelId; bool m_autoSync = true; diff --git a/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp b/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp index f5fca961389..b89b5141aeb 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp @@ -179,6 +179,7 @@ static void createTree(QmakeBuildSystem *buildSystem, vfolder->setIcon(fileTypes.at(i).icon); vfolder->setDisplayName(fileTypes.at(i).typeName); vfolder->setAddFileFilter(fileTypes.at(i).addFileFilter); + vfolder->setIsSourcesOrHeaders(type == FileType::Source || type == FileType::Header); if (type == FileType::Resource) { for (const auto &file : newFilePaths) {