#ifndef CODEEDITOR_H #define CODEEDITOR_H #include #include #include #include class QPaintEvent; class QResizeEvent; class QSize; class QWidget; class LineNumberArea; class Highlighter : public QSyntaxHighlighter { Q_OBJECT public: explicit Highlighter(QTextDocument *parent); void setSymbols(const QStringList &symbols); protected: void highlightBlock(const QString &text) override; private: struct HighlightingRule { QRegularExpression pattern; QTextCharFormat format; }; QVector highlightingRules; QVector highlightingRulesWithSymbols; QRegularExpression commentStartExpression; QRegularExpression commentEndExpression; QTextCharFormat keywordFormat; QTextCharFormat classFormat; QTextCharFormat singleLineCommentFormat; QTextCharFormat multiLineCommentFormat; QTextCharFormat quotationFormat; QTextCharFormat symbolFormat; }; class CodeEditor : public QPlainTextEdit { Q_OBJECT public: explicit CodeEditor(QWidget *parent); CodeEditor(const CodeEditor &) = delete; CodeEditor &operator=(const CodeEditor &) = delete; void lineNumberAreaPaintEvent(QPaintEvent *event); int lineNumberAreaWidth(); void setError(const QString &code, int errorLine, const QStringList &symbols); protected: void resizeEvent(QResizeEvent *event) override; private slots: void updateLineNumberAreaWidth(int newBlockCount); void highlightErrorLine(); void updateLineNumberArea(const QRect &, int); private: QWidget *lineNumberArea; Highlighter *highlighter; int mErrorPosition; }; class LineNumberArea : public QWidget { public: explicit LineNumberArea(CodeEditor *editor) : QWidget(editor) { codeEditor = editor; } QSize sizeHint() const override { return QSize(codeEditor->lineNumberAreaWidth(), 0); } protected: void paintEvent(QPaintEvent *event) override { codeEditor->lineNumberAreaPaintEvent(event); } private: CodeEditor *codeEditor; }; #endif // CODEEDITOR_H