LogView patch - addText with force category, color now background

This commit is contained in:
2021-01-22 11:51:40 +03:00
parent af317cf4c9
commit 9ba018b868
4 changed files with 46 additions and 10 deletions

View File

@@ -3,7 +3,7 @@ cmake_policy(SET CMP0017 NEW) # need include() with .cmake
project(qad) project(qad)
set(qad_MAJOR 1) set(qad_MAJOR 1)
set(qad_MINOR 14) set(qad_MINOR 14)
set(qad_REVISION 3) set(qad_REVISION 4)
set(qad_SUFFIX ) set(qad_SUFFIX )
set(qad_COMPANY SHS) set(qad_COMPANY SHS)
set(qad_DOMAIN org.SHS) set(qad_DOMAIN org.SHS)

View File

@@ -9,6 +9,16 @@
#include <QScrollBar> #include <QScrollBar>
#include <QPixmap> #include <QPixmap>
#include <QEvent> #include <QEvent>
#include <QTextBlockUserData>
class TextBlockData: public QTextBlockUserData {
public:
TextBlockData(const QString & kw): keyword(kw) {}
QString keyword;
};
LogView::Category::Category() { LogView::Category::Category() {
@@ -48,6 +58,7 @@ LogView::LogView(QWidget * parent): QWidget(parent) {
setLinesLimit(10000); setLinesLimit(10000);
QTextCursor tc(ui->textEdit->document()); QTextCursor tc(ui->textEdit->document());
def_cf = tc.charFormat(); def_cf = tc.charFormat();
def_bf = tc.blockFormat();
} }
@@ -65,6 +76,7 @@ void LogView::setLogFont(QFont f) {
ui->textEdit->document()->setDefaultFont(f); ui->textEdit->document()->setDefaultFont(f);
QTextCursor tc(ui->textEdit->document()); QTextCursor tc(ui->textEdit->document());
def_cf = tc.charFormat(); def_cf = tc.charFormat();
def_bf = tc.blockFormat();
} }
@@ -154,6 +166,11 @@ void LogView::clearCategories() {
void LogView::addText(const QString & text, bool insert_newline) { 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; if (text.isEmpty()) return;
QTextCursor tc(ui->textEdit->document()); QTextCursor tc(ui->textEdit->document());
QStringList sl = text.split("\n"); 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(); bool at_end = (bar->value() == bar->maximum()) || bar->isHidden();
for (int i = 0; i < sl.size(); ++i) { for (int i = 0; i < sl.size(); ++i) {
tc.insertText(sl[i]); tc.insertText(sl[i]);
if (!keyword.isEmpty())
tc.block().setUserData(new TextBlockData(keyword));
if ((i < sl.size() - 1) || insert_newline) if ((i < sl.size() - 1) || insert_newline)
newLine(); newLine(keyword);
} }
if (at_end) if (at_end)
scrollToBottom(); scrollToBottom();
@@ -191,19 +210,24 @@ void LogView::changeEvent(QEvent * e) {
} }
void LogView::newLine() { void LogView::newLine(const QString & keyword) {
QTextCursor tc(ui->textEdit->document()); QTextCursor tc(ui->textEdit->document());
tc.movePosition(QTextCursor::End); tc.movePosition(QTextCursor::End);
tc.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor); tc.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor);
QString line = tc.selectedText(); QString line = tc.selectedText();
QImage icon; QImage icon;
foreach (const Category & c, categories) { foreach (const Category & c, categories) {
if (line.contains(c.regexp)) { bool matched = false;
if (keyword.isEmpty()) matched = line.contains(c.regexp);
else matched = (keyword == c.regexp.pattern());
if (matched) {
QTextCharFormat cf = def_cf; QTextCharFormat cf = def_cf;
cf.setForeground(c.color); QTextBlockFormat bf = def_bf;
bf.setBackground(c.color);
if (c.bold) if (c.bold)
cf.setFontWeight(QFont::Bold); cf.setFontWeight(QFont::Bold);
tc.setCharFormat(cf); tc.setCharFormat(cf);
tc.setBlockFormat(bf);
icon = c.icon_image; icon = c.icon_image;
break; break;
} }
@@ -222,8 +246,9 @@ void LogView::newLine() {
if (isFilterVisible()) if (isFilterVisible())
filterBlock(tc.block(), fs, regexp); filterBlock(tc.block(), fs, regexp);
tc.movePosition(QTextCursor::End); tc.movePosition(QTextCursor::End);
tc.setCharFormat(def_cf);
tc.insertBlock(); 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) if (line[0] == QChar::ObjectReplacementCharacter)
line.remove(0, 1); 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); if (!fs.isEmpty()) vis = vis && line.contains(fs, Qt::CaseInsensitive);
block.setVisible(vis); block.setVisible(vis);
//qDebug() << "filterBlock" << line << vis; //qDebug() << "filterBlock" << line << vis;

View File

@@ -73,6 +73,7 @@ public:
void clearCategories(); void clearCategories();
void addText(const QString & text, bool insert_newline = true); void addText(const QString & text, bool insert_newline = true);
void addText(const QString & text, const QString & keyword, bool insert_newline = true);
private: private:
struct QAD_APPLICATION_EXPORT Category { struct QAD_APPLICATION_EXPORT Category {
@@ -88,13 +89,14 @@ private:
}; };
void changeEvent(QEvent * e); void changeEvent(QEvent * e);
void newLine(); void newLine(const QString & keyword);
QSize iconImageSize(); QSize iconImageSize();
void filterBlock(QTextBlock block, const QString & fs, const QRegularExpression & regexp); void filterBlock(QTextBlock block, const QString & fs, const QRegularExpression & regexp);
Ui::LogView * ui; Ui::LogView * ui;
QList<Category> categories; QList<Category> categories;
QTextCharFormat def_cf; QTextCharFormat def_cf;
QTextBlockFormat def_bf;
QAction * actionLogSelectAll, * actionLogCopy, * actionLogClear; QAction * actionLogSelectAll, * actionLogCopy, * actionLogClear;
public slots: public slots:

View File

@@ -80,6 +80,7 @@ const PIVariant Q2PIVariant(const QVariant & v) {
case QVariant::RectF: return PIVariant(Q2PIRect(v.toRectF())); case QVariant::RectF: return PIVariant(Q2PIRect(v.toRectF()));
default: break; default: break;
} }
if (v.canConvert<float>()) return PIVariant(v.value<float>());
if (v.canConvert<QAD::Enum>()) return PIVariant(QAD2PIEnum(v.value<QAD::Enum>())); if (v.canConvert<QAD::Enum>()) return PIVariant(QAD2PIEnum(v.value<QAD::Enum>()));
if (v.canConvert<QAD::File>()) return PIVariant(QAD2PIFile(v.value<QAD::File>())); if (v.canConvert<QAD::File>()) return PIVariant(QAD2PIFile(v.value<QAD::File>()));
if (v.canConvert<QAD::Dir>()) return PIVariant(QAD2PIDir(v.value<QAD::Dir>())); if (v.canConvert<QAD::Dir>()) return PIVariant(QAD2PIDir(v.value<QAD::Dir>()));