Skip to content

Commit 13376c5

Browse files
committed
feat: Change the background color of block numbers when squiggling
1 parent 7b7bf07 commit 13376c5

File tree

4 files changed

+60
-12
lines changed

4 files changed

+60
-12
lines changed

include/internal/QCodeEditor.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
// Qt
44
#include <QTextEdit> // Required for inheritance
55

6-
// Standard
7-
#include <set>
8-
96
class QCompleter;
107
class QLineNumberArea;
118
class QSyntaxStyle;
@@ -22,13 +19,14 @@ class QCodeEditor : public QTextEdit
2219
public:
2320
/**
2421
* @brief The SeverityLevel enum
22+
* @note the order should be: the bigger the more important
2523
*/
2624
enum class SeverityLevel
2725
{
28-
Error,
29-
Warning,
26+
Hint,
3027
Information,
31-
Hint
28+
Warning,
29+
Error
3230
};
3331

3432
/**
@@ -338,8 +336,10 @@ class QCodeEditor : public QTextEdit
338336
*/
339337
struct SquiggleInformation
340338
{
339+
SquiggleInformation() = default;
340+
341341
SquiggleInformation(QPair<int, int> start, QPair<int, int> stop, QString text)
342-
: m_startPos(start), m_stopPos(stop), m_tooltipText(std::move(text))
342+
: m_startPos(start), m_stopPos(stop), m_tooltipText(text)
343343
{
344344
}
345345

@@ -361,5 +361,5 @@ class QCodeEditor : public QTextEdit
361361

362362
QList<QTextEdit::ExtraSelection> extra1, extra2, extra_squiggles;
363363

364-
std::vector<SquiggleInformation> m_squiggler;
364+
QVector<SquiggleInformation> m_squiggler;
365365
};

include/internal/QLineNumberArea.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
// Qt
44
#include <QWidget> // Required for inheritance
55

6-
class QCodeEditor;
6+
#include <QCodeEditor>
7+
78
class QSyntaxStyle;
89

910
/**
@@ -42,11 +43,17 @@ class QLineNumberArea : public QWidget
4243
*/
4344
QSyntaxStyle *syntaxStyle() const;
4445

46+
void squiggle(QCodeEditor::SeverityLevel level, int from, int to);
47+
48+
void clearSquiggles();
49+
4550
protected:
4651
void paintEvent(QPaintEvent *event) override;
4752

4853
private:
4954
QSyntaxStyle *m_syntaxStyle;
5055

5156
QCodeEditor *m_codeEditParent;
57+
58+
QMap<int, QCodeEditor::SeverityLevel> m_squiggles;
5259
};

src/internal/QCodeEditor.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#include <utility>
2-
31
// QCodeEditor
42
#include <QCXXHighlighter>
53
#include <QCodeEditor>
@@ -927,6 +925,8 @@ void QCodeEditor::squiggle(SeverityLevel level, QPair<int, int> start, QPair<int
927925

928926
extra_squiggles.push_back({cursor, newcharfmt});
929927

928+
m_lineNumberArea->squiggle(level, start.first, stop.first);
929+
930930
setExtraSelections(extra1 + extra2 + extra_squiggles);
931931
}
932932

@@ -938,6 +938,8 @@ void QCodeEditor::clearSquiggle()
938938
m_squiggler.clear();
939939
extra_squiggles.clear();
940940

941+
m_lineNumberArea->clearSquiggles();
942+
941943
setExtraSelections(extra1 + extra2);
942944
}
943945

src/internal/QLineNumberArea.cpp

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include <QTextEdit>
1313

1414
QLineNumberArea::QLineNumberArea(QCodeEditor *parent)
15-
: QWidget(parent), m_syntaxStyle(nullptr), m_codeEditParent(parent)
15+
: QWidget(parent), m_syntaxStyle(nullptr), m_codeEditParent(parent), m_squiggles()
1616
{
1717
}
1818

@@ -51,6 +51,21 @@ QSyntaxStyle *QLineNumberArea::syntaxStyle() const
5151
return m_syntaxStyle;
5252
}
5353

54+
void QLineNumberArea::squiggle(QCodeEditor::SeverityLevel level, int from, int to)
55+
{
56+
for (int i = from - 1; i < to; ++i)
57+
{
58+
m_squiggles[i] = qMax(m_squiggles[i], level);
59+
}
60+
update();
61+
}
62+
63+
void QLineNumberArea::clearSquiggles()
64+
{
65+
m_squiggles.clear();
66+
update();
67+
}
68+
5469
void QLineNumberArea::paintEvent(QPaintEvent *event)
5570
{
5671
QPainter painter(this);
@@ -78,6 +93,30 @@ void QLineNumberArea::paintEvent(QPaintEvent *event)
7893
{
7994
QString number = QString::number(blockNumber + 1);
8095

96+
if (m_squiggles.contains(blockNumber))
97+
{
98+
QColor squiggleColor;
99+
switch (m_squiggles[blockNumber])
100+
{
101+
case QCodeEditor::SeverityLevel::Error:
102+
squiggleColor = m_syntaxStyle->getFormat("Error").underlineColor();
103+
break;
104+
case QCodeEditor::SeverityLevel::Warning:
105+
squiggleColor = m_syntaxStyle->getFormat("Warning").underlineColor();
106+
break;
107+
case QCodeEditor::SeverityLevel::Information:
108+
squiggleColor = m_syntaxStyle->getFormat("Warning").underlineColor();
109+
break;
110+
case QCodeEditor::SeverityLevel::Hint:
111+
squiggleColor = m_syntaxStyle->getFormat("Text").foreground().color();
112+
break;
113+
default:
114+
Q_UNREACHABLE();
115+
break;
116+
}
117+
painter.fillRect(0, top, sizeHint().width(), m_codeEditParent->fontMetrics().height(), squiggleColor);
118+
}
119+
81120
auto isCurrentLine = m_codeEditParent->textCursor().blockNumber() == blockNumber;
82121
painter.setPen(isCurrentLine ? currentLine : otherLines);
83122

0 commit comments

Comments
 (0)