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
10#include <QTextBlock>
11#include <QTextCursor>
12
13using namespace QGBA;
14
15LogView::LogView(LogController* log, QWidget* parent)
16 : QWidget(parent)
17 , m_lines(0)
18 , m_lineLimit(DEFAULT_LINE_LIMIT)
19{
20 m_ui.setupUi(this);
21 connect(m_ui.levelDebug, &QAbstractButton::toggled, [this](bool set) {
22 setLevel(GBA_LOG_DEBUG, set);
23 });
24 connect(m_ui.levelStub, &QAbstractButton::toggled, [this](bool set) {
25 setLevel(GBA_LOG_STUB, set);
26 });
27 connect(m_ui.levelInfo, &QAbstractButton::toggled, [this](bool set) {
28 setLevel(GBA_LOG_INFO, set);
29 });
30 connect(m_ui.levelWarn, &QAbstractButton::toggled, [this](bool set) {
31 setLevel(GBA_LOG_WARN, set);
32 });
33 connect(m_ui.levelError, &QAbstractButton::toggled, [this](bool set) {
34 setLevel(GBA_LOG_ERROR, set);
35 });
36 connect(m_ui.levelFatal, &QAbstractButton::toggled, [this](bool set) {
37 setLevel(GBA_LOG_FATAL, set);
38 });
39 connect(m_ui.levelGameError, &QAbstractButton::toggled, [this](bool set) {
40 setLevel(GBA_LOG_GAME_ERROR, set);
41 });
42 connect(m_ui.levelSWI, &QAbstractButton::toggled, [this](bool set) {
43 setLevel(GBA_LOG_SWI, set);
44 });
45 connect(m_ui.levelStatus, &QAbstractButton::toggled, [this](bool set) {
46 setLevel(GBA_LOG_STATUS, set);
47 });
48 connect(m_ui.levelSIO, &QAbstractButton::toggled, [this](bool set) {
49 setLevel(GBA_LOG_SIO, set);
50 });
51 connect(m_ui.clear, SIGNAL(clicked()), this, SLOT(clear()));
52 connect(m_ui.maxLines, SIGNAL(valueChanged(int)), this, SLOT(setMaxLines(int)));
53 m_ui.maxLines->setValue(DEFAULT_LINE_LIMIT);
54
55 connect(log, SIGNAL(logPosted(int, const QString&)), this, SLOT(postLog(int, const QString&)));
56 connect(log, SIGNAL(levelsSet(int)), this, SLOT(setLevels(int)));
57 connect(log, &LogController::levelsEnabled, [this](int level) {
58 bool s = blockSignals(true);
59 setLevel(level, true);
60 blockSignals(s);
61 });
62 connect(log, &LogController::levelsDisabled, [this](int level) {
63 bool s = blockSignals(true);
64 setLevel(level, false);
65 blockSignals(s);
66 });
67 connect(this, SIGNAL(levelsEnabled(int)), log, SLOT(enableLevels(int)));
68 connect(this, SIGNAL(levelsDisabled(int)), log, SLOT(disableLevels(int)));
69}
70
71void LogView::postLog(int level, const QString& log) {
72 QString line = QString("%1:\t%2").arg(LogController::toString(level)).arg(log);
73 if (isVisible()) {
74 m_ui.view->appendPlainText(line);
75 } else {
76 m_pendingLines.enqueue(line);
77 }
78 ++m_lines;
79 if (m_lines > m_lineLimit) {
80 clearLine();
81 }
82}
83
84void LogView::clear() {
85 m_ui.view->clear();
86 m_lines = 0;
87}
88
89void LogView::setLevels(int levels) {
90 m_ui.levelDebug->setCheckState(levels & GBA_LOG_DEBUG ? Qt::Checked : Qt::Unchecked);
91 m_ui.levelStub->setCheckState(levels & GBA_LOG_STUB ? Qt::Checked : Qt::Unchecked);
92 m_ui.levelInfo->setCheckState(levels & GBA_LOG_INFO ? Qt::Checked : Qt::Unchecked);
93 m_ui.levelWarn->setCheckState(levels & GBA_LOG_WARN ? Qt::Checked : Qt::Unchecked);
94 m_ui.levelError->setCheckState(levels & GBA_LOG_ERROR ? Qt::Checked : Qt::Unchecked);
95 m_ui.levelFatal->setCheckState(levels & GBA_LOG_FATAL ? Qt::Checked : Qt::Unchecked);
96 m_ui.levelGameError->setCheckState(levels & GBA_LOG_GAME_ERROR ? Qt::Checked : Qt::Unchecked);
97 m_ui.levelSWI->setCheckState(levels & GBA_LOG_SWI ? Qt::Checked : Qt::Unchecked);
98 m_ui.levelStatus->setCheckState(levels & GBA_LOG_STATUS ? Qt::Checked : Qt::Unchecked);
99 m_ui.levelSIO->setCheckState(levels & GBA_LOG_SIO ? Qt::Checked : Qt::Unchecked);
100}
101
102void LogView::setLevel(int level, bool set) {
103 if (level & GBA_LOG_DEBUG) {
104 m_ui.levelDebug->setCheckState(set ? Qt::Checked : Qt::Unchecked);
105 }
106 if (level & GBA_LOG_STUB) {
107 m_ui.levelStub->setCheckState(set ? Qt::Checked : Qt::Unchecked);
108 }
109 if (level & GBA_LOG_INFO) {
110 m_ui.levelInfo->setCheckState(set ? Qt::Checked : Qt::Unchecked);
111 }
112 if (level & GBA_LOG_WARN) {
113 m_ui.levelWarn->setCheckState(set ? Qt::Checked : Qt::Unchecked);
114 }
115 if (level & GBA_LOG_ERROR) {
116 m_ui.levelError->setCheckState(set ? Qt::Checked : Qt::Unchecked);
117 }
118 if (level & GBA_LOG_FATAL) {
119 m_ui.levelFatal->setCheckState(set ? Qt::Checked : Qt::Unchecked);
120 }
121 if (level & GBA_LOG_GAME_ERROR) {
122 m_ui.levelGameError->setCheckState(set ? Qt::Checked : Qt::Unchecked);
123 }
124 if (level & GBA_LOG_SWI) {
125 m_ui.levelSWI->setCheckState(set ? Qt::Checked : Qt::Unchecked);
126 }
127 if (level & GBA_LOG_STATUS) {
128 m_ui.levelStatus->setCheckState(set ? Qt::Checked : Qt::Unchecked);
129 }
130 if (level & GBA_LOG_SIO) {
131 m_ui.levelSIO->setCheckState(set ? Qt::Checked : Qt::Unchecked);
132 }
133
134 if (set) {
135 emit levelsEnabled(level);
136 } else {
137 emit levelsDisabled(level);
138 }
139}
140
141void LogView::setMaxLines(int limit) {
142 m_lineLimit = limit;
143 while (m_lines > m_lineLimit) {
144 clearLine();
145 }
146}
147
148void LogView::showEvent(QShowEvent*) {
149 while (!m_pendingLines.isEmpty()) {
150 m_ui.view->appendPlainText(m_pendingLines.dequeue());
151 }
152}
153
154void LogView::clearLine() {
155 if (m_ui.view->document()->isEmpty()) {
156 m_pendingLines.dequeue();
157 } else {
158 QTextCursor cursor(m_ui.view->document());
159 cursor.setPosition(0);
160 cursor.select(QTextCursor::BlockUnderCursor);
161 cursor.removeSelectedText();
162 cursor.deleteChar();
163 }
164 --m_lines;
165}