diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index c0056512f85b954321970046af17166cc12d57ac..0d1d6712a9caf181ced14707fd6170f33aad66c6 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -44,7 +44,6 @@ #include <QtCore/QDir> #include <QtCore/QFileInfo> -#include <QtCore/QDebug> #include <QtGui/QApplication> #include <QtGui/QClipboard> #include <QtGui/QKeyEvent> @@ -134,6 +133,8 @@ public: int taskCount(); int errorTaskCount(); + bool hasFile(const QModelIndex &index) const; + private: QHash<QString,QString> m_categories; // category id -> display name QList<Task> m_tasks; // all tasks (in order of insertion) @@ -170,6 +171,9 @@ public: Task task(const QModelIndex &index) const { return static_cast<TaskModel *>(sourceModel())->task(mapToSource(index)); } + bool hasFile(const QModelIndex &index) const + { return static_cast<TaskModel *>(sourceModel())->hasFile(mapToSource(index)); } + protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; @@ -232,6 +236,14 @@ int TaskModel::errorTaskCount() return m_errorTaskCount; } +bool TaskModel::hasFile(const QModelIndex &index) const +{ + int row = index.row(); + if (!index.isValid() || row < 0 || row >= m_tasks.count()) + return false; + return !m_tasks.at(row).file.isEmpty(); +} + QIcon TaskModel::taskTypeIcon(Task::TaskType t) const { switch (t) { @@ -807,14 +819,20 @@ bool TaskWindow::canPrevious() void TaskWindow::goToNext() { - if (!d->m_filter->rowCount()) + if (!canNext()) return; - QModelIndex currentIndex = d->m_listview->currentIndex(); - if (currentIndex.isValid()) { - int row = currentIndex.row() + 1; - if (row == d->m_filter->rowCount()) - row = 0; - currentIndex = d->m_filter->index(row, 0); + QModelIndex startIndex = d->m_listview->currentIndex(); + QModelIndex currentIndex = startIndex; + + if (startIndex.isValid()) { + do { + int row = currentIndex.row() + 1; + if (row == d->m_filter->rowCount()) + row = 0; + currentIndex = d->m_filter->index(row, 0); + if (d->m_filter->hasFile(currentIndex)) + break; + } while (startIndex != currentIndex); } else { currentIndex = d->m_filter->index(0, 0); } @@ -824,16 +842,22 @@ void TaskWindow::goToNext() void TaskWindow::goToPrev() { - if (!d->m_filter->rowCount()) + if (!canPrevious()) return; - QModelIndex currentIndex = d->m_listview->currentIndex(); - if (currentIndex.isValid()) { - int row = currentIndex.row() -1; - if (row < 0) - row = d->m_filter->rowCount() - 1; - currentIndex = d->m_filter->index(row, 0); + QModelIndex startIndex = d->m_listview->currentIndex(); + QModelIndex currentIndex = startIndex; + + if (startIndex.isValid()) { + do { + int row = currentIndex.row() - 1; + if (row < 0) + row = d->m_filter->rowCount() - 1; + currentIndex = d->m_filter->index(row, 0); + if (d->m_filter->hasFile(currentIndex)) + break; + } while (startIndex != currentIndex); } else { - currentIndex = d->m_filter->index(d->m_filter->rowCount()-1, 0); + currentIndex = d->m_filter->index(0, 0); } d->m_listview->setCurrentIndex(currentIndex); triggerDefaultHandler(currentIndex);