]> git.siccegge.de Git - frida/frida.git/blobdiff - src/gui/widgets/LogDockAppender.cxx
Always keep log scrolled to the bottom
[frida/frida.git] / src / gui / widgets / LogDockAppender.cxx
index f6419c27601b346d7651fe67fd74caaa2cf0b5bf..321860afb3313126060f68399d8b41987eb1bf5f 100644 (file)
@@ -2,6 +2,7 @@
 #include "LogDock.hxx"
 
 #include <log4cxx/patternlayout.h>
+#include <QTimer>
 
 using namespace log4cxx::helpers;
 
@@ -15,28 +16,50 @@ LogDockAppender::LogDockAppender()
 void LogDockAppender::append(const spi::LoggingEventPtr& event, Pool& p) {
        log4cxx::LogString message, timestamp;
 
-       if ( this->layout == NULL ) {
-             LOG4CXX_ENCODE_CHAR(nameStr, name);
-             std::string msg("No Layout set for the appender named [ ");
-             msg.append(nameStr);
-             msg.append(" ].");
-
-             LOG4CXX_DECODE_CHAR(msgL, msg);
-             errorHandler->error(msgL);
-           return;
-       }
-
-       layout->format(message, event, p);
-       timeformat.format(timestamp, event->getTimeStamp(), p);
-       LOG4CXX_ENCODE_CHAR(messageencode, message);
-       LOG4CXX_ENCODE_CHAR(timestampencode, timestamp);
-
-       int rowcount = target->rowCount();
-       target->insertRow(rowcount);
-       target->setItem(rowcount, 0, new QTableWidgetItem(timestampencode.c_str()));
-       target->setItem(rowcount, 1, new QTableWidgetItem(event->getLevel()->toString().c_str()));
-       target->setItem(rowcount, 2, new QTableWidgetItem(messageencode.c_str()));
-       target->resizeColumnsToContents();
+       if ( this->layout == NULL ) {
+               LOG4CXX_ENCODE_CHAR(nameStr, name);
+               std::string msg("No Layout set for the appender named [ ");
+               msg.append(nameStr);
+               msg.append(" ].");
+
+               LOG4CXX_DECODE_CHAR(msgL, msg);
+               errorHandler->error(msgL);
+               return;
+       }
+
+       layout->format(message, event, p);
+       timeformat.format(timestamp, event->getTimeStamp(), p);
+       LOG4CXX_ENCODE_CHAR(messageencode, message);
+       LOG4CXX_ENCODE_CHAR(timestampencode, timestamp);
+
+       QColor rowcolor(0xff, 0xff, 0xff, 0xff);
+       if (log4cxx::Level::getFatal() == event->getLevel()) {
+               rowcolor.setRgb(0xff, 0x00, 0x22);
+       } else if (log4cxx::Level::getError() == event->getLevel()) {
+               rowcolor.setRgb(0xff, 0x00, 0x00);
+       } else if (log4cxx::Level::getWarn() == event->getLevel()) {
+               rowcolor.setRgb(0x00, 0xff, 0xff);
+       } else if (log4cxx::Level::getTrace() == event->getLevel()) {
+               rowcolor.setRgb(0xee, 0xff, 0xee);
+       }
+
+       int rowcount = target->rowCount();
+       target->insertRow(rowcount);
+       target->setItem(rowcount, 0, new QTableWidgetItem(timestampencode.c_str()));
+       target->setItem(rowcount, 1, new QTableWidgetItem(event->getLevel()->toString().c_str()));
+       target->setItem(rowcount, 2, new QTableWidgetItem(messageencode.c_str()));
+       target->item(rowcount, 0)->setBackground(rowcolor);
+       target->item(rowcount, 1)->setBackground(rowcolor);
+       target->item(rowcount, 2)->setBackground(rowcolor);
+       target->resizeColumnsToContents();
+
+       QTimer *timer = new QTimer(target);
+       timer->setSingleShot(true);
+
+       QObject::connect(timer, &QTimer::timeout, [=]() {
+                       target->scrollToItem(target->item(rowcount, 2), QAbstractItemView::PositionAtTop);
+               });
+       timer->start(10);
 }
 
 void LogDockAppender::setTarget(LogDock *target) {