version 1.4.0_alpha
add LogView patch MatrixEdit for old Qt
This commit is contained in:
183
qad/application/logview.cpp
Normal file
183
qad/application/logview.cpp
Normal file
@@ -0,0 +1,183 @@
|
||||
#include "logview.h"
|
||||
#include "ui_logview.h"
|
||||
#include "qad_types.h"
|
||||
#include "ecombobox.h"
|
||||
#include <QTextDocument>
|
||||
#include <QAbstractTextDocumentLayout>
|
||||
#include <QTextEdit>
|
||||
#include <QTextBlock>
|
||||
#include <QScrollBar>
|
||||
#include <QPixmap>
|
||||
#include <QEvent>
|
||||
|
||||
|
||||
LogView::Category::Category() {
|
||||
bold = false;
|
||||
}
|
||||
|
||||
|
||||
void LogView::Category::makeIcon(QSize size, QSize size_icon) {
|
||||
icon_image = QImage();
|
||||
if (!image.isNull())
|
||||
icon_image = image.scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
QPixmap px = QPixmap::fromImage(image.scaled(size_icon, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
|
||||
icon.addPixmap(px, QIcon::Active);
|
||||
icon.addPixmap(px, QIcon::Disabled);
|
||||
icon.addPixmap(px, QIcon::Normal);
|
||||
icon.addPixmap(px, QIcon::Selected);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
LogView::LogView(QWidget * parent): QWidget(parent) {
|
||||
ui = new Ui::LogView();
|
||||
ui->setupUi(this);
|
||||
ui->buttonClear->setDefaultAction(ui->actionClear);
|
||||
ui->labelIconSearch->setFixedSize(preferredIconSize(1.2, this));
|
||||
ui->comboCategory->addItem(tr("All"));
|
||||
ui->textEdit->document()->setUndoRedoEnabled(false);
|
||||
setLinesLimit(10000);
|
||||
QTextCursor tc(ui->textEdit->document());
|
||||
def_cf = tc.charFormat();
|
||||
}
|
||||
|
||||
|
||||
LogView::~LogView() {
|
||||
delete ui;
|
||||
}
|
||||
|
||||
|
||||
const QTextEdit * LogView::textEdit() const {
|
||||
return ui->textEdit;
|
||||
}
|
||||
|
||||
|
||||
void LogView::setLogFont(QFont f) {
|
||||
ui->textEdit->document()->setDefaultFont(f);
|
||||
QTextCursor tc(ui->textEdit->document());
|
||||
def_cf = tc.charFormat();
|
||||
}
|
||||
|
||||
|
||||
QFont LogView::logFont() const {
|
||||
return ui->textEdit->document()->defaultFont();
|
||||
}
|
||||
|
||||
|
||||
bool LogView::isFilterVisible() const {
|
||||
return !ui->widgetToolbar->isHidden();
|
||||
}
|
||||
|
||||
|
||||
int LogView::linesLimit() const {
|
||||
return ui->textEdit->document()->maximumBlockCount();
|
||||
}
|
||||
|
||||
|
||||
void LogView::registerCategory(const QString & label, QString keyword, const QImage & icon, QColor color, bool bold) {
|
||||
if (keyword.isEmpty()) keyword = label;
|
||||
if (keyword.isEmpty()) return;
|
||||
Category & c(categories[keyword]);
|
||||
c.label = label;
|
||||
c.keyword = keyword;
|
||||
c.image = icon;
|
||||
c.color = color;
|
||||
c.bold = bold;
|
||||
c.makeIcon(iconImageSize(), preferredIconSize(1., this));
|
||||
ui->comboCategory->addItem(c.icon, label, keyword);
|
||||
}
|
||||
|
||||
|
||||
void LogView::addText(const QString & text, bool insert_newline) {
|
||||
QTextCursor tc(ui->textEdit->document());
|
||||
QStringList sl = text.split("\n");
|
||||
tc.movePosition(QTextCursor::End);
|
||||
QScrollBar * bar = ui->textEdit->verticalScrollBar();
|
||||
bool at_end = (bar->value() == bar->maximum());
|
||||
for (int i = 0; i < sl.size(); ++i) {
|
||||
tc.insertText(sl[i]);
|
||||
if ((i < sl.size() - 1) || insert_newline)
|
||||
newLine();
|
||||
}
|
||||
if (at_end)
|
||||
bar->setValue(bar->maximum());
|
||||
filter();
|
||||
}
|
||||
|
||||
|
||||
void LogView::changeEvent(QEvent * e) {
|
||||
if (e->type() == QEvent::Polish) {
|
||||
ui->labelIconSearch->setFixedSize(preferredIconSize(1.2, this));
|
||||
QSize is = iconImageSize(), is_i = preferredIconSize(1., this);
|
||||
QMutableMapIterator<QString, Category> it(categories);
|
||||
while (it.hasNext())
|
||||
it.next().value().makeIcon(is, is_i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LogView::newLine() {
|
||||
QTextCursor tc(ui->textEdit->document());
|
||||
tc.movePosition(QTextCursor::End);
|
||||
tc.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor);
|
||||
QString line = tc.selectedText();
|
||||
QImage icon;
|
||||
QMapIterator<QString, Category> it(categories);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
if (line.contains(it.key(), Qt::CaseInsensitive)) {
|
||||
QTextCharFormat cf = def_cf;
|
||||
cf.setForeground(it.value().color);
|
||||
if (it.value().bold)
|
||||
cf.setFontWeight(QFont::Bold);
|
||||
tc.setCharFormat(cf);
|
||||
icon = it.value().icon_image;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!icon.isNull()) {
|
||||
tc.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor);
|
||||
tc.insertImage(icon);
|
||||
}
|
||||
tc.movePosition(QTextCursor::End);
|
||||
tc.setCharFormat(def_cf);
|
||||
tc.insertBlock();
|
||||
}
|
||||
|
||||
|
||||
QSize LogView::iconImageSize() {
|
||||
int hei = QFontMetrics(ui->textEdit->document()->defaultFont()).height() / 1.25;
|
||||
return QSize(hei, hei);
|
||||
}
|
||||
|
||||
|
||||
void LogView::setFilterVisible(bool yes) {
|
||||
ui->widgetToolbar->setHidden(!yes);
|
||||
}
|
||||
|
||||
|
||||
void LogView::setLinesLimit(int l) {
|
||||
ui->textEdit->document()->setMaximumBlockCount(l);
|
||||
}
|
||||
|
||||
|
||||
void LogView::clear() {
|
||||
ui->textEdit->clear();
|
||||
}
|
||||
|
||||
|
||||
void LogView::filter() {
|
||||
QTextDocument * doc = ui->textEdit->document();
|
||||
int bc = doc->blockCount();
|
||||
QString fs[2] = {ui->comboCategory->currentData().toString(), ui->lineEdit->text()};
|
||||
QTextBlock bl;
|
||||
for (int i = 0; i < bc; ++i) {
|
||||
bl = doc->findBlockByNumber(i);
|
||||
bool vis = true;
|
||||
if (!fs[0].isEmpty()) vis = vis && bl.text().contains(fs[0], Qt::CaseInsensitive);
|
||||
if (!fs[1].isEmpty()) vis = vis && bl.text().contains(fs[1], Qt::CaseInsensitive);
|
||||
bl.setVisible(vis);
|
||||
}
|
||||
doc->markContentsDirty(0, bl.position() + bl.length());
|
||||
}
|
||||
Reference in New Issue
Block a user