From 9ba018b8688278c14fece78df1a06720d39b0cb4 Mon Sep 17 00:00:00 2001 From: Ivan Pelipenko Date: Fri, 22 Jan 2021 11:51:40 +0300 Subject: [PATCH] LogView patch - addText with force category, color now background --- CMakeLists.txt | 2 +- libs/application/logview.cpp | 47 ++++++++++++++++++++++++++++++------ libs/application/logview.h | 6 +++-- libs/piqt/piqt.cpp | 1 + 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 85c98d3..ed68802 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_policy(SET CMP0017 NEW) # need include() with .cmake project(qad) set(qad_MAJOR 1) set(qad_MINOR 14) -set(qad_REVISION 3) +set(qad_REVISION 4) set(qad_SUFFIX ) set(qad_COMPANY SHS) set(qad_DOMAIN org.SHS) diff --git a/libs/application/logview.cpp b/libs/application/logview.cpp index 9fbb34a..fff32d8 100644 --- a/libs/application/logview.cpp +++ b/libs/application/logview.cpp @@ -9,6 +9,16 @@ #include #include #include +#include + + +class TextBlockData: public QTextBlockUserData { +public: + TextBlockData(const QString & kw): keyword(kw) {} + QString keyword; +}; + + LogView::Category::Category() { @@ -48,6 +58,7 @@ LogView::LogView(QWidget * parent): QWidget(parent) { setLinesLimit(10000); QTextCursor tc(ui->textEdit->document()); def_cf = tc.charFormat(); + def_bf = tc.blockFormat(); } @@ -65,6 +76,7 @@ void LogView::setLogFont(QFont f) { ui->textEdit->document()->setDefaultFont(f); QTextCursor tc(ui->textEdit->document()); def_cf = tc.charFormat(); + def_bf = tc.blockFormat(); } @@ -154,6 +166,11 @@ void LogView::clearCategories() { void LogView::addText(const QString & text, bool insert_newline) { + addText(text, QString(), insert_newline); +} + + +void LogView::addText(const QString & text, const QString & keyword, bool insert_newline) { if (text.isEmpty()) return; QTextCursor tc(ui->textEdit->document()); QStringList sl = text.split("\n"); @@ -162,8 +179,10 @@ void LogView::addText(const QString & text, bool insert_newline) { bool at_end = (bar->value() == bar->maximum()) || bar->isHidden(); for (int i = 0; i < sl.size(); ++i) { tc.insertText(sl[i]); + if (!keyword.isEmpty()) + tc.block().setUserData(new TextBlockData(keyword)); if ((i < sl.size() - 1) || insert_newline) - newLine(); + newLine(keyword); } if (at_end) scrollToBottom(); @@ -191,19 +210,24 @@ void LogView::changeEvent(QEvent * e) { } -void LogView::newLine() { +void LogView::newLine(const QString & keyword) { QTextCursor tc(ui->textEdit->document()); tc.movePosition(QTextCursor::End); tc.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor); QString line = tc.selectedText(); QImage icon; foreach (const Category & c, categories) { - if (line.contains(c.regexp)) { - QTextCharFormat cf = def_cf; - cf.setForeground(c.color); + bool matched = false; + if (keyword.isEmpty()) matched = line.contains(c.regexp); + else matched = (keyword == c.regexp.pattern()); + if (matched) { + QTextCharFormat cf = def_cf; + QTextBlockFormat bf = def_bf; + bf.setBackground(c.color); if (c.bold) cf.setFontWeight(QFont::Bold); tc.setCharFormat(cf); + tc.setBlockFormat(bf); icon = c.icon_image; break; } @@ -222,8 +246,9 @@ void LogView::newLine() { if (isFilterVisible()) filterBlock(tc.block(), fs, regexp); tc.movePosition(QTextCursor::End); - tc.setCharFormat(def_cf); tc.insertBlock(); + tc.setCharFormat(def_cf); + tc.setBlockFormat(def_bf); } @@ -240,7 +265,15 @@ void LogView::filterBlock(QTextBlock block, const QString & fs, const QRegularEx if (line[0] == QChar::ObjectReplacementCharacter) line.remove(0, 1); } - if (regexp.isValid()) vis = vis && line.contains(regexp); + if (regexp.isValid() && !regexp.pattern().isEmpty()) { + QString kw; + TextBlockData * bd = (TextBlockData*)block.userData(); + if (bd) kw = bd->keyword; + if (!kw.isEmpty()) + vis = vis && (bd->keyword == regexp.pattern()); + else + vis = vis && line.contains(regexp); + } if (!fs.isEmpty()) vis = vis && line.contains(fs, Qt::CaseInsensitive); block.setVisible(vis); //qDebug() << "filterBlock" << line << vis; diff --git a/libs/application/logview.h b/libs/application/logview.h index b882c0a..46cd1ef 100644 --- a/libs/application/logview.h +++ b/libs/application/logview.h @@ -73,6 +73,7 @@ public: void clearCategories(); void addText(const QString & text, bool insert_newline = true); + void addText(const QString & text, const QString & keyword, bool insert_newline = true); private: struct QAD_APPLICATION_EXPORT Category { @@ -88,13 +89,14 @@ private: }; void changeEvent(QEvent * e); - void newLine(); + void newLine(const QString & keyword); QSize iconImageSize(); void filterBlock(QTextBlock block, const QString & fs, const QRegularExpression & regexp); Ui::LogView * ui; QList categories; - QTextCharFormat def_cf; + QTextCharFormat def_cf; + QTextBlockFormat def_bf; QAction * actionLogSelectAll, * actionLogCopy, * actionLogClear; public slots: diff --git a/libs/piqt/piqt.cpp b/libs/piqt/piqt.cpp index 5e84b3c..403310e 100644 --- a/libs/piqt/piqt.cpp +++ b/libs/piqt/piqt.cpp @@ -80,6 +80,7 @@ const PIVariant Q2PIVariant(const QVariant & v) { case QVariant::RectF: return PIVariant(Q2PIRect(v.toRectF())); default: break; } + if (v.canConvert()) return PIVariant(v.value()); if (v.canConvert()) return PIVariant(QAD2PIEnum(v.value())); if (v.canConvert()) return PIVariant(QAD2PIFile(v.value())); if (v.canConvert()) return PIVariant(QAD2PIDir(v.value()));