浏览代码

Show log messages

Kandrashin Denis 12 年之前
父节点
当前提交
377794bb67
共有 6 个文件被更改,包括 79 次插入55 次删除
  1. 2 1
      source/fb2app.cpp
  2. 1 1
      source/fb2app.hpp
  3. 37 17
      source/fb2logs.cpp
  4. 31 30
      source/fb2logs.hpp
  5. 5 5
      source/fb2main.cpp
  6. 3 1
      source/fb2main.hpp

+ 2 - 1
source/fb2app.cpp

@@ -3,6 +3,7 @@
 #include <QTranslator>
 
 #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)

+ 1 - 1
source/fb2app.hpp

@@ -16,7 +16,7 @@ public:
     static QString lastCommit();
 
 signals:
-    void logMessage(const QString &message);
+    void logMessage(QtMsgType type, const QString &message);
 };
 
 

+ 37 - 17
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);
 }
 

+ 31 - 30
source/fb2logs.hpp

@@ -5,43 +5,46 @@
 #include <QListView>
 #include <QDockWidget>
 
-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<FbLogItem*> m_list;
 };
@@ -58,9 +61,6 @@ public:
         sh.setHeight(40);
         return sh;
     }
-
-private:
-    QList<FbLogItem*> 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;
 };
 

+ 5 - 5
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()

+ 3 - 1
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: