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;
}