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}