all repos — mgba @ 3d4faa41e281ff042451032190b3191af2737d5a

mGBA Game Boy Advance Emulator

src/platform/qt/LogView.cpp (view raw)

  1/* Copyright (c) 2013-2014 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#include "LogView.h"
  7
  8#include "LogController.h"
  9#include "Window.h"
 10
 11#include <QTextBlock>
 12#include <QTextCursor>
 13
 14using namespace QGBA;
 15
 16LogView::LogView(LogController* log, Window* window, QWidget* parent)
 17	: QWidget(parent)
 18{
 19	m_ui.setupUi(this);
 20	connect(m_ui.levelDebug, &QAbstractButton::toggled, [this](bool set) {
 21		setLevel(mLOG_DEBUG, set);
 22	});
 23	connect(m_ui.levelStub, &QAbstractButton::toggled, [this](bool set) {
 24		setLevel(mLOG_STUB, set);
 25	});
 26	connect(m_ui.levelInfo, &QAbstractButton::toggled, [this](bool set) {
 27		setLevel(mLOG_INFO, set);
 28	});
 29	connect(m_ui.levelWarn, &QAbstractButton::toggled, [this](bool set) {
 30		setLevel(mLOG_WARN, set);
 31	});
 32	connect(m_ui.levelError, &QAbstractButton::toggled, [this](bool set) {
 33		setLevel(mLOG_ERROR, set);
 34	});
 35	connect(m_ui.levelFatal, &QAbstractButton::toggled, [this](bool set) {
 36		setLevel(mLOG_FATAL, set);
 37	});
 38	connect(m_ui.levelGameError, &QAbstractButton::toggled, [this](bool set) {
 39		setLevel(mLOG_GAME_ERROR, set);
 40	});
 41	connect(m_ui.clear, &QAbstractButton::clicked, this, &LogView::clear);
 42	connect(m_ui.advanced, &QAbstractButton::clicked, this, [window]() {
 43		window->openSettingsWindow(SettingsView::Page::LOGGING);
 44	});
 45	connect(m_ui.maxLines, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
 46	        this, &LogView::setMaxLines);
 47	m_ui.maxLines->setValue(DEFAULT_LINE_LIMIT);
 48
 49	connect(log, &LogController::logPosted, this, &LogView::postLog);
 50	connect(log, static_cast<void (LogController::*)(int)>(&LogController::levelsSet), this, &LogView::setLevels);
 51	connect(log, static_cast<void (LogController::*)(int)>(&LogController::levelsEnabled), [this](int level) {
 52		bool s = blockSignals(true);
 53		setLevel(level, true);
 54		blockSignals(s);
 55	});
 56	connect(log, static_cast<void (LogController::*)(int)>(&LogController::levelsDisabled), [this](int level) {
 57		bool s = blockSignals(true);
 58		setLevel(level, false);
 59		blockSignals(s);
 60	});
 61	connect(this, &LogView::levelsEnabled, log, static_cast<void (LogController::*)(int)>(&LogController::enableLevels));
 62	connect(this, &LogView::levelsDisabled, log, static_cast<void (LogController::*)(int)>(&LogController::disableLevels));
 63}
 64
 65void LogView::postLog(int level, int category, const QString& log) {
 66	QString line = QString("[%1] %2:\t%3").arg(LogController::toString(level)).arg(mLogCategoryName(category)).arg(log);
 67	// TODO: Log to file
 68	m_pendingLines.enqueue(line);
 69	++m_lines;
 70	if (m_lines > m_lineLimit) {
 71		clearLine();
 72	}
 73	update();
 74}
 75
 76void LogView::clear() {
 77	m_ui.view->clear();
 78	m_lines = 0;
 79}
 80
 81void LogView::setLevels(int levels) {
 82	m_ui.levelDebug->setCheckState(levels & mLOG_DEBUG ? Qt::Checked : Qt::Unchecked);
 83	m_ui.levelStub->setCheckState(levels & mLOG_STUB ? Qt::Checked : Qt::Unchecked);
 84	m_ui.levelInfo->setCheckState(levels & mLOG_INFO ? Qt::Checked : Qt::Unchecked);
 85	m_ui.levelWarn->setCheckState(levels & mLOG_WARN ? Qt::Checked : Qt::Unchecked);
 86	m_ui.levelError->setCheckState(levels & mLOG_ERROR ? Qt::Checked : Qt::Unchecked);
 87	m_ui.levelFatal->setCheckState(levels & mLOG_FATAL ? Qt::Checked : Qt::Unchecked);
 88	m_ui.levelGameError->setCheckState(levels & mLOG_GAME_ERROR ? Qt::Checked : Qt::Unchecked);
 89}
 90
 91void LogView::setLevel(int level, bool set) {
 92	if (level & mLOG_DEBUG) {
 93		m_ui.levelDebug->setCheckState(set ? Qt::Checked : Qt::Unchecked);
 94	}
 95	if (level & mLOG_STUB) {
 96		m_ui.levelStub->setCheckState(set ? Qt::Checked : Qt::Unchecked);
 97	}
 98	if (level & mLOG_INFO) {
 99		m_ui.levelInfo->setCheckState(set ? Qt::Checked : Qt::Unchecked);
100	}
101	if (level & mLOG_WARN) {
102		m_ui.levelWarn->setCheckState(set ? Qt::Checked : Qt::Unchecked);
103	}
104	if (level & mLOG_ERROR) {
105		m_ui.levelError->setCheckState(set ? Qt::Checked : Qt::Unchecked);
106	}
107	if (level & mLOG_FATAL) {
108		m_ui.levelFatal->setCheckState(set ? Qt::Checked : Qt::Unchecked);
109	}
110	if (level & mLOG_GAME_ERROR) {
111		m_ui.levelGameError->setCheckState(set ? Qt::Checked : Qt::Unchecked);
112	}
113
114	if (set) {
115		emit levelsEnabled(level);
116	} else {
117		emit levelsDisabled(level);
118	}
119}
120
121void LogView::setMaxLines(int limit) {
122	m_lineLimit = limit;
123	while (m_lines > m_lineLimit) {
124		clearLine();
125	}
126}
127
128void LogView::paintEvent(QPaintEvent* event) {
129	while (!m_pendingLines.isEmpty()) {
130		m_ui.view->appendPlainText(m_pendingLines.dequeue());
131	}
132	QWidget::paintEvent(event);
133}
134
135void LogView::clearLine() {
136	if (m_ui.view->document()->isEmpty()) {
137		m_pendingLines.dequeue();
138	} else {
139		QTextCursor cursor(m_ui.view->document());
140		cursor.setPosition(0);
141		cursor.select(QTextCursor::BlockUnderCursor);
142		cursor.removeSelectedText();
143		cursor.deleteChar();
144	}
145	--m_lines;
146}