ProjectExplorer: Give build-related errors higher priority

... in the issues pane.

Fixes: QTCREATORBUG-23655
Change-Id: Id9dc2c3781d69e0d70b12bb9fe39ced85b3f2084
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2021-11-08 15:30:09 +01:00
parent 3fd1122759
commit 1dfc996652
7 changed files with 89 additions and 62 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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();

View File

@@ -35,6 +35,9 @@
#include <QFontMetrics>
#include <algorithm>
#include <functional>
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);

View File

@@ -52,14 +52,14 @@ public:
QList<Utils::Id> 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;

View File

@@ -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<Utils::Id> 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());
}
}

View File

@@ -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);