Skip to content

Commit a446c0b

Browse files
committed
1.finished json editor in highlighter
2.adjust project structure
1 parent b35297a commit a446c0b

17 files changed

+233
-22
lines changed

VisualLog.pro

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,24 @@ CONFIG += c++11
2727
SOURCES += \
2828
main.cpp \
2929
mainwindow.cpp \
30-
logviewer.cpp \
31-
finder.cpp \
32-
highlighter.cpp \
33-
logviewport.cpp \
34-
logfilter.cpp
30+
logviewer/logviewer.cpp \
31+
finder/finder.cpp \
32+
highlighter/highlighter.cpp \
33+
logviewer/logviewport.cpp \
34+
highlighter/logfilter.cpp \
35+
highlighter/jsonhighlighter.cpp \
36+
highlighter/jsontextedit.cpp
3537

3638
HEADERS += \
3739
mainwindow.h \
38-
logviewer.h \
39-
finder.h \
40-
highlighter.h \
41-
abstractlinefilter.h \
42-
logviewport.h \
43-
logfilter.h
40+
logviewer/logviewer.h \
41+
finder/finder.h \
42+
highlighter/highlighter.h \
43+
logviewer/abstractlinefilter.h \
44+
logviewer/logviewport.h \
45+
highlighter/logfilter.h \
46+
highlighter/jsonhighlighter.h \
47+
highlighter/jsontextedit.h
4448

4549
FORMS +=
4650

File renamed without changes.
File renamed without changes.
Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "highlighter.h"
22

33
Highlighter::Highlighter(QWidget *parent):
4-
QDockWidget(parent),
4+
QDockWidget("highlighter", parent),
55
mRootWidget(new QWidget(parent)),
66
mMainLayout(new QVBoxLayout()),
77
mToolLayout(new QHBoxLayout()),
@@ -10,7 +10,7 @@ Highlighter::Highlighter(QWidget *parent):
1010
mNewButton(new QToolButton(mRootWidget)),
1111
mDelButton(new QToolButton(mRootWidget)),
1212
mSaveButton(new QToolButton(mRootWidget)),
13-
mTextEdit(new QPlainTextEdit(mRootWidget)),
13+
mJsonEdit(new JsonTextEdit(mRootWidget)),
1414
mHighlightButton(new QToolButton(mRootWidget)),
1515
mFindPreButton(new QPushButton(mRootWidget)),
1616
mFindNxtButton(new QPushButton(mRootWidget))
@@ -41,12 +41,20 @@ void Highlighter::setupUi()
4141
mControlLayout->addWidget(mFindNxtButton);
4242

4343
mMainLayout->addItem(mToolLayout);
44-
mMainLayout->addWidget(mTextEdit);
44+
mMainLayout->addWidget(mJsonEdit);
4545
mMainLayout->addItem(mControlLayout);
4646

4747
// parent setting
4848
mRootWidget->setLayout(mMainLayout);
4949
setWidget(mRootWidget);
50+
51+
setTabWidth(4);
52+
}
53+
54+
void Highlighter::setTabWidth(int nspace)
55+
{
56+
QFontMetrics metrics(mJsonEdit->font());
57+
mJsonEdit->setTabStopDistance(nspace * metrics.width(' '));
5058
}
5159

5260
QSharedPointer<AbstractLineFilter> Highlighter::logHighlighter()

highlighter.h renamed to highlighter/highlighter.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@
1212
#include <QHBoxLayout>
1313
#include <QLayout>
1414
#include <QVBoxLayout>
15+
#include <QFontMetrics>
1516

16-
#include "abstractlinefilter.h"
17+
#include "../logviewer/abstractlinefilter.h"
1718
#include "logfilter.h"
19+
#include "jsonhighlighter.h"
20+
#include "jsontextedit.h"
1821

1922

2023
class Highlighter : public QDockWidget
@@ -25,7 +28,7 @@ class Highlighter : public QDockWidget
2528
explicit Highlighter(QWidget *parent = nullptr);
2629

2730
QSharedPointer<AbstractLineFilter> logHighlighter();
28-
31+
void setTabWidth(int nspace);
2932

3033
signals:
3134
void logHighlighterChanged();
@@ -44,13 +47,14 @@ class Highlighter : public QDockWidget
4447
QToolButton *mNewButton;
4548
QToolButton *mDelButton;
4649
QToolButton *mSaveButton;
47-
QPlainTextEdit *mTextEdit;
50+
JsonTextEdit *mJsonEdit;
4851
QToolButton *mHighlightButton;
4952
QPushButton *mFindPreButton;
5053
QPushButton *mFindNxtButton;
5154

5255
//others
53-
QSharedPointer<LogFilter> mFilter;
56+
QSharedPointer<LogFilter> mFilter;
57+
JsonHighlighter *mJsonHighlighter;
5458
};
5559

5660
#endif // HIGHLIGHTER_H

highlighter/jsonhighlighter.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include "jsonhighlighter.h"
2+
3+
JsonHighlighter::JsonHighlighter(QTextDocument *doc):
4+
QSyntaxHighlighter(doc)
5+
{
6+
initKeyWordsRules();
7+
initSpecialRules();
8+
}
9+
10+
void JsonHighlighter::initKeyWordsRules()
11+
{
12+
// init all the pattern
13+
mStringPattern = R"(".*")";
14+
mBoolPattern = R"(\b(true|false)\b)";
15+
mNumberPattern = R"(\b\d+\b)";
16+
mCommentPattern = R"(//.*)";
17+
18+
// init all the format
19+
mStringFormat.setForeground(QColor(0, 200, 0)); // green
20+
mStringFormat.setBackground(QColor(255, 255, 255));
21+
22+
mBoolFormat.setForeground(QColor(0, 0, 220)); // blue
23+
mBoolFormat.setBackground(QColor(255, 255, 255));
24+
25+
mNumberFormat.setForeground(QColor(0, 0, 200)); // blue
26+
mNumberFormat.setBackground(QColor(255, 255, 255));
27+
28+
mCommentFormat.setForeground(QColor(150, 150, 150)); // gray
29+
mCommentFormat.setBackground(QColor(255, 255, 255));
30+
31+
// gather all the rules
32+
mKeyWordsRules.append(Rule(mStringPattern, mStringFormat));
33+
mKeyWordsRules.append(Rule(mBoolPattern, mBoolFormat));
34+
mKeyWordsRules.append(Rule(mNumberPattern, mNumberFormat));
35+
mKeyWordsRules.append(Rule(mCommentPattern, mCommentFormat));
36+
}
37+
38+
void JsonHighlighter::initSpecialRules()
39+
{
40+
mColorPattern = QRegularExpression(QString(R"(\[\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\])"));
41+
}
42+
43+
void JsonHighlighter::highlightBlock(const QString &text)
44+
{
45+
// highlight key words
46+
foreach(const Rule &rule, mKeyWordsRules) {
47+
auto matchIterator = rule.pattern.globalMatch(text);
48+
while (matchIterator.hasNext()) {
49+
auto match = matchIterator.next();
50+
setFormat(match.capturedStart(), match.capturedLength(), rule.format);
51+
}
52+
}
53+
54+
// highlight color value
55+
auto matchIterator = mColorPattern.globalMatch(text);
56+
while (matchIterator.hasNext()) {
57+
auto match = matchIterator.next();
58+
int r = match.captured(1).toInt() % 256;
59+
int g = match.captured(2).toInt() % 256;
60+
int b = match.captured(3).toInt() % 256;
61+
QTextCharFormat fmt;
62+
fmt.setForeground(QColor(255-r, 255-g, 255-b));
63+
fmt.setBackground(QColor(r, g, b));
64+
setFormat(match.capturedStart(), match.capturedLength(), fmt);
65+
}
66+
}

highlighter/jsonhighlighter.h

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#ifndef JSONHIGHLIGHTER_H
2+
#define JSONHIGHLIGHTER_H
3+
4+
#include <QSyntaxHighlighter>
5+
#include <QTextDocument>
6+
#include <QTextCharFormat>
7+
#include <QVector>
8+
#include <QRegularExpression>
9+
#include <QRegularExpressionMatch>
10+
#include <QRegularExpressionMatchIterator>
11+
#include <QString>
12+
#include <QDebug>
13+
14+
15+
class JsonHighlighter : public QSyntaxHighlighter
16+
{
17+
public:
18+
struct Rule {
19+
public:
20+
Rule() {}
21+
22+
Rule(const QString &pattern, const QColor &forground, const QColor &background):
23+
pattern(pattern)
24+
{
25+
format.setForeground(forground);
26+
format.setBackground(background);
27+
}
28+
29+
Rule(const QString &pattern, const QTextCharFormat &format):
30+
pattern(pattern), format(format)
31+
{
32+
}
33+
34+
QRegularExpression pattern;
35+
QTextCharFormat format;
36+
};
37+
38+
JsonHighlighter(QTextDocument *doc);
39+
40+
protected:
41+
virtual void highlightBlock(const QString &text);
42+
43+
private:
44+
void initKeyWordsRules();
45+
void initSpecialRules();
46+
47+
private:
48+
QVector<Rule> mKeyWordsRules;
49+
50+
// common key words rules:
51+
QString mStringPattern;
52+
QString mBoolPattern;
53+
QString mNumberPattern;
54+
QString mCommentPattern;
55+
56+
QTextCharFormat mStringFormat;
57+
QTextCharFormat mBoolFormat;
58+
QTextCharFormat mNumberFormat;
59+
QTextCharFormat mCommentFormat;
60+
61+
// special rules:
62+
QRegularExpression mColorPattern;
63+
};
64+
65+
#endif // JSONHIGHLIGHTER_H

highlighter/jsontextedit.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include "jsontextedit.h"
2+
3+
JsonTextEdit::JsonTextEdit(QWidget *parent):
4+
QPlainTextEdit(parent)
5+
{
6+
new JsonHighlighter(document());
7+
mSpacePattern = QRegularExpression(R"(^\s*)");
8+
}
9+
10+
void JsonTextEdit::keyPressEvent(QKeyEvent *event)
11+
{
12+
QPlainTextEdit::keyPressEvent(event);
13+
14+
switch (event->key()) {
15+
case Qt::Key::Key_Return:
16+
autoInsertSpace();
17+
break;
18+
}
19+
}
20+
21+
void JsonTextEdit::autoInsertSpace()
22+
{
23+
int currentLineNumber = textCursor().blockNumber();
24+
25+
if (currentLineNumber > 0) {
26+
auto lastLineBlock = document()->findBlockByLineNumber(currentLineNumber - 1);
27+
auto match = mSpacePattern.match(lastLineBlock.text());
28+
if (match.hasMatch()) {
29+
insertPlainText(match.captured(0));
30+
}
31+
}
32+
}

highlighter/jsontextedit.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#ifndef JSONTEXTEDIT_H
2+
#define JSONTEXTEDIT_H
3+
4+
#include <QPlainTextEdit>
5+
#include <QWidget>
6+
#include <QDebug>
7+
#include <QKeyEvent>
8+
#include <QRegularExpression>
9+
#include <QRegularExpressionMatch>
10+
#include <QTextBlock>
11+
12+
#include "jsonhighlighter.h"
13+
14+
15+
class JsonTextEdit : public QPlainTextEdit
16+
{
17+
Q_OBJECT
18+
19+
public:
20+
JsonTextEdit(QWidget *parent);
21+
22+
protected:
23+
virtual void keyPressEvent(QKeyEvent *event);
24+
25+
private:
26+
void autoInsertSpace();
27+
28+
private:
29+
QRegularExpression mSpacePattern;
30+
};
31+
32+
#endif // JSONTEXTEDIT_H
File renamed without changes.

0 commit comments

Comments
 (0)