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;