diff --git a/src/plugins/todo/optionsdialog.cpp b/src/plugins/todo/optionsdialog.cpp
index 8fb5ca26051..85364554232 100644
--- a/src/plugins/todo/optionsdialog.cpp
+++ b/src/plugins/todo/optionsdialog.cpp
@@ -150,6 +150,7 @@ void OptionsDialog::uiFromSettings(const Settings &settings)
{
ui->scanInCurrentFileRadioButton->setChecked(settings.scanningScope == ScanningScopeCurrentFile);
ui->scanInProjectRadioButton->setChecked(settings.scanningScope == ScanningScopeProject);
+ ui->scanInSubprojectRadioButton->setChecked(settings.scanningScope == ScanningScopeSubProject);
ui->keywordsList->clear();
foreach (const Keyword &keyword, settings.keywords)
@@ -162,6 +163,8 @@ Settings OptionsDialog::settingsFromUi()
if (ui->scanInCurrentFileRadioButton->isChecked())
settings.scanningScope = ScanningScopeCurrentFile;
+ else if (ui->scanInSubprojectRadioButton->isChecked())
+ settings.scanningScope = ScanningScopeSubProject;
else
settings.scanningScope = ScanningScopeProject;
diff --git a/src/plugins/todo/optionsdialog.ui b/src/plugins/todo/optionsdialog.ui
index a440652155a..e097f1cf058 100644
--- a/src/plugins/todo/optionsdialog.ui
+++ b/src/plugins/todo/optionsdialog.ui
@@ -101,6 +101,13 @@
+ -
+
+
+ Scan the current subproject
+
+
+
diff --git a/src/plugins/todo/settings.h b/src/plugins/todo/settings.h
index b41d48a1fc3..3d930f69574 100644
--- a/src/plugins/todo/settings.h
+++ b/src/plugins/todo/settings.h
@@ -41,7 +41,8 @@ namespace Internal {
enum ScanningScope {
ScanningScopeCurrentFile,
- ScanningScopeProject
+ ScanningScopeProject,
+ ScanningScopeSubProject
};
class Settings {
diff --git a/src/plugins/todo/todoitemsprovider.cpp b/src/plugins/todo/todoitemsprovider.cpp
index 8308cdc7aff..2fd6a8d27d6 100644
--- a/src/plugins/todo/todoitemsprovider.cpp
+++ b/src/plugins/todo/todoitemsprovider.cpp
@@ -36,7 +36,10 @@
#include "todoitemsmodel.h"
#include "todoitemsscanner.h"
+#include
#include
+#include
+#include
#include
#include
#include
@@ -90,6 +93,10 @@ void TodoItemsProvider::updateList()
if (m_settings.scanningScope == ScanningScopeCurrentFile) {
if (m_currentEditor)
m_itemsList = m_itemsHash.value(m_currentEditor->document()->filePath().toString());
+ // Show only items of the current sub-project
+ } else if (m_settings.scanningScope == ScanningScopeSubProject) {
+ if (m_startupProject)
+ setItemsListWithinSubproject();
// Show only items of the startup project if any
} else if (m_startupProject) {
setItemsListWithinStartupProject();
@@ -139,6 +146,34 @@ void TodoItemsProvider::setItemsListWithinStartupProject()
}
}
+void TodoItemsProvider::setItemsListWithinSubproject()
+{
+ // TODO prefer current editor as source of sub-project
+ Node *node = ProjectTree::currentNode();
+ if (node) {
+ ProjectNode *projectNode = node->projectNode();
+ if (projectNode) {
+
+ FindAllFilesVisitor filesVisitor;
+ projectNode->accept(&filesVisitor);
+
+ // files must be both in the current subproject and the startup-project.
+ QSet subprojectFileNames =
+ QSet::fromList(filesVisitor.filePaths());
+ QSet fileNames = QSet::fromList(
+ m_startupProject->files(ProjectExplorer::Project::ExcludeGeneratedFiles));
+ QHashIterator > it(m_itemsHash);
+ while (it.hasNext()) {
+ it.next();
+ if (subprojectFileNames.contains(Utils::FileName::fromString(it.key()))
+ && fileNames.contains(it.key())) {
+ m_itemsList << it.value();
+ }
+ }
+ }
+ }
+}
+
void TodoItemsProvider::itemsFetched(const QString &fileName, const QList &items)
{
// Replace old items with new ones
@@ -161,8 +196,10 @@ void TodoItemsProvider::projectsFilesChanged()
void TodoItemsProvider::currentEditorChanged(Core::IEditor *editor)
{
m_currentEditor = editor;
- if (m_settings.scanningScope == ScanningScopeCurrentFile)
+ if (m_settings.scanningScope == ScanningScopeCurrentFile
+ || m_settings.scanningScope == ScanningScopeSubProject) {
updateList();
+ }
}
void TodoItemsProvider::updateListTimeoutElapsed()
diff --git a/src/plugins/todo/todoitemsprovider.h b/src/plugins/todo/todoitemsprovider.h
index 75a64cb1d3b..fbf25495508 100644
--- a/src/plugins/todo/todoitemsprovider.h
+++ b/src/plugins/todo/todoitemsprovider.h
@@ -86,6 +86,7 @@ private:
void updateList();
void createScanners();
void setItemsListWithinStartupProject();
+ void setItemsListWithinSubproject();
private slots:
void itemsFetched(const QString &fileName, const QList &items);
diff --git a/src/plugins/todo/todoitemsscanner.h b/src/plugins/todo/todoitemsscanner.h
index b6313227ca5..6bbb828f0c6 100644
--- a/src/plugins/todo/todoitemsscanner.h
+++ b/src/plugins/todo/todoitemsscanner.h
@@ -37,10 +37,6 @@
#include
-namespace ProjectExplorer {
-class Project;
-}
-
namespace Todo {
namespace Internal {
diff --git a/src/plugins/todo/todooutputpane.cpp b/src/plugins/todo/todooutputpane.cpp
index 7dbb3247f02..e31a95f9e5b 100644
--- a/src/plugins/todo/todooutputpane.cpp
+++ b/src/plugins/todo/todooutputpane.cpp
@@ -72,7 +72,8 @@ QList TodoOutputPane::toolBarWidgets() const
return QList()
<< m_spacer
<< m_currentFileButton
- << m_wholeProjectButton;
+ << m_wholeProjectButton
+ << m_subProjectButton;
}
QString TodoOutputPane::displayName() const
@@ -144,6 +145,8 @@ void TodoOutputPane::setScanningScope(ScanningScope scanningScope)
{
if (scanningScope == ScanningScopeCurrentFile)
m_currentFileButton->setChecked(true);
+ else if (scanningScope == ScanningScopeSubProject)
+ m_subProjectButton->setChecked(true);
else if (scanningScope == ScanningScopeProject)
m_wholeProjectButton->setChecked(true);
else
@@ -154,6 +157,8 @@ void TodoOutputPane::scopeButtonClicked(QAbstractButton* button)
{
if (button == m_currentFileButton)
emit scanningScopeChanged(ScanningScopeCurrentFile);
+ else if (button == m_subProjectButton)
+ emit scanningScopeChanged(ScanningScopeSubProject);
else if (button == m_wholeProjectButton)
emit scanningScopeChanged(ScanningScopeProject);
setBadgeNumber(m_todoItemsModel->rowCount());
@@ -205,9 +210,15 @@ void TodoOutputPane::createScopeButtons()
m_wholeProjectButton->setText(tr("Active Project"));
m_wholeProjectButton->setToolTip(tr("Scan the whole active project."));
+ m_subProjectButton = new QToolButton();
+ m_subProjectButton->setCheckable(true);
+ m_subProjectButton->setText(tr("Subproject"));
+ m_subProjectButton->setToolTip(tr("Scan the current subproject."));
+
m_scopeButtons = new QButtonGroup();
m_scopeButtons->addButton(m_wholeProjectButton);
m_scopeButtons->addButton(m_currentFileButton);
+ m_scopeButtons->addButton(m_subProjectButton);
connect(m_scopeButtons, static_cast(&QButtonGroup::buttonClicked),
this, &TodoOutputPane::scopeButtonClicked);
@@ -219,6 +230,7 @@ void TodoOutputPane::freeScopeButtons()
{
delete m_currentFileButton;
delete m_wholeProjectButton;
+ delete m_subProjectButton;
delete m_scopeButtons;
delete m_spacer;
}
diff --git a/src/plugins/todo/todooutputpane.h b/src/plugins/todo/todooutputpane.h
index ab5f55932d4..769493e8976 100644
--- a/src/plugins/todo/todooutputpane.h
+++ b/src/plugins/todo/todooutputpane.h
@@ -88,6 +88,7 @@ private:
TodoOutputTreeView *m_todoTreeView;
QToolButton *m_currentFileButton;
QToolButton *m_wholeProjectButton;
+ QToolButton *m_subProjectButton;
QWidget *m_spacer;
QButtonGroup *m_scopeButtons;
QList *items;