22
33Highlighter::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
2329void 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
5595void Highlighter::setTabWidth (int nspace)
@@ -66,7 +106,7 @@ QSharedPointer<AbstractLineFilter> Highlighter::logHighlighter()
66106void 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+ }
0 commit comments