diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index 6de84f199b2..4dc482c4f7d 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -286,13 +286,17 @@ BuildManager *BuildManager::instance() void BuildManager::extensionsInitialized() { TaskHub::addCategory(Constants::TASK_CATEGORY_COMPILE, - tr("Compile", "Category for compiler issues listed under 'Issues'")); + tr("Compile", "Category for compiler issues listed under 'Issues'"), + true, 100); TaskHub::addCategory(Constants::TASK_CATEGORY_BUILDSYSTEM, - tr("Build System", "Category for build system issues listed under 'Issues'")); + tr("Build System", "Category for build system issues listed under 'Issues'"), + true, 100); TaskHub::addCategory(Constants::TASK_CATEGORY_DEPLOYMENT, - tr("Deployment", "Category for deployment issues listed under 'Issues'")); + tr("Deployment", "Category for deployment issues listed under 'Issues'"), + true, 100); TaskHub::addCategory(Constants::TASK_CATEGORY_AUTOTEST, - tr("Autotests", "Category for autotest issues listed under 'Issues'")); + tr("Autotests", "Category for autotest issues listed under 'Issues'"), + true, 100); } void BuildManager::buildProjectWithoutDependencies(Project *project) diff --git a/src/plugins/projectexplorer/taskhub.cpp b/src/plugins/projectexplorer/taskhub.cpp index 0db4b7073a7..ec402ad03bf 100644 --- a/src/plugins/projectexplorer/taskhub.cpp +++ b/src/plugins/projectexplorer/taskhub.cpp @@ -64,7 +64,7 @@ class TaskMark : public TextEditor::TextMark public: TaskMark(const Task &task) : TextMark(task.file, task.line, categoryForType(task.type)), - m_id(task.taskId) + m_task(task) { setColor(task.type == Task::Error ? Utils::Theme::ProjectExplorer_TaskError_TextMarkColor : Utils::Theme::ProjectExplorer_TaskWarn_TextMarkColor); @@ -90,24 +90,24 @@ public: void updateLineNumber(int lineNumber) override; void removedFromEditor() override; private: - unsigned int m_id; + const Task m_task; }; void TaskMark::updateLineNumber(int lineNumber) { - TaskHub::updateTaskLineNumber(m_id, lineNumber); + TaskHub::updateTaskLineNumber(m_task, lineNumber); TextMark::updateLineNumber(lineNumber); } void TaskMark::updateFileName(const FilePath &fileName) { - TaskHub::updateTaskFileName(m_id, fileName.toString()); + TaskHub::updateTaskFileName(m_task, fileName.toString()); TextMark::updateFileName(FilePath::fromString(fileName.toString())); } void TaskMark::removedFromEditor() { - TaskHub::updateTaskLineNumber(m_id, -1); + TaskHub::updateTaskLineNumber(m_task, -1); } bool TaskMark::isClickable() const @@ -117,7 +117,7 @@ bool TaskMark::isClickable() const void TaskMark::clicked() { - TaskHub::taskMarkClicked(m_id); + TaskHub::taskMarkClicked(m_task); } TaskHub::TaskHub() @@ -132,12 +132,13 @@ TaskHub::~TaskHub() m_instance = nullptr; } -void TaskHub::addCategory(Utils::Id categoryId, const QString &displayName, bool visible) +void TaskHub::addCategory(Utils::Id categoryId, const QString &displayName, bool visible, + int priority) { QTC_CHECK(!displayName.isEmpty()); QTC_ASSERT(!m_registeredCategories.contains(categoryId), return); m_registeredCategories.push_back(categoryId); - emit m_instance->categoryAdded(categoryId, displayName, visible); + emit m_instance->categoryAdded(categoryId, displayName, visible, priority); } TaskHub *TaskHub::instance() @@ -178,24 +179,24 @@ void TaskHub::removeTask(const Task &task) emit m_instance->taskRemoved(task); } -void TaskHub::updateTaskFileName(unsigned int id, const QString &fileName) +void TaskHub::updateTaskFileName(const Task &task, const QString &fileName) { - emit m_instance->taskFileNameUpdated(id, fileName); + emit m_instance->taskFileNameUpdated(task, fileName); } -void TaskHub::updateTaskLineNumber(unsigned int id, int line) +void TaskHub::updateTaskLineNumber(const Task &task, int line) { - emit m_instance->taskLineNumberUpdated(id, line); + emit m_instance->taskLineNumberUpdated(task, line); } -void TaskHub::taskMarkClicked(unsigned int id) +void TaskHub::taskMarkClicked(const Task &task) { - emit m_instance->showTask(id); + emit m_instance->showTask(task); } -void TaskHub::showTaskInEditor(unsigned int id) +void TaskHub::showTaskInEditor(const Task &task) { - emit m_instance->openTask(id); + emit m_instance->openTask(task); } void TaskHub::setCategoryVisibility(Utils::Id categoryId, bool visible) diff --git a/src/plugins/projectexplorer/taskhub.h b/src/plugins/projectexplorer/taskhub.h index b6696fa511d..40255e21fec 100644 --- a/src/plugins/projectexplorer/taskhub.h +++ b/src/plugins/projectexplorer/taskhub.h @@ -50,26 +50,28 @@ public slots: static void removeTask(const ProjectExplorer::Task &task); public: - static void addCategory(Utils::Id categoryId, const QString &displayName, bool visible = true); - static void updateTaskFileName(unsigned int id, const QString &fileName); - static void updateTaskLineNumber(unsigned int id, int line); - static void taskMarkClicked(unsigned int id); - static void showTaskInEditor(unsigned int id); + static void addCategory(Utils::Id categoryId, const QString &displayName, bool visible = true, + int priority = 0); + static void updateTaskFileName(const Task &task, const QString &fileName); + static void updateTaskLineNumber(const Task &task, int line); + static void taskMarkClicked(const Task &task); + static void showTaskInEditor(const Task &task); static void setCategoryVisibility(Utils::Id categoryId, bool visible); static void requestPopup(); signals: - void categoryAdded(Utils::Id categoryId, const QString &displayName, bool visible); + void categoryAdded(Utils::Id categoryId, const QString &displayName, bool visible, + int priority); void taskAdded(const ProjectExplorer::Task &task); void taskRemoved(const ProjectExplorer::Task &task); void tasksCleared(Utils::Id categoryId); - void taskFileNameUpdated(unsigned int id, const QString &fileName); - void taskLineNumberUpdated(unsigned int id, int line); + void taskFileNameUpdated(const Task &task, const QString &fileName); + void taskLineNumberUpdated(const Task &task, int line); void categoryVisibilityChanged(Utils::Id categoryId, bool visible); void popupRequested(int); - void showTask(unsigned int id); - void openTask(unsigned int id); + void showTask(const Task &task); + void openTask(const Task &task); private: TaskHub(); diff --git a/src/plugins/projectexplorer/taskmodel.cpp b/src/plugins/projectexplorer/taskmodel.cpp index a52f2ff3ac6..b9b74bb340c 100644 --- a/src/plugins/projectexplorer/taskmodel.cpp +++ b/src/plugins/projectexplorer/taskmodel.cpp @@ -35,6 +35,9 @@ #include #include +#include + +using namespace std::placeholders; namespace ProjectExplorer { namespace Internal { @@ -78,11 +81,12 @@ bool TaskModel::hasFile(const QModelIndex &index) const return !m_tasks.at(row).file.isEmpty(); } -void TaskModel::addCategory(Utils::Id categoryId, const QString &categoryName) +void TaskModel::addCategory(Utils::Id categoryId, const QString &categoryName, int priority) { QTC_ASSERT(categoryId.isValid(), return); CategoryData data; data.displayName = categoryName; + data.priority = priority; m_categories.insert(categoryId, data); } @@ -99,9 +103,20 @@ Tasks TaskModel::tasks(Utils::Id categoryId) const return taskList; } -bool sortById(const Task &task, unsigned int id) +bool TaskModel::compareTasks(const Task &task1, const Task &task2) { - return task.taskId < id; + if (task1.category == task2.category) + return task1.taskId < task2.taskId; + + // Higher-priority task should appear higher up in the view and thus compare less-than. + const int prio1 = m_categories.value(task1.category).priority; + const int prio2 = m_categories.value(task2.category).priority; + if (prio1 < prio2) + return false; + if (prio1 > prio2) + return true; + + return task1.taskId < task2.taskId; } void TaskModel::addTask(const Task &task) @@ -110,7 +125,8 @@ void TaskModel::addTask(const Task &task) CategoryData &data = m_categories[task.category]; CategoryData &global = m_categories[Utils::Id()]; - auto it = std::lower_bound(m_tasks.begin(), m_tasks.end(),task.taskId, sortById); + auto it = std::lower_bound(m_tasks.begin(), m_tasks.end(), task, + std::bind(&TaskModel::compareTasks, this, _1, task)); int i = it - m_tasks.begin(); beginInsertRows(QModelIndex(), i, i); m_tasks.insert(it, task); @@ -134,30 +150,31 @@ void TaskModel::removeTask(unsigned int id) } } -int TaskModel::rowForId(unsigned int id) +int TaskModel::rowForTask(const Task &task) { - auto it = std::lower_bound(m_tasks.constBegin(), m_tasks.constEnd(), id, sortById); + auto it = std::lower_bound(m_tasks.constBegin(), m_tasks.constEnd(), task, + std::bind(&TaskModel::compareTasks, this, _1, task)); if (it == m_tasks.constEnd()) return -1; return it - m_tasks.constBegin(); } -void TaskModel::updateTaskFileName(unsigned int id, const QString &fileName) +void TaskModel::updateTaskFileName(const Task &task, const QString &fileName) { - int i = rowForId(id); + int i = rowForTask(task); QTC_ASSERT(i != -1, return); - if (m_tasks.at(i).taskId == id) { + if (m_tasks.at(i).taskId == task.taskId) { m_tasks[i].file = Utils::FilePath::fromString(fileName); const QModelIndex itemIndex = index(i, 0); emit dataChanged(itemIndex, itemIndex); } } -void TaskModel::updateTaskLineNumber(unsigned int id, int line) +void TaskModel::updateTaskLineNumber(const Task &task, int line) { - int i = rowForId(id); + int i = rowForTask(task); QTC_ASSERT(i != -1, return); - if (m_tasks.at(i).taskId == id) { + if (m_tasks.at(i).taskId == task.taskId) { m_tasks[i].movedLine = line; const QModelIndex itemIndex = index(i, 0); emit dataChanged(itemIndex, itemIndex); diff --git a/src/plugins/projectexplorer/taskmodel.h b/src/plugins/projectexplorer/taskmodel.h index bb3cb2c2a4c..43e2d1d18c9 100644 --- a/src/plugins/projectexplorer/taskmodel.h +++ b/src/plugins/projectexplorer/taskmodel.h @@ -52,14 +52,14 @@ public: QList categoryIds() const; QString categoryDisplayName(Utils::Id categoryId) const; - void addCategory(Utils::Id categoryId, const QString &categoryName); + void addCategory(Utils::Id categoryId, const QString &categoryName, int priority); Tasks tasks(Utils::Id categoryId = Utils::Id()) const; void addTask(const Task &t); void removeTask(unsigned int id); void clearTasks(Utils::Id categoryId = Utils::Id()); - void updateTaskFileName(unsigned int id, const QString &fileName); - void updateTaskLineNumber(unsigned int id, int line); + void updateTaskFileName(const Task &task, const QString &fileName); + void updateTaskLineNumber(const Task &task, int line); int sizeOfFile(const QFont &font); int sizeOfLineNumber(const QFont &font); @@ -74,8 +74,9 @@ public: bool hasFile(const QModelIndex &index) const; - int rowForId(unsigned int id); + int rowForTask(const Task &task); private: + bool compareTasks(const Task &t1, const Task &t2); class CategoryData { @@ -105,6 +106,7 @@ private: } QString displayName; + int priority = 0; int count = 0; int warnings = 0; int errors = 0; diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index a69011df64d..7b197a7ce18 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -507,9 +507,10 @@ void TaskWindow::visibilityChanged(bool visible) delayedInitialization(); } -void TaskWindow::addCategory(Utils::Id categoryId, const QString &displayName, bool visible) +void TaskWindow::addCategory(Utils::Id categoryId, const QString &displayName, bool visible, + int priority) { - d->m_model->addCategory(categoryId, displayName); + d->m_model->addCategory(categoryId, displayName, priority); if (!visible) { QList filters = d->m_filter->filteredCategories(); filters += categoryId; @@ -540,30 +541,30 @@ void TaskWindow::removeTask(const Task &task) navigateStateChanged(); } -void TaskWindow::updatedTaskFileName(unsigned int id, const QString &fileName) +void TaskWindow::updatedTaskFileName(const Task &task, const QString &fileName) { - d->m_model->updateTaskFileName(id, fileName); + d->m_model->updateTaskFileName(task, fileName); emit tasksChanged(); } -void TaskWindow::updatedTaskLineNumber(unsigned int id, int line) +void TaskWindow::updatedTaskLineNumber(const Task &task, int line) { - d->m_model->updateTaskLineNumber(id, line); + d->m_model->updateTaskLineNumber(task, line); emit tasksChanged(); } -void TaskWindow::showTask(unsigned int id) +void TaskWindow::showTask(const Task &task) { - int sourceRow = d->m_model->rowForId(id); + int sourceRow = d->m_model->rowForTask(task); QModelIndex sourceIdx = d->m_model->index(sourceRow, 0); QModelIndex filterIdx = d->m_filter->mapFromSource(sourceIdx); d->m_listview->setCurrentIndex(filterIdx); popup(Core::IOutputPane::ModeSwitch); } -void TaskWindow::openTask(unsigned int id) +void TaskWindow::openTask(const Task &task) { - int sourceRow = d->m_model->rowForId(id); + int sourceRow = d->m_model->rowForTask(task); QModelIndex sourceIdx = d->m_model->index(sourceRow, 0); QModelIndex filterIdx = d->m_filter->mapFromSource(sourceIdx); triggerDefaultHandler(filterIdx); @@ -583,7 +584,7 @@ void TaskWindow::triggerDefaultHandler(const QModelIndex &index) const Utils::FilePath userChoice = Utils::chooseFileFromList(task.fileCandidates); if (!userChoice.isEmpty()) { task.file = userChoice; - updatedTaskFileName(task.taskId, task.file.toString()); + updatedTaskFileName(task, task.file.toString()); } } diff --git a/src/plugins/projectexplorer/taskwindow.h b/src/plugins/projectexplorer/taskwindow.h index 69efe999662..e3287a92bd5 100644 --- a/src/plugins/projectexplorer/taskwindow.h +++ b/src/plugins/projectexplorer/taskwindow.h @@ -82,13 +82,13 @@ signals: private: void updateFilter() override; - void addCategory(Utils::Id categoryId, const QString &displayName, bool visible); + void addCategory(Utils::Id categoryId, const QString &displayName, bool visible, int priority); void addTask(const ProjectExplorer::Task &task); void removeTask(const ProjectExplorer::Task &task); - void updatedTaskFileName(unsigned int id, const QString &fileName); - void updatedTaskLineNumber(unsigned int id, int line); - void showTask(unsigned int id); - void openTask(unsigned int id); + void updatedTaskFileName(const Task &task, const QString &fileName); + void updatedTaskLineNumber(const Task &task, int line); + void showTask(const Task &task); + void openTask(const Task &task); void clearTasks(Utils::Id categoryId); void setCategoryVisibility(Utils::Id categoryId, bool visible); void currentChanged(const QModelIndex &index);