1/*
2 * Copyright (C) 2020-2022 Roy Qu (royqh1979@gmail.com)
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17#include "issuestable.h"
18#include "../utils.h"
19#include <QHeaderView>
20#include "../settings.h"
21#include "../mainwindow.h"
22#include "../editor.h"
23#include "../editorlist.h"
24
25
26IssuesTable::IssuesTable(QWidget *parent):
27 QTableView(parent)
28{
29 mModel = new IssuesModel(this);
30 this->setModel(mModel);
31 this->setColumnWidth(0,200);
32 this->setColumnWidth(1,45);
33 this->setColumnWidth(2,45);
34}
35
36const QVector<PCompileIssue> &IssuesTable::issues() const
37{
38 return mModel->issues();
39}
40
41IssuesModel *IssuesTable::issuesModel()
42{
43 return mModel;
44}
45
46void IssuesTable::setErrorColor(QColor color)
47{
48 mModel->setErrorColor(color);
49}
50
51void IssuesTable::setWarningColor(QColor color)
52{
53 mModel->setWarningColor(color);
54}
55
56QString IssuesTable::toHtml()
57{
58 QString result;
59 result.append(
60 QString("<table><thead><th>%1</th><th>%2</th><th>%3</th><th>%4</th></thead>")
61 .arg(tr("Filename"))
62 .arg(tr("Line"))
63 .arg(tr("Col"))
64 .arg(tr("Description")));
65 foreach (const PCompileIssue& issue, mModel->issues()) {
66 result.append(QString("<tr><td>%1</td><td>%2</td><td>%3</td><td>%4</td></tr>\n")
67 .arg(issue->filename)
68 .arg(issue->line)
69 .arg(issue->column)
70 .arg(issue->description));
71 }
72 result.append(QString("</table>"));
73 return result;
74}
75
76QString IssuesTable::toTxt()
77{
78 QString result;
79 foreach (const PCompileIssue& issue, mModel->issues()) {
80 result.append(QString("%1\t%2\t%3\t%4\n")
81 .arg(issue->filename)
82 .arg(issue->line)
83 .arg(issue->column)
84 .arg(issue->description));
85 }
86 return result;
87}
88
89IssuesModel::IssuesModel(QObject *parent):
90 QAbstractTableModel(parent)
91{
92
93}
94
95void IssuesModel::addIssue(PCompileIssue issue)
96{
97 beginInsertRows(QModelIndex(),mIssues.size(),mIssues.size());
98 mIssues.push_back(issue);
99 endInsertRows();
100}
101
102void IssuesModel::clearIssues()
103{
104 QSet<QString> issueFiles;
105 foreach(const PCompileIssue& issue, mIssues) {
106 if (!(issue->filename.isEmpty())){
107 issueFiles.insert(issue->filename);
108 }
109 }
110 foreach (const QString& filename, issueFiles) {
111 Editor *e=pMainWindow->editorList()->getOpenedEditorByFilename(filename);
112 if (e)
113 e->clearSyntaxIssues();
114 }
115 if (mIssues.size()>0) {
116 beginResetModel();
117 mIssues.clear();
118 endResetModel();
119 }
120}
121
122void IssuesModel::setErrorColor(QColor color)
123{
124 mErrorColor = color;
125}
126
127void IssuesModel::setWarningColor(QColor color)
128{
129 mWarningColor = color;
130}
131
132PCompileIssue IssuesModel::issue(int row)
133{
134 if (row<0 || row>=static_cast<int>(mIssues.size())) {
135 return PCompileIssue();
136 }
137
138 return mIssues[row];
139}
140
141const QVector<PCompileIssue> &IssuesModel::issues() const
142{
143 return mIssues;
144}
145
146int IssuesModel::count()
147{
148 return mIssues.size();
149}
150
151void IssuesTable::addIssue(PCompileIssue issue)
152{
153 mModel->addIssue(issue);
154}
155
156PCompileIssue IssuesTable::issue(const QModelIndex &index)
157{
158 if (!index.isValid())
159 return PCompileIssue();
160 return issue(index.row());
161}
162
163PCompileIssue IssuesTable::issue(const int row)
164{
165 return mModel->issue(row);
166}
167
168int IssuesTable::count()
169{
170 return mModel->count();
171}
172
173void IssuesTable::clearIssues()
174{
175 mModel->clearIssues();
176}
177
178int IssuesModel::rowCount(const QModelIndex &) const
179{
180 return mIssues.size();
181}
182
183int IssuesModel::columnCount(const QModelIndex &) const
184{
185 return 4;
186}
187
188QVariant IssuesModel::data(const QModelIndex &index, int role) const
189{
190 if (!index.isValid())
191 return QVariant();
192 if (index.row()<0 || index.row() >= static_cast<int>(mIssues.size()))
193 return QVariant();
194 PCompileIssue issue = mIssues[index.row()];
195 if (!issue)
196 return QVariant();
197 switch (role) {
198 case Qt::DisplayRole:
199 case Qt::ToolTipRole:
200 switch (index.column()) {
201 case 0: {
202 if (role == Qt::DisplayRole)
203 return extractFileName(issue->filename);
204 else
205 return issue->filename;
206 }
207 case 1:
208 if (issue->line>0)
209 return issue->line;
210 else
211 return "";
212 case 2:
213 if (issue->column>0)
214 return issue->column;
215 else
216 return "";
217 case 3:
218 return issue->description;
219 default:
220 return QVariant();
221 }
222 case Qt::ForegroundRole:
223 switch(issue->type) {
224 case CompileIssueType::Error:
225 return mErrorColor;
226 case CompileIssueType::Warning:
227 return mWarningColor;
228 default:
229 return QVariant();
230 }
231 case Qt::FontRole: {
232 QFont newFont=((IssuesTable *)parent())->font();
233 switch(issue->type) {
234 case CompileIssueType::Error:
235 case CompileIssueType::Warning:
236 {
237 newFont.setBold(true);
238 break;
239 }
240 default:
241 newFont.setBold(issue->line == 0);
242 }
243 return newFont;
244 }
245 default:
246 return QVariant();
247 }
248}
249
250QVariant IssuesModel::headerData(int section, Qt::Orientation orientation, int role) const
251{
252 if (orientation == Qt::Horizontal ) {
253 switch(role) {
254 case Qt::DisplayRole:
255 switch(section) {
256 case 0:
257 return tr("Filename");
258 case 1:
259 return tr("Line");
260 case 2:
261 return tr("Col");
262 case 3:
263 return tr("Description");
264 }
265 break;
266 }
267 }
268 return QVariant();
269}
270