#include "logger.h"

Logger g_logger;


//------------------------------------------------------------------------------
LogViewer::LogViewer(QWidget* parent)
    : QPlainTextEdit(parent)
{ }


void LogViewer::connectLogger(Logger* logger)
{
    connect(logger, SIGNAL(logMessage(int, QString)),
            this, SLOT(appendLogMessage(int, QString)),
            Qt::QueuedConnection);
}


void LogViewer::appendLogMessage(int logLevel, QString msg)
{
    moveCursor(QTextCursor::End);
    switch (logLevel)
    {
        case Logger::Warning:
            appendHtml("<b>WARNING</b>: ");
            insertPlainText(msg);
            break;
        case Logger::Error:
            appendHtml("<b>ERROR</b>: ");
            insertPlainText(msg);
            break;
        case Logger::Info:
            appendPlainText(msg);
            break;
    }
    ensureCursorVisible();
}


//------------------------------------------------------------------------------
std::ostream& operator<<(std::ostream& out, const QByteArray& s)
{
    out.write(s.constData(), s.size());
    return out;
}


std::ostream& operator<<(std::ostream& out, const QString& s)
{
    out << s.toUtf8();
    return out;
}

#include "logger.h"

Logger g_logger;


//------------------------------------------------------------------------------
LogViewer::LogViewer(QWidget* parent)
    : QPlainTextEdit(parent)
{ }


void LogViewer::connectLogger(Logger* logger)
{
    connect(logger, SIGNAL(logMessage(int, QString)),
            this, SLOT(appendLogMessage(int, QString)),
            Qt::QueuedConnection);
}


void LogViewer::appendLogMessage(int logLevel, QString msg)
{
    switch (logLevel)
    {
        case Logger::Warning:
            appendHtml("<b>WARNING</b>: " + msg);
            break;
        case Logger::Error:
            appendHtml("<b>ERROR</b>: " + msg);
            break;
        case Logger::Info:
            appendPlainText(msg);
            break;
    }
    ensureCursorVisible();
}


//------------------------------------------------------------------------------
std::ostream& operator<<(std::ostream& out, const QByteArray& s)
{
    out.write(s.constData(), s.size());
    return out;
}


std::ostream& operator<<(std::ostream& out, const QString& s)
{
    out << s.toUtf8();
    return out;
}

--- 
+++ 
@@ -19,13 +19,16 @@
 
 void LogViewer::appendLogMessage(int logLevel, QString msg)
 {
+    moveCursor(QTextCursor::End);
     switch (logLevel)
     {
         case Logger::Warning:
-            appendHtml("<b>WARNING</b>: " + msg);
+            appendHtml("<b>WARNING</b>: ");
+            insertPlainText(msg);
             break;
         case Logger::Error:
-            appendHtml("<b>ERROR</b>: " + msg);
+            appendHtml("<b>ERROR</b>: ");
+            insertPlainText(msg);
             break;
         case Logger::Info:
             appendPlainText(msg);
Fix logging highlighting, visibility, and newlines

Avoid logging plain text messages using appendHtml(), otherwise newlines
will be stripped, and tags interpreted.  Also ensure that the cursor is
at the end of the log text to ensure the latest log statement is always
visible, and the wrong highlighting isn't inherited when inserting plain
text.
