diff --git a/gui/pages/LogPage.cpp b/gui/pages/LogPage.cpp index 636d26954..f16e3477f 100644 --- a/gui/pages/LogPage.cpp +++ b/gui/pages/LogPage.cpp @@ -16,6 +16,14 @@ LogPage::LogPage(MinecraftProcess *proc, QWidget *parent) connect(m_process, SIGNAL(log(QString, MessageLevel::Enum)), this, SLOT(write(QString, MessageLevel::Enum))); + // create the format and set its font + defaultFormat = new QTextCharFormat(ui->text->currentCharFormat()); + QFont font; + font.setFamily("Courier"); + font.setStyleHint(QFont::Monospace); + font.setFixedPitch(true); + defaultFormat->setFont(font); + auto findShortcut = new QShortcut(QKeySequence(QKeySequence::Find), this); connect(findShortcut, SIGNAL(activated()), SLOT(findActivated())); auto findNextShortcut = new QShortcut(QKeySequence(QKeySequence::FindNext), this); @@ -28,6 +36,7 @@ LogPage::LogPage(MinecraftProcess *proc, QWidget *parent) LogPage::~LogPage() { delete ui; + delete defaultFormat; } bool LogPage::apply() @@ -107,24 +116,6 @@ void LogPage::findPreviousActivated() } } -void LogPage::writeColor(QString text, const char *color, const char *background) -{ - // append a paragraph - QString newtext; - newtext += ""; - newtext += text.toHtmlEscaped(); - newtext += ""; - ui->text->appendHtml(newtext); -} - void LogPage::write(QString data, MessageLevel::Enum mode) { if (!m_write_active) @@ -159,31 +150,59 @@ void LogPage::write(QString data, MessageLevel::Enum mode) for (QString ¶graph : paragraphs) { //TODO: implement filtering here. - filtered.append(paragraph.trimmed()); + filtered.append(paragraph); } QListIterator iter(filtered); - if (mode == MessageLevel::MultiMC) - while (iter.hasNext()) - writeColor(iter.next(), "blue", 0); - else if (mode == MessageLevel::Error) - while (iter.hasNext()) - writeColor(iter.next(), "red", 0); - else if (mode == MessageLevel::Warning) - while (iter.hasNext()) - writeColor(iter.next(), "orange", 0); - else if (mode == MessageLevel::Fatal) - while (iter.hasNext()) - writeColor(iter.next(), "red", "black"); - else if (mode == MessageLevel::Debug) - while (iter.hasNext()) - writeColor(iter.next(), "green", 0); - else if (mode == MessageLevel::PrePost) - while (iter.hasNext()) - writeColor(iter.next(), "grey", 0); - // TODO: implement other MessageLevels - else - while (iter.hasNext()) - writeColor(iter.next(), 0, 0); + QTextCharFormat format(*defaultFormat); + + switch(mode) + { + case MessageLevel::MultiMC: + { + format.setForeground(QColor("blue")); + break; + } + case MessageLevel::Debug: + { + format.setForeground(QColor("green")); + break; + } + case MessageLevel::Warning: + { + format.setForeground(QColor("orange")); + break; + } + case MessageLevel::Error: + { + format.setForeground(QColor("red")); + break; + } + case MessageLevel::Fatal: + { + format.setForeground(QColor("red")); + format.setBackground(QColor("black")); + } + case MessageLevel::PrePost: + { + format.setForeground(QColor("grey")); + } + case MessageLevel::Info: + case MessageLevel::Message: + default: + { + // do nothing, keep original + } + } + + while (iter.hasNext()) + { + // append a paragraph/line + auto workCursor = ui->text->textCursor(); + workCursor.movePosition(QTextCursor::End); + workCursor.insertText(iter.next(), format); + workCursor.insertBlock(); + } + if (isVisible()) { if (m_scroll_active) diff --git a/gui/pages/LogPage.h b/gui/pages/LogPage.h index 3c86724e8..468dcf794 100644 --- a/gui/pages/LogPage.h +++ b/gui/pages/LogPage.h @@ -28,6 +28,7 @@ namespace Ui { class LogPage; } +class QTextCharFormat; class LogPage : public QWidget, public BasePage { @@ -55,15 +56,6 @@ public: } virtual bool shouldDisplay() const; -private: - /** - * @brief write a colored paragraph - * @param data the string - * @param color the css color name - * this will only insert a single paragraph. - * \n are ignored. a real \n is always appended. - */ - void writeColor(QString text, const char *color, const char *background); private slots: /** * @brief write a string @@ -90,4 +82,6 @@ private: bool m_scroll_active = true; int m_saved_offset = 0; bool m_write_active = true; + + QTextCharFormat * defaultFormat; }; diff --git a/logic/MinecraftProcess.cpp b/logic/MinecraftProcess.cpp index 5c74fefe0..c97381767 100644 --- a/logic/MinecraftProcess.cpp +++ b/logic/MinecraftProcess.cpp @@ -144,19 +144,41 @@ QString MinecraftProcess::censorPrivateInfo(QString in) // console window MessageLevel::Enum MinecraftProcess::guessLevel(const QString &line, MessageLevel::Enum level) { - if (line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") || - line.contains("[FINER]") || line.contains("[FINEST]")) - level = MessageLevel::Message; - if (line.contains("[SEVERE]") || line.contains("[STDERR]")) - level = MessageLevel::Error; - if (line.contains("[WARNING]")) - level = MessageLevel::Warning; - if (line.contains("Exception in thread") || line.contains(" at ")) - level = MessageLevel::Fatal; - if (line.contains("[DEBUG]")) - level = MessageLevel::Debug; + QRegularExpression re("\\[(?[0-9:]+)\\] \\[[^/]+/(?[^\\]]+)\\]"); + auto match = re.match(line); + if(match.hasMatch()) + { + // New style logs from log4j + QString timestamp = match.captured("timestamp"); + QString levelStr = match.captured("level"); + if(levelStr == "INFO") + level = MessageLevel::Message; + if(levelStr == "WARN") + level = MessageLevel::Warning; + if(levelStr == "ERROR") + level = MessageLevel::Error; + if(levelStr == "FATAL") + level = MessageLevel::Fatal; + if(levelStr == "TRACE" || levelStr == "DEBUG") + level = MessageLevel::Debug; + } + else + { + // Old style forge logs + if (line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") || + line.contains("[FINER]") || line.contains("[FINEST]")) + level = MessageLevel::Message; + if (line.contains("[SEVERE]") || line.contains("[STDERR]")) + level = MessageLevel::Error; + if (line.contains("[WARNING]")) + level = MessageLevel::Warning; + if (line.contains("[DEBUG]")) + level = MessageLevel::Debug; + } if (line.contains("overwriting existing")) - level = MessageLevel::Fatal; + return MessageLevel::Fatal; + if (line.contains("Exception in thread") || line.contains(" at ")) + return MessageLevel::Fatal; return level; }