2012-10-02 09:12:39 +02:00
|
|
|
/****************************************************************************
|
2011-09-20 09:42:10 +00:00
|
|
|
**
|
2016-01-15 14:57:40 +01:00
|
|
|
** Copyright (C) 2016 The Qt Company Ltd.
|
|
|
|
|
** Contact: https://www.qt.io/licensing/
|
2011-09-20 09:42:10 +00:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** This file is part of Qt Creator.
|
2011-09-20 09:42:10 +00:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** Commercial License Usage
|
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
2016-01-15 14:57:40 +01:00
|
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
|
|
|
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
|
|
|
** information use the contact form at https://www.qt.io/contact-us.
|
2011-09-20 09:42:10 +00:00
|
|
|
**
|
2016-01-15 14:57:40 +01:00
|
|
|
** GNU General Public License Usage
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
|
** General Public License version 3 as published by the Free Software
|
|
|
|
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
|
|
|
|
** included in the packaging of this file. Please review the following
|
|
|
|
|
** information to ensure the GNU General Public License requirements will
|
|
|
|
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
2011-09-20 09:42:10 +00:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
****************************************************************************/
|
2011-09-20 09:42:10 +00:00
|
|
|
|
2016-02-02 18:26:51 +01:00
|
|
|
#pragma once
|
2013-03-12 12:13:07 +01:00
|
|
|
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QAbstractItemModel>
|
2011-09-20 09:42:10 +00:00
|
|
|
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QIcon>
|
2011-09-20 09:42:10 +00:00
|
|
|
|
|
|
|
|
#include "task.h"
|
|
|
|
|
|
|
|
|
|
namespace ProjectExplorer {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
|
|
|
|
class TaskModel : public QAbstractItemModel
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
// Model stuff
|
2016-02-02 18:26:51 +01:00
|
|
|
explicit TaskModel(QObject *parent);
|
2011-09-20 09:42:10 +00:00
|
|
|
|
2016-02-02 18:26:51 +01:00
|
|
|
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
|
|
|
|
|
QModelIndex parent(const QModelIndex &child) const override;
|
|
|
|
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
|
|
|
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
|
|
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
2011-09-20 09:42:10 +00:00
|
|
|
Task task(const QModelIndex &index) const;
|
|
|
|
|
|
2012-01-26 13:38:25 +01:00
|
|
|
QList<Core::Id> categoryIds() const;
|
2014-07-01 11:08:26 +02:00
|
|
|
QString categoryDisplayName(Core::Id categoryId) const;
|
|
|
|
|
void addCategory(Core::Id categoryId, const QString &categoryName);
|
2011-09-20 09:42:10 +00:00
|
|
|
|
2014-07-01 11:08:26 +02:00
|
|
|
QList<Task> tasks(Core::Id categoryId = Core::Id()) const;
|
2019-02-25 14:21:42 +01:00
|
|
|
void addTask(const Task &t);
|
|
|
|
|
void removeTask(unsigned int id);
|
2014-07-01 11:08:26 +02:00
|
|
|
void clearTasks(Core::Id categoryId = Core::Id());
|
2012-03-12 16:56:25 +01:00
|
|
|
void updateTaskFileName(unsigned int id, const QString &fileName);
|
2012-02-03 16:07:13 +01:00
|
|
|
void updateTaskLineNumber(unsigned int id, int line);
|
2011-09-20 09:42:10 +00:00
|
|
|
|
|
|
|
|
int sizeOfFile(const QFont &font);
|
|
|
|
|
int sizeOfLineNumber(const QFont &font);
|
|
|
|
|
void setFileNotFound(const QModelIndex &index, bool b);
|
|
|
|
|
|
2012-02-03 16:07:13 +01:00
|
|
|
enum Roles { File = Qt::UserRole, Line, MovedLine, Description, FileNotFound, Type, Category, Icon, Task_t };
|
2011-09-20 09:42:10 +00:00
|
|
|
|
2014-07-01 11:08:26 +02:00
|
|
|
int taskCount(Core::Id categoryId);
|
|
|
|
|
int errorTaskCount(Core::Id categoryId);
|
|
|
|
|
int warningTaskCount(Core::Id categoryId);
|
|
|
|
|
int unknownTaskCount(Core::Id categoryId);
|
2011-09-20 09:42:10 +00:00
|
|
|
|
|
|
|
|
bool hasFile(const QModelIndex &index) const;
|
|
|
|
|
|
2012-02-29 16:15:25 +01:00
|
|
|
int rowForId(unsigned int id);
|
2011-09-20 09:42:10 +00:00
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
class CategoryData
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
void addTask(const Task &task)
|
|
|
|
|
{
|
|
|
|
|
++count;
|
|
|
|
|
if (task.type == Task::Warning)
|
|
|
|
|
++warnings;
|
|
|
|
|
else if (task.type == Task::Error)
|
|
|
|
|
++errors;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void removeTask(const Task &task)
|
|
|
|
|
{
|
|
|
|
|
--count;
|
|
|
|
|
if (task.type == Task::Warning)
|
|
|
|
|
--warnings;
|
|
|
|
|
else if (task.type == Task::Error)
|
|
|
|
|
--errors;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void clear() {
|
|
|
|
|
count = 0;
|
|
|
|
|
warnings = 0;
|
|
|
|
|
errors = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString displayName;
|
2016-04-13 15:52:14 +02:00
|
|
|
int count = 0;
|
|
|
|
|
int warnings = 0;
|
|
|
|
|
int errors = 0;
|
2011-09-20 09:42:10 +00:00
|
|
|
};
|
|
|
|
|
|
2012-01-26 13:38:25 +01:00
|
|
|
QHash<Core::Id,CategoryData> m_categories; // category id to data
|
2012-02-22 14:13:53 +01:00
|
|
|
QList<Task> m_tasks; // all tasks (in order of id)
|
2011-09-20 09:42:10 +00:00
|
|
|
|
|
|
|
|
QHash<QString,bool> m_fileNotFound;
|
|
|
|
|
QFont m_fileMeasurementFont;
|
|
|
|
|
QFont m_lineMeasurementFont;
|
2016-04-15 15:00:22 +02:00
|
|
|
int m_maxSizeOfFileName = 0;
|
|
|
|
|
int m_lastMaxSizeIndex = 0;
|
|
|
|
|
int m_sizeOfLineNumber = 0;
|
2011-09-20 09:42:10 +00:00
|
|
|
};
|
|
|
|
|
|
2012-02-22 11:40:25 +01:00
|
|
|
class TaskFilterModel : public QAbstractItemModel
|
2011-09-20 09:42:10 +00:00
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
2016-04-13 15:52:14 +02:00
|
|
|
TaskFilterModel(TaskModel *sourceModel, QObject *parent = nullptr);
|
2011-09-20 09:42:10 +00:00
|
|
|
|
|
|
|
|
TaskModel *taskModel() { return m_sourceModel; }
|
|
|
|
|
|
2016-02-02 18:26:51 +01:00
|
|
|
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
|
|
|
|
|
QModelIndex parent(const QModelIndex &child) const override;
|
|
|
|
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
|
|
|
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
|
|
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
2011-09-20 09:42:10 +00:00
|
|
|
|
|
|
|
|
bool filterIncludesUnknowns() const { return m_includeUnknowns; }
|
|
|
|
|
void setFilterIncludesUnknowns(bool b) { m_includeUnknowns = b; invalidateFilter(); }
|
|
|
|
|
|
|
|
|
|
bool filterIncludesWarnings() const { return m_includeWarnings; }
|
|
|
|
|
void setFilterIncludesWarnings(bool b) { m_includeWarnings = b; invalidateFilter(); }
|
|
|
|
|
|
|
|
|
|
bool filterIncludesErrors() const { return m_includeErrors; }
|
|
|
|
|
void setFilterIncludesErrors(bool b) { m_includeErrors = b; invalidateFilter(); }
|
|
|
|
|
|
2012-01-26 13:38:25 +01:00
|
|
|
QList<Core::Id> filteredCategories() const { return m_categoryIds; }
|
|
|
|
|
void setFilteredCategories(const QList<Core::Id> &categoryIds) { m_categoryIds = categoryIds; invalidateFilter(); }
|
2011-09-20 09:42:10 +00:00
|
|
|
|
|
|
|
|
Task task(const QModelIndex &index) const
|
|
|
|
|
{ return m_sourceModel->task(mapToSource(index)); }
|
|
|
|
|
|
|
|
|
|
bool hasFile(const QModelIndex &index) const
|
|
|
|
|
{ return m_sourceModel->hasFile(mapToSource(index)); }
|
|
|
|
|
|
2012-02-29 16:15:25 +01:00
|
|
|
QModelIndex mapFromSource(const QModelIndex &idx) const;
|
2016-02-02 18:26:51 +01:00
|
|
|
|
2016-01-29 16:38:37 +02:00
|
|
|
private:
|
2011-09-20 09:42:10 +00:00
|
|
|
void handleNewRows(const QModelIndex &index, int first, int last);
|
2012-10-05 14:32:40 +02:00
|
|
|
void handleRowsAboutToBeRemoved(const QModelIndex &index, int first, int last);
|
2014-05-05 17:15:20 +03:00
|
|
|
void handleDataChanged(const QModelIndex &top, const QModelIndex &bottom);
|
2011-09-20 09:42:10 +00:00
|
|
|
|
|
|
|
|
QModelIndex mapToSource(const QModelIndex &index) const;
|
|
|
|
|
void invalidateFilter();
|
|
|
|
|
void updateMapping() const;
|
|
|
|
|
bool filterAcceptsTask(const Task &task) const;
|
|
|
|
|
|
2018-07-09 09:52:09 +02:00
|
|
|
bool m_beginRemoveRowsSent = false;
|
2011-09-20 09:42:10 +00:00
|
|
|
bool m_includeUnknowns;
|
|
|
|
|
bool m_includeWarnings;
|
|
|
|
|
bool m_includeErrors;
|
2012-01-26 13:38:25 +01:00
|
|
|
QList<Core::Id> m_categoryIds;
|
2011-09-20 09:42:10 +00:00
|
|
|
|
|
|
|
|
mutable QList<int> m_mapping;
|
|
|
|
|
|
|
|
|
|
TaskModel *m_sourceModel;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace ProjectExplorer
|