summaryrefslogtreecommitdiff
path: root/src/logbuffer.cpp
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2014-05-04 14:50:01 +0200
committerTannin <devnull@localhost>2014-05-04 14:50:01 +0200
commit6fb36d6c028d4fe88043c764e42b54df9b06f48b (patch)
tree8c23cfc17447d217d91eb170cffa5a6372f003b1 /src/logbuffer.cpp
parentea1f959ad592c1f10c5c60908e01c220aed206a5 (diff)
- main window now has a small view displaying log messages
- mod list will now be highlighted when grouping is active is active - download tooltip now supports bbcode markup in the description - bbcode translator will now translate some named colors - algorithm for detection of mod order problems is now more sophisticated - exposed more functionality to python plugins - updated to qt 4.8.6 dlls - bugfix: plugin list wasn't - bugfix: state changes in mod list wasn't always reported - bugfix: loot client will now create necessary directory - bugfix: NCC sometimes used wrong source path for extracting - bugfix: removed noisy debug message
Diffstat (limited to 'src/logbuffer.cpp')
-rw-r--r--src/logbuffer.cpp82
1 files changed, 79 insertions, 3 deletions
diff --git a/src/logbuffer.cpp b/src/logbuffer.cpp
index 689d2b55..b9fa9417 100644
--- a/src/logbuffer.cpp
+++ b/src/logbuffer.cpp
@@ -29,7 +29,7 @@ QMutex LogBuffer::s_Mutex;
LogBuffer::LogBuffer(int messageCount, QtMsgType minMsgType, const QString &outputFileName)
- : QObject(NULL), m_OutFileName(outputFileName), m_ShutDown(false),
+ : QAbstractItemModel(NULL), m_OutFileName(outputFileName), m_ShutDown(false),
m_MinMsgType(minMsgType), m_NumMessages(0)
{
m_Messages.resize(messageCount);
@@ -51,7 +51,16 @@ LogBuffer::~LogBuffer()
void LogBuffer::logMessage(QtMsgType type, const QString &message)
{
if (type >= m_MinMsgType) {
- m_Messages.at(m_NumMessages % m_Messages.size()) = message;
+ Message msg = { type, QTime::currentTime(), message };
+ if (m_NumMessages < m_Messages.size()) {
+ beginInsertRows(QModelIndex(), m_NumMessages, m_NumMessages + 1);
+ }
+ m_Messages.at(m_NumMessages % m_Messages.size()) = msg;
+ if (m_NumMessages < m_Messages.size()) {
+ endInsertRows();
+ } else {
+ emit dataChanged(createIndex(0, 0), createIndex(m_Messages.size(), 0));
+ }
++m_NumMessages;
if (type >= QtCriticalMsg) {
write();
@@ -77,7 +86,7 @@ void LogBuffer::write() const
unsigned int i = (m_NumMessages > m_Messages.size()) ? m_NumMessages - m_Messages.size()
: 0U;
for (; i < m_NumMessages; ++i) {
- file.write(m_Messages.at(i % m_Messages.size()).toUtf8());
+ file.write(m_Messages.at(i % m_Messages.size()).toString().toUtf8());
file.write("\r\n");
}
::SetLastError(lastError);
@@ -125,6 +134,67 @@ char LogBuffer::msgTypeID(QtMsgType type)
}
}
+QModelIndex LogBuffer::index(int row, int column, const QModelIndex&) const
+{
+ return createIndex(row, column, row);
+}
+
+QModelIndex LogBuffer::parent(const QModelIndex&) const
+{
+ return QModelIndex();
+}
+
+int LogBuffer::rowCount(const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return 0;
+ else
+ return std::min(m_NumMessages, m_Messages.size());
+}
+
+int LogBuffer::columnCount(const QModelIndex&) const
+{
+ return 2;
+}
+
+
+QVariant LogBuffer::data(const QModelIndex &index, int role) const
+{
+ unsigned offset = m_NumMessages < m_Messages.size() ? 0
+ : m_NumMessages - m_Messages.size();
+ unsigned int msgIndex = (offset + index.row()) % m_Messages.size();
+ switch (role) {
+ case Qt::DisplayRole: {
+ if (index.column() == 0) {
+ return m_Messages.at(msgIndex).time;
+ } else if (index.column() == 1) {
+ return m_Messages.at(msgIndex).message;
+ }
+ } break;
+ case Qt::DecorationRole: {
+ if (index.column() == 1) {
+ switch (m_Messages.at(msgIndex).type) {
+ case QtDebugMsg: return QIcon(":/MO/gui/information");
+ case QtWarningMsg: return QIcon(":/MO/gui/warning");
+ case QtCriticalMsg: return QIcon(":/MO/gui/important");
+ case QtFatalMsg: return QIcon(":/MO/gui/problem");
+ }
+ }
+ } break;
+ case Qt::UserRole: {
+ if (index.column() == 1) {
+ switch (m_Messages.at(msgIndex).type) {
+ case QtDebugMsg: return "D";
+ case QtWarningMsg: return "W";
+ case QtCriticalMsg: return "C";
+ case QtFatalMsg: return "F";
+ }
+ }
+ } break;
+ }
+ return QVariant();
+}
+
void LogBuffer::log(QtMsgType type, const char *message)
{
QMutexLocker guard(&s_Mutex);
@@ -171,3 +241,9 @@ void log(const char *format, ...)
va_end(argList);
}
+
+
+QString LogBuffer::Message::toString() const
+{
+ return QString("%1 [%2] %3").arg(time.toString()).arg(msgTypeID(type)).arg(message);
+}