Skip to content
Permalink
Browse files

LogWidget: Replace QTextEdit with QPlainTextEdit for better performance

QTextEdit is heavy, similar in functionality to WordPad,
while QPlainTextEdit is lightweight like Notepad.
Qt documentation recommends using QPlainTextEdit for log viewers,
and it also allows to set automatic cutoff of oldest messages beyond a fixed point,
which we now set to MAX_LOG_LINES (5000)
  • Loading branch information...
CookiePLMonster committed Aug 30, 2019
1 parent 5ea4f99 commit eb7d42dfe88efaa9939b155ca5016ec40c992268
Showing with 19 additions and 17 deletions.
  1. +17 −12 Source/Core/DolphinQt/Config/LogWidget.cpp
  2. +2 −5 Source/Core/DolphinQt/Config/LogWidget.h
@@ -8,12 +8,13 @@
#include <QComboBox>
#include <QFont>
#include <QFontDatabase>
#include <QGroupBox>
#include <QGridLayout>
#include <QPlainTextEdit>
#include <QPushButton>
#include <QScrollBar>
#include <QTextEdit>
#include <QTimer>
#include <QVBoxLayout>

#include "Core/ConfigManager.h"

#include "Common/FileUtil.h"
#include "Common/StringUtil.h"
@@ -25,8 +26,10 @@

// Delay in ms between calls of UpdateLog()
constexpr int UPDATE_LOG_DELAY = 100;
// Maximum number of lines to show in log viewer
constexpr int MAX_LOG_LINES = 5000;
// Maximum lines to process at a time
constexpr int MAX_LOG_LINES = 200;
constexpr size_t MAX_LOG_LINES_TO_UPDATE = 200;
// Timestamp length
constexpr int TIMESTAMP_LENGTH = 10;

@@ -75,9 +78,9 @@ void LogWidget::UpdateLog()
int old_horizontal = hscroll->value();
int old_vertical = vscroll->value();

for (int i = 0; !m_log_queue.empty() && i < MAX_LOG_LINES; i++)
for (size_t i = 0; !m_log_queue.empty() && i < MAX_LOG_LINES_TO_UPDATE; i++)
{
m_log_text->append(m_log_queue.front());
m_log_text->appendHtml(m_log_queue.front());
m_log_queue.pop();
}

@@ -115,16 +118,14 @@ void LogWidget::UpdateFont()
void LogWidget::CreateWidgets()
{
// Log
m_tab_log = new QWidget;
m_log_text = new QTextEdit;
m_log_text = new QPlainTextEdit;
m_log_wrap = new QCheckBox(tr("Word Wrap"));
m_log_font = new QComboBox;
m_log_clear = new QPushButton(tr("Clear"));

m_log_font->addItems({tr("Default Font"), tr("Monospaced Font"), tr("Selected Font")});

auto* log_layout = new QGridLayout;
m_tab_log->setLayout(log_layout);
log_layout->addWidget(m_log_wrap, 0, 0);
log_layout->addWidget(m_log_font, 0, 1);
log_layout->addWidget(m_log_clear, 0, 2);
@@ -136,6 +137,8 @@ void LogWidget::CreateWidgets()
setWidget(widget);

m_log_text->setReadOnly(true);
m_log_text->setUndoRedoEnabled(false);
m_log_text->setMaximumBlockCount(MAX_LOG_LINES);

QPalette palette = m_log_text->palette();
palette.setColor(QPalette::Base, Qt::black);
@@ -145,7 +148,7 @@ void LogWidget::CreateWidgets()

void LogWidget::ConnectWidgets()
{
connect(m_log_clear, &QPushButton::clicked, m_log_text, &QTextEdit::clear);
connect(m_log_clear, &QPushButton::clicked, m_log_text, &QPlainTextEdit::clear);
connect(m_log_wrap, &QCheckBox::toggled, this, &LogWidget::SaveSettings);
connect(m_log_font, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,
&LogWidget::SaveSettings);
@@ -163,7 +166,8 @@ void LogWidget::LoadSettings()

// Log - Wrap Lines
m_log_wrap->setChecked(settings.value(QStringLiteral("logging/wraplines")).toBool());
m_log_text->setLineWrapMode(m_log_wrap->isChecked() ? QTextEdit::WidgetWidth : QTextEdit::NoWrap);
m_log_text->setLineWrapMode(m_log_wrap->isChecked() ? QPlainTextEdit::WidgetWidth :
QPlainTextEdit::NoWrap);

// Log - Font Selection
// Currently "Debugger Font" is not supported as there is no Qt Debugger, defaulting to Monospace
@@ -180,7 +184,8 @@ void LogWidget::SaveSettings()

// Log - Wrap Lines
settings.setValue(QStringLiteral("logging/wraplines"), m_log_wrap->isChecked());
m_log_text->setLineWrapMode(m_log_wrap->isChecked() ? QTextEdit::WidgetWidth : QTextEdit::NoWrap);
m_log_text->setLineWrapMode(m_log_wrap->isChecked() ? QPlainTextEdit::WidgetWidth :
QPlainTextEdit::NoWrap);

// Log - Font Selection
settings.setValue(QStringLiteral("logging/font"), m_log_font->currentIndex());
@@ -14,9 +14,8 @@
class QCheckBox;
class QCloseEvent;
class QComboBox;
class QPlainTextEdit;
class QPushButton;
class QVBoxLayout;
class QTextEdit;
class QTimer;

class LogWidget final : public QDockWidget, LogListener
@@ -43,9 +42,7 @@ class LogWidget final : public QDockWidget, LogListener
QCheckBox* m_log_wrap;
QComboBox* m_log_font;
QPushButton* m_log_clear;
QVBoxLayout* m_main_layout;
QTextEdit* m_log_text;
QWidget* m_tab_log;
QPlainTextEdit* m_log_text;

QTimer* m_timer;

0 comments on commit eb7d42d

Please sign in to comment.
You can’t perform that action at this time.