LogView patch - addText with force category, color now background
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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>()));
|
||||||
|
|||||||
Reference in New Issue
Block a user