Qt: Optimize log viewer to not mess with text rendering if hidden

This commit is contained in:
Jeffrey Pfau 2015-12-28 04:44:16 -05:00
parent 63e1875f6b
commit ad9ea7125f
2 changed files with 26 additions and 6 deletions

View File

@ -69,7 +69,12 @@ LogView::LogView(LogController* log, QWidget* parent)
} }
void LogView::postLog(int level, const QString& log) { void LogView::postLog(int level, const QString& log) {
m_ui.view->appendPlainText(QString("%1:\t%2").arg(LogController::toString(level)).arg(log)); QString line = QString("%1:\t%2").arg(LogController::toString(level)).arg(log);
if (isVisible()) {
m_ui.view->appendPlainText(line);
} else {
m_pendingLines.enqueue(line);
}
++m_lines; ++m_lines;
if (m_lines > m_lineLimit) { if (m_lines > m_lineLimit) {
clearLine(); clearLine();
@ -140,11 +145,21 @@ void LogView::setMaxLines(int limit) {
} }
} }
void LogView::showEvent(QShowEvent*) {
while (!m_pendingLines.isEmpty()) {
m_ui.view->appendPlainText(m_pendingLines.dequeue());
}
}
void LogView::clearLine() { void LogView::clearLine() {
QTextCursor cursor(m_ui.view->document()); if (m_ui.view->document()->isEmpty()) {
cursor.setPosition(0); m_pendingLines.dequeue();
cursor.select(QTextCursor::BlockUnderCursor); } else {
cursor.removeSelectedText(); QTextCursor cursor(m_ui.view->document());
cursor.deleteChar(); cursor.setPosition(0);
cursor.select(QTextCursor::BlockUnderCursor);
cursor.removeSelectedText();
cursor.deleteChar();
}
--m_lines; --m_lines;
} }

View File

@ -6,6 +6,7 @@
#ifndef QGBA_LOG_VIEW #ifndef QGBA_LOG_VIEW
#define QGBA_LOG_VIEW #define QGBA_LOG_VIEW
#include <QQueue>
#include <QWidget> #include <QWidget>
#include "ui_LogView.h" #include "ui_LogView.h"
@ -36,12 +37,16 @@ public slots:
private slots: private slots:
void setMaxLines(int); void setMaxLines(int);
protected:
virtual void showEvent(QShowEvent*) override;
private: private:
static const int DEFAULT_LINE_LIMIT = 1000; static const int DEFAULT_LINE_LIMIT = 1000;
Ui::LogView m_ui; Ui::LogView m_ui;
int m_lines; int m_lines;
int m_lineLimit; int m_lineLimit;
QQueue<QString> m_pendingLines;
void setLevel(int level, bool); void setLevel(int level, bool);