Skip to content

Commit 865aa30

Browse files
committed
finished the interaction of highlighter
1 parent 6449b27 commit 865aa30

File tree

8 files changed

+223
-15
lines changed

8 files changed

+223
-15
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
VisualLog.pro.user*
2+
*.autosave

VisualLog.pro

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ HEADERS += \
4646
highlighter/logfilter.h \
4747
highlighter/jsonhighlighter.h \
4848
highlighter/jsontextedit.h \
49-
utils/logutil.h
49+
utils/logutil.h \
50+
utils/config.h
5051

5152
FORMS +=
5253

finder/finder.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ void Finder::onFindTriggered(bool backward)
4747
options.setFlag(QTextDocument::FindFlag::FindCaseSensitively, mCaseSenseBox->isChecked());
4848

4949
emit findTriggered(mExpressionEdit->text(), options, mRegModeBox->isChecked());
50-
5150
}
5251

5352

highlighter/highlighter.cpp

Lines changed: 177 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
Highlighter::Highlighter(QWidget *parent):
44
QDockWidget("highlighter", parent),
5+
TAG("Highlighter"),
56
mRootWidget(new QWidget(parent)),
67
mMainLayout(new QVBoxLayout()),
78
mToolLayout(new QHBoxLayout()),
@@ -13,31 +14,36 @@ Highlighter::Highlighter(QWidget *parent):
1314
mJsonEdit(new JsonTextEdit(mRootWidget)),
1415
mHighlightButton(new QToolButton(mRootWidget)),
1516
mFindPreButton(new QPushButton(mRootWidget)),
16-
mFindNxtButton(new QPushButton(mRootWidget))
17+
mFindNxtButton(new QPushButton(mRootWidget)),
18+
mFileSystemWatcher(new QFileSystemWatcher(this)),
19+
mEditorState(BROWSING)
1720
{
1821
setupUi();
1922
mFilter = QSharedPointer<LogFilter>(new LogFilter());
2023
connect(mJsonEdit, &JsonTextEdit::updated, this, &Highlighter::onJsonObjectUpdated);
24+
initDir();
25+
initFSWatcher();
26+
onRulesDirChanged();
2127
}
2228

2329
void Highlighter::setupUi()
2430
{
2531
// widget setting
26-
mRuleBox->setEditable(true);
2732
mNewButton->setText("+");
2833
mDelButton->setText("-");
2934
mSaveButton->setText("<<");
3035
mHighlightButton->setText("H");
3136
mFindPreButton->setText("find pre");
3237
mFindNxtButton->setText("find next");
38+
mRuleBox->setDuplicatesEnabled(false);
3339

3440
// layout setting
3541
mToolLayout->addWidget(mRuleBox);
3642
mToolLayout->addWidget(mNewButton);
3743
mToolLayout->addWidget(mDelButton);
3844
mToolLayout->addWidget(mSaveButton);
45+
mToolLayout->addWidget(mHighlightButton);
3946

40-
mControlLayout->addWidget(mHighlightButton);
4147
mControlLayout->addWidget(mFindPreButton);
4248
mControlLayout->addWidget(mFindNxtButton);
4349

@@ -50,6 +56,40 @@ void Highlighter::setupUi()
5056
setWidget(mRootWidget);
5157

5258
setTabWidth(4);
59+
60+
connect(mNewButton, &QToolButton::clicked, this, &Highlighter::onNewButtonClicked);
61+
connect(mDelButton, &QToolButton::clicked, this, &Highlighter::onDelButtonClicked);
62+
connect(mSaveButton, &QToolButton::clicked, this, &Highlighter::onSaveButtonClicked);
63+
connect(mRuleBox, &QComboBox::currentTextChanged, this, &Highlighter::onRuleSelectedChanged);
64+
connect(mRuleBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Highlighter::onRulesBoxIndexChanged);
65+
connect(mHighlightButton, &QToolButton::clicked, this, &Highlighter::onHighlightButtonClicked);
66+
}
67+
68+
void Highlighter::initDir()
69+
{
70+
QDir dir = QDir::home();
71+
72+
if (dir.cd(VLOG_CFG_HOME_NAME)) {
73+
if (!dir.exists(VLOG_CFG_HIGHLIGHTER_RULE_HOME)) {
74+
if (!dir.mkdir(VLOG_CFG_HIGHLIGHTER_RULE_HOME))
75+
LogUtil::e(TAG, "failed to mkdir for rules");
76+
}
77+
if (!dir.cd(VLOG_CFG_HIGHLIGHTER_RULE_HOME))
78+
LogUtil::e(TAG, "failed to cd to rules");
79+
} else {
80+
LogUtil::e(TAG, "failed to cd to home");
81+
}
82+
83+
mRulesDir = dir;
84+
}
85+
86+
void Highlighter::initFSWatcher()
87+
{
88+
LogUtil::i(TAG, "initFSWatcher: dir:"+mRulesDir.path());
89+
90+
mFileSystemWatcher->addPath(mRulesDir.path());
91+
connect(mFileSystemWatcher, &QFileSystemWatcher::directoryChanged,
92+
this, &Highlighter::onRulesDirChanged);
5393
}
5494

5595
void Highlighter::setTabWidth(int nspace)
@@ -66,7 +106,7 @@ QSharedPointer<AbstractLineFilter> Highlighter::logHighlighter()
66106
void Highlighter::onJsonObjectUpdated(const QJsonObject &jsonObject)
67107
{
68108
mFilter->clearRule();
69-
qDebug()<<"jsonUpdate";
109+
70110
// traverse every rules
71111
foreach (const QString &ruleName, jsonObject.keys()) {
72112
QJsonValue value = jsonObject.value(ruleName);
@@ -141,3 +181,136 @@ bool Highlighter::isDoubleJsonArray(const QJsonArray &jsonArray)
141181
}
142182
return true;
143183
}
184+
185+
void Highlighter::onRulesDirChanged()
186+
{
187+
LogUtil::i(TAG, QString("onRulesDirChanged.mEditorState=%1").arg(mEditorState));
188+
189+
switch (mEditorState) {
190+
case EditorState::EDITING:
191+
break;
192+
case EditorState::BROWSING:
193+
LogUtil::i(TAG, QString("clear rule item"));
194+
mRuleBox->clear();
195+
foreach (QDir dir, mRulesDir.entryList(QDir::Filter::Files, QDir::SortFlag::Name)) {
196+
LogUtil::i(TAG, QString("add rule item:%1").arg(dir.dirName()));
197+
mRuleBox->addItem(dir.dirName());
198+
}
199+
break;
200+
}
201+
}
202+
203+
void Highlighter::onNewButtonClicked()
204+
{
205+
LogUtil::i(TAG, QString("onNewButtonClicked.mEditorState=%1").arg(mEditorState));
206+
207+
switch (mEditorState) {
208+
case EditorState::EDITING:
209+
break;
210+
case EditorState::BROWSING:
211+
mEditorState = EditorState::EDITING;
212+
mRuleBox->setEditable(true);
213+
mRuleBox->update();
214+
mRuleBox->setEditText("NewRule");
215+
mJsonEdit->clear();
216+
break;
217+
}
218+
}
219+
220+
void Highlighter::onDelButtonClicked()
221+
{
222+
LogUtil::i(TAG, QString("onDelButtonClicked.mEditorState=%1").arg(mEditorState));
223+
224+
switch (mEditorState) {
225+
case EditorState::EDITING:
226+
mEditorState = EditorState::BROWSING;
227+
mJsonEdit->clear();
228+
mRuleBox->removeItem(mRuleBox->currentIndex());
229+
mRuleBox->setEditable(false);
230+
mRuleBox->update();
231+
break;
232+
case EditorState::BROWSING:
233+
if (!mRuleBox->currentText().isNull() && !mRulesDir.remove(mRuleBox->currentText()))
234+
LogUtil::e(TAG, QString("failed to remove rule file:%1").arg(mRuleBox->currentText()));
235+
break;
236+
}
237+
}
238+
239+
void Highlighter::onSaveButtonClicked()
240+
{
241+
LogUtil::i(TAG, QString("onSaveButtonClicked.mEditorState=%1").arg(mEditorState));
242+
243+
switch (mEditorState) {
244+
case EditorState::BROWSING:
245+
saveAsRuleFile(mRuleBox->currentText(), mJsonEdit->document()->toRawText());
246+
break;
247+
case EditorState::EDITING:
248+
if (!mRulesDir.exists(mRuleBox->currentText())) {
249+
mEditorState = EditorState::BROWSING;
250+
saveAsRuleFile(mRuleBox->currentText(), mJsonEdit->document()->toRawText());
251+
mRuleBox->setEditable(false);
252+
mRuleBox->update();
253+
} else {
254+
LogUtil::i(TAG, "reduplicative file name");
255+
QMessageBox::warning(this, "error", "reduplicative file name");
256+
}
257+
break;
258+
}
259+
}
260+
261+
void Highlighter::onRuleSelectedChanged(const QString &rule)
262+
{
263+
LogUtil::i(TAG, QString("onRuleSelectedChanged.mEditorState=%1").arg(mEditorState));
264+
265+
if (rule.isNull() || rule == "") return;
266+
267+
switch (mEditorState) {
268+
case EditorState::BROWSING:
269+
loadRuleFile(mRuleBox->currentText());
270+
break;
271+
case EditorState::EDITING:
272+
break;
273+
}
274+
}
275+
276+
void Highlighter::loadRuleFile(const QString &fileName)
277+
{
278+
LogUtil::i(TAG, QString("loadRuleFile.fileName=%1").arg(fileName));
279+
280+
if (fileName.isNull() || fileName == "") return;
281+
282+
QFile ruleFile(mRulesDir.absoluteFilePath(fileName));
283+
284+
ruleFile.open(QIODevice::OpenModeFlag::ReadOnly); {
285+
mJsonEdit->clear();
286+
mJsonEdit->insertPlainText(ruleFile.readAll());
287+
} ruleFile.close();
288+
}
289+
290+
void Highlighter::onRulesBoxIndexChanged(int index)
291+
{
292+
(void)index;
293+
294+
switch (mEditorState) {
295+
case EditorState::BROWSING:
296+
break;
297+
case EditorState::EDITING:
298+
mEditorState = EditorState::BROWSING;
299+
mJsonEdit->clear();
300+
mRuleBox->setEditable(false);
301+
break;
302+
}
303+
}
304+
305+
void Highlighter::saveAsRuleFile(const QString &fileName, const QString &content)
306+
{
307+
QFile ruleFile(mRulesDir.absoluteFilePath(fileName));
308+
ruleFile.open(QIODevice::OpenModeFlag::WriteOnly);
309+
ruleFile.write(content.toUtf8());
310+
ruleFile.close();
311+
}
312+
313+
void Highlighter::onHighlightButtonClicked()
314+
{
315+
LogUtil::i(TAG, "onHighlightButtonClicked");
316+
}

highlighter/highlighter.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,31 @@
2020
#include <QString>
2121
#include <QRegularExpression>
2222
#include <QColor>
23+
#include <QFileSystemWatcher>
24+
#include <QDir>
25+
#include <QFile>
26+
#include <QMessageBox>
27+
#include <QShortcut>
28+
#include <QKeySequence>
2329

2430
#include "../logviewer/abstractlinefilter.h"
2531
#include "logfilter.h"
2632
#include "jsonhighlighter.h"
2733
#include "jsontextedit.h"
34+
#include "utils/config.h"
35+
#include "utils/logutil.h"
2836

2937

3038
class Highlighter : public QDockWidget
3139
{
3240
Q_OBJECT
3341

3442
public:
43+
enum EditorState {
44+
BROWSING = 0,
45+
EDITING
46+
};
47+
3548
explicit Highlighter(QWidget *parent = nullptr);
3649

3750
QSharedPointer<AbstractLineFilter> logHighlighter();
@@ -42,14 +55,26 @@ class Highlighter : public QDockWidget
4255

4356
private slots:
4457
void onJsonObjectUpdated(const QJsonObject &jsonObject);
58+
void onRulesDirChanged();
59+
void onNewButtonClicked();
60+
void onDelButtonClicked();
61+
void onSaveButtonClicked();
62+
void onRuleSelectedChanged(const QString &rule);
63+
void onRulesBoxIndexChanged(int index);
64+
void onHighlightButtonClicked();
4565

4666
private:
4767
void setupUi();
68+
void initDir();
69+
void initFSWatcher();
4870
void updateFilterRule(LogFilter::Rule *filterRule,
4971
const QString &propName, const QJsonValue &propValue);
5072
bool isDoubleJsonArray(const QJsonArray &jsonArray);
73+
void loadRuleFile(const QString &fileName);
74+
void saveAsRuleFile(const QString &fileName, const QString &content);
5175

5276
private:
77+
const QString TAG;
5378
// ui
5479
QWidget *mRootWidget;
5580
QLayout *mMainLayout;
@@ -68,6 +93,9 @@ private slots:
6893
//others
6994
QSharedPointer<LogFilter> mFilter;
7095
JsonHighlighter *mJsonHighlighter;
96+
QFileSystemWatcher *mFileSystemWatcher;
97+
QDir mRulesDir;
98+
EditorState mEditorState;
7199
};
72100

73101
#endif // HIGHLIGHTER_H

highlighter/logfilter.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@ LogFilter::LogFilter():
88

99
void LogFilter::addRule(const Rule &rule)
1010
{
11-
qDebug()<<"addRule";
1211
mRules.append(rule);
1312
}
1413

1514
void LogFilter::clearRule()
1615
{
17-
qDebug()<<"clearRule";
1816
mRules.clear();
1917
}
2018

@@ -37,6 +35,5 @@ void LogFilter::onNextLine(const QString &line)
3735

3836
void LogFilter::setDefaultRule(const Rule &rule)
3937
{
40-
qDebug()<<"setDefaultRule";
4138
mDefaultRule = rule;
4239
}

main.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
#include "mainwindow.h"
21
#include <QApplication>
32
#include <QDir>
43
#include <QString>
5-
#include <utils/logutil.h>
4+
5+
#include "mainwindow.h"
6+
#include "utils/logutil.h"
7+
#include "utils/config.h"
68

79
const QString TAG = "main";
810

@@ -12,11 +14,11 @@ void checkHomePath()
1214
LogUtil::i(TAG, "init working directory");
1315
QDir wd = QDir::home();
1416

15-
if (!wd.exists(".VisualLog")) {
16-
if (wd.mkdir(".VisualLog"))
17-
wd.cd(".VisualLog");
17+
if (!wd.exists(VLOG_CFG_HOME_NAME)) {
18+
if (wd.mkdir(VLOG_CFG_HOME_NAME))
19+
wd.cd(VLOG_CFG_HOME_NAME);
1820
} else {
19-
wd.cd(".VisualLog");
21+
wd.cd(VLOG_CFG_HOME_NAME);
2022
}
2123

2224
if (QDir::setCurrent(wd.path())) {

utils/config.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#ifndef CONFIG_H
2+
#define CONFIG_H
3+
4+
#define VLOG_CFG_HOME_NAME ".VisualLog"
5+
#define VLOG_CFG_HIGHLIGHTER_RULE_HOME "HighlighterRules"
6+
7+
#endif // CONFIG_H

0 commit comments

Comments
 (0)