From 377794bb67eae58effb6672f6df8ac281e98720a Mon Sep 17 00:00:00 2001 From: Kandrashin Denis Date: Sun, 11 Nov 2012 18:57:47 +0400 Subject: Show log messages --- source/fb2app.cpp | 3 ++- source/fb2app.hpp | 2 +- source/fb2logs.cpp | 54 ++++++++++++++++++++++++++++++++--------------- source/fb2logs.hpp | 61 +++++++++++++++++++++++++++--------------------------- source/fb2main.cpp | 10 ++++----- source/fb2main.hpp | 4 +++- 6 files changed, 79 insertions(+), 55 deletions(-) diff --git a/source/fb2app.cpp b/source/fb2app.cpp index df6d716..010a3ab 100644 --- a/source/fb2app.cpp +++ b/source/fb2app.cpp @@ -3,6 +3,7 @@ #include #include "fb2app.hpp" +#include "fb2logs.hpp" #include "fb2main.hpp" #ifndef PACKAGE_NAME @@ -38,7 +39,7 @@ void FbApplication::handleMessage(QtMsgType type, const char *msg) abort(); } */ - emit logMessage( QString::fromUtf8(msg)); + emit logMessage(type, QString::fromUtf8(msg)); } static void fb2MessageHandler(QtMsgType type, const char *msg) diff --git a/source/fb2app.hpp b/source/fb2app.hpp index b2a04ee..8715377 100644 --- a/source/fb2app.hpp +++ b/source/fb2app.hpp @@ -16,7 +16,7 @@ public: static QString lastCommit(); signals: - void logMessage(const QString &message); + void logMessage(QtMsgType type, const QString &message); }; diff --git a/source/fb2logs.cpp b/source/fb2logs.cpp index cf3d05c..d42b11f 100644 --- a/source/fb2logs.cpp +++ b/source/fb2logs.cpp @@ -1,27 +1,24 @@ #include "fb2logs.hpp" +#include "fb2utils.h" + //--------------------------------------------------------------------------- -// FbLogItem +// FbLogModel::FbLogItem //--------------------------------------------------------------------------- -FbLogItem::FbLogItem(Level level, int row, int col, const QString &msg) - : m_level(level) - , m_msg(msg) - , m_row(row) - , m_col(col) -{ -} - -FbLogItem::FbLogItem(Level level, const QString &msg) - : m_level(level) - , m_msg(msg) - , m_row(0) - , m_col(0) +QVariant FbLogModel::FbLogItem::icon() const { + switch (m_type) { + case QtDebugMsg: return FbIcon("dialog-information"); + case QtWarningMsg: return FbIcon("dialog-warning"); + case QtCriticalMsg: return FbIcon("dialog-error"); + case QtFatalMsg: return FbIcon("dialog-error"); + } + return QVariant(); } //--------------------------------------------------------------------------- -// FbLogList +// FbLogModel //--------------------------------------------------------------------------- FbLogModel::FbLogModel(QObject *parent) @@ -35,6 +32,10 @@ QVariant FbLogModel::data(const QModelIndex &index, int role) const int row = index.row(); if (row < 0) return QVariant(); if (row >= m_list.count()) return QVariant(); + switch (role) { + case Qt::DisplayRole: return m_list.at(row)->msg(); + case Qt::DecorationRole: return m_list.at(row)->icon(); + } return QVariant(); } @@ -44,6 +45,21 @@ int FbLogModel::rowCount(const QModelIndex &parent) const return m_list.count(); } +void FbLogModel::add(QtMsgType type, int row, int col, const QString &msg) +{ + int count = m_list.count(); + QModelIndex parent = QModelIndex(); + beginInsertRows(parent, count, count); + m_list.append(new FbLogItem(type, row, col, msg)); + endInsertRows(); + emit changeCurrent(createIndex(count, 0)); +} + +void FbLogModel::add(QtMsgType type, const QString &msg) +{ + add(type, 0, 0, msg); +} + //--------------------------------------------------------------------------- // FbLogList //--------------------------------------------------------------------------- @@ -51,7 +67,7 @@ int FbLogModel::rowCount(const QModelIndex &parent) const FbLogList::FbLogList(QWidget *parent) : QListView(parent) { - setModel(new FbLogModel(this)); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setViewMode(ListMode); } @@ -61,14 +77,18 @@ FbLogList::FbLogList(QWidget *parent) FbLogDock::FbLogDock(const QString &title, QWidget *parent, Qt::WindowFlags flags) : QDockWidget(title, parent, flags) + , m_model(new FbLogModel(this)) , m_list(new FbLogList(this)) { + m_list->setModel(m_model); + connect(m_model, SIGNAL(changeCurrent(QModelIndex)), m_list, SLOT(setCurrentIndex(QModelIndex))); setFeatures(QDockWidget::AllDockWidgetFeatures); setAttribute(Qt::WA_DeleteOnClose); setWidget(m_list); } -void FbLogDock::append(const QString &message) +void FbLogDock::append(QtMsgType type, const QString &message) { + m_model->add(type, message); } diff --git a/source/fb2logs.hpp b/source/fb2logs.hpp index 8760c8a..a45a959 100644 --- a/source/fb2logs.hpp +++ b/source/fb2logs.hpp @@ -5,43 +5,46 @@ #include #include -class FbLogItem -{ -public: - enum Level { - Message, - Warring, - Error, - Fatal - }; - - FbLogItem(Level level, int row, int col, const QString &msg); - FbLogItem(Level level, const QString &msg); - - Level level() const {return m_level; } - const QString & msg() const { return m_msg; } - int row() const {return m_row; } - int col() const {return m_row; } - -private: - Level m_level; - QString m_msg; - int m_row; - int m_col; - -}; - class FbLogModel : public QAbstractListModel { Q_OBJECT public: FbLogModel(QObject *parent = 0); + void add(QtMsgType type, int row, int col, const QString &msg); + void add(QtMsgType type, const QString &msg); public: virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; +signals: + void changeCurrent(const QModelIndex &index); + +private: + class FbLogItem + { + public: + FbLogItem(QtMsgType type, int row, int col, const QString &msg) + : m_type(type), m_msg(msg), m_row(row), m_col(col) {} + + FbLogItem(QtMsgType type, const QString &msg) + : m_type(type), m_msg(msg), m_row(0), m_col(0) {} + + const QString & msg() const { return m_msg; } + QtMsgType type() const { return m_type; } + int row() const { return m_row; } + int col() const { return m_row; } + QVariant icon() const; + + private: + QtMsgType m_type; + QString m_msg; + int m_row; + int m_col; + + }; + private: QList m_list; }; @@ -58,9 +61,6 @@ public: sh.setHeight(40); return sh; } - -private: - QList items; }; class FbLogDock: public QDockWidget @@ -69,9 +69,10 @@ class FbLogDock: public QDockWidget public: explicit FbLogDock(const QString &title, QWidget *parent = 0, Qt::WindowFlags flags = 0); - void append(const QString &message); + void append(QtMsgType type, const QString &message); private: + FbLogModel *m_model; FbLogList *m_list; }; diff --git a/source/fb2main.cpp b/source/fb2main.cpp index 4f834ad..a55aad1 100644 --- a/source/fb2main.cpp +++ b/source/fb2main.cpp @@ -49,27 +49,27 @@ FbMainWindow::FbMainWindow(const QString &filename, ViewMode mode) void FbMainWindow::warning(int row, int col, const QString &msg) { - logMessage(msg.simplified()); + logMessage(QtWarningMsg, msg.simplified()); } void FbMainWindow::error(int row, int col, const QString &msg) { - logMessage(msg.simplified()); + logMessage(QtCriticalMsg, msg.simplified()); } void FbMainWindow::fatal(int row, int col, const QString &msg) { - logMessage(msg.simplified()); + logMessage(QtFatalMsg, msg.simplified()); } -void FbMainWindow::logMessage(const QString &message) +void FbMainWindow::logMessage(QtMsgType type, const QString &message) { if (!logDock) { logDock = new FbLogDock(tr("Message log"), this); connect(logDock, SIGNAL(destroyed()), SLOT(logDestroyed())); addDockWidget(Qt::BottomDockWidgetArea, logDock); } - logDock->append(message); + logDock->append(type, message); } void FbMainWindow::logDestroyed() diff --git a/source/fb2main.hpp b/source/fb2main.hpp index 43881d0..49b62d5 100644 --- a/source/fb2main.hpp +++ b/source/fb2main.hpp @@ -20,6 +20,8 @@ class FbLogDock; class FbMainDock; +#include "fb2logs.hpp" + class FbMainWindow : public QMainWindow { Q_OBJECT @@ -38,7 +40,7 @@ public slots: void warning(int row, int col, const QString &msg); void error(int row, int col, const QString &msg); void fatal(int row, int col, const QString &msg); - void logMessage(const QString &message); + void logMessage(QtMsgType type, const QString &message); void status(const QString &text); private slots: -- cgit v1.2.3