Explorar o código

Class FbLogModel

Kandrashin Denis %!s(int64=12) %!d(string=hai) anos
pai
achega
dbd4f14764
Modificáronse 4 ficheiros con 117 adicións e 95 borrados
  1. 46 40
      source/fb2logs.cpp
  2. 57 16
      source/fb2logs.hpp
  3. 10 19
      source/fb2main.cpp
  4. 4 20
      source/fb2main.hpp

+ 46 - 40
source/fb2logs.cpp

@@ -1,68 +1,74 @@
 #include "fb2logs.hpp"
 
 //---------------------------------------------------------------------------
-//  FbMessage
+//  FbLogItem
 //---------------------------------------------------------------------------
 
-class FbMessagePrivate
-{
-public:
-    FbMessagePrivate()
-        : level(FbMessage::Message), row(-1), col(-1)
-    {
-    }
-
-    FbMessagePrivate(const FbMessagePrivate &other)
-        : level(other.level), msg(other.msg), row(other.row), col(other.col)
-    {
-    }
-private:
-    friend class FbMessage;
-    FbMessage::Level level;
-    QString msg;
-    int row;
-    int col;
-};
-
-FbMessage::FbMessage()
-    : d(new FbMessagePrivate)
+FbLogItem::FbLogItem(Level level, int row, int col, const QString &msg)
+    : m_level(level)
+    , m_msg(msg)
+    , m_row(row)
+    , m_col(col)
 {
 }
 
-FbMessage::FbMessage(const FbMessage &other)
-    : d(new FbMessagePrivate(*other.d))
+FbLogItem::FbLogItem(Level level, const QString &msg)
+    : m_level(level)
+    , m_msg(msg)
+    , m_row(0)
+    , m_col(0)
 {
 }
 
-FbMessage::FbMessage(const QXmlParseException &error, Level level)
-    : d(new FbMessagePrivate)
+//---------------------------------------------------------------------------
+//  FbLogList
+//---------------------------------------------------------------------------
+
+FbLogModel::FbLogModel(QObject *parent)
+    : QAbstractListModel(parent)
 {
-    d->level = level;
-    d->msg = error.message().simplified();
-    d->row = error.lineNumber();
-    d->col = error.columnNumber();
+    foreach (FbLogItem *item, m_list) delete item;
 }
 
-FbMessage::~FbMessage()
+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();
+    return QVariant();
 }
 
-QString FbMessage::msg() const
+int FbLogModel::rowCount(const QModelIndex &parent) const
 {
-    return d->msg;
+    if (parent.isValid()) return 0;
+    return m_list.count();
 }
 
-int FbMessage::level() const
+//---------------------------------------------------------------------------
+//  FbLogList
+//---------------------------------------------------------------------------
+
+FbLogList::FbLogList(QWidget *parent)
+    : QListView(parent)
 {
-    return d->level;
+    setModel(new FbLogModel(this));
+    setViewMode(ListMode);
 }
 
-int FbMessage::row() const
+//---------------------------------------------------------------------------
+//  FbLogDock
+//---------------------------------------------------------------------------
+
+FbLogDock::FbLogDock(const QString &title, QWidget *parent, Qt::WindowFlags flags)
+    : QDockWidget(title, parent, flags)
+    , m_list(new FbLogList(this))
 {
-    return d->row;
+    setFeatures(QDockWidget::AllDockWidgetFeatures);
+    setAttribute(Qt::WA_DeleteOnClose);
+    setWidget(m_list);
 }
 
-int FbMessage::col() const
+void FbLogDock::append(const QString &message)
 {
-    return d->col;
 }
+

+ 57 - 16
source/fb2logs.hpp

@@ -1,15 +1,12 @@
 #ifndef FB2LOGS_H
 #define FB2LOGS_H
 
-#include <QScopedPointer>
-#include <QXmlParseException>
+#include <QAbstractListModel>
+#include <QListView>
+#include <QDockWidget>
 
-class FbMessagePrivate;
-
-class FbMessage : public QObject
+class FbLogItem
 {
-    Q_OBJECT
-
 public:
     enum Level {
         Message,
@@ -18,20 +15,64 @@ public:
         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:
-    explicit FbMessage();
-    FbMessage(const FbMessage &other);
-    FbMessage(const QXmlParseException &error, Level level = Message);
-    ~FbMessage();
+    FbLogModel(QObject *parent = 0);
 
-    QString msg() const;
-    int level() const;
-    int row() const;
-    int col() const;
+public:
+    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
 
 private:
-    QScopedPointer<FbMessagePrivate> d;
+    QList<FbLogItem*> m_list;
+};
 
+class FbLogList: public QListView
+{
+    Q_OBJECT
+
+public:
+    explicit FbLogList(QWidget *parent = 0);
+
+    QSize sizeHint() const {
+        QSize sh = QListView::sizeHint();
+        sh.setHeight(40);
+        return sh;
+    }
+
+private:
+    QList<FbLogItem*> items;
+};
+
+class FbLogDock: public QDockWidget
+{
+    Q_OBJECT
+
+public:
+    explicit FbLogDock(const QString &title, QWidget *parent = 0, Qt::WindowFlags flags = 0);
+    void append(const QString &message);
+
+private:
+    FbLogList *m_list;
 };
 
 #endif // FB2LOGS_H

+ 10 - 19
source/fb2main.cpp

@@ -1,10 +1,12 @@
+#include "fb2main.hpp"
+
 #include <QtGui>
 #include <QtDebug>
 #include <QTreeView>
 #include <QWebFrame>
 
 #include "fb2app.hpp"
-#include "fb2main.hpp"
+#include "fb2logs.hpp"
 #include "fb2code.hpp"
 #include "fb2dlgs.hpp"
 #include "fb2dock.hpp"
@@ -21,8 +23,7 @@ FbMainWindow::FbMainWindow(const QString &filename, ViewMode mode)
     : QMainWindow()
     , noteEdit(0)
     , toolEdit(0)
-    , inspector(0)
-    , messageEdit(0)
+    , logDock(0)
     , isSwitched(false)
     , isUntitled(true)
 {
@@ -63,27 +64,17 @@ void FbMainWindow::fatal(int row, int col, const QString &msg)
 
 void FbMainWindow::logMessage(const QString &message)
 {
-    if (!messageEdit) {
-        messageEdit = new QTextEdit(this);
-        connect(messageEdit, SIGNAL(destroyed()), SLOT(logDestroyed()));
-        QDockWidget * dock = new FbLogDock(tr("Message log"), this);
-        dock->setAttribute(Qt::WA_DeleteOnClose);
-        dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
-        dock->setWidget(messageEdit);
-        addDockWidget(Qt::BottomDockWidgetArea, dock);
-        messageEdit->setMaximumHeight(80);
+    if (!logDock) {
+        logDock = new FbLogDock(tr("Message log"), this);
+        connect(logDock, SIGNAL(destroyed()), SLOT(logDestroyed()));
+        addDockWidget(Qt::BottomDockWidgetArea, logDock);
     }
-    messageEdit->append(message);
-}
-
-void FbMainWindow::logShowed()
-{
-    messageEdit->setMaximumHeight(QWIDGETSIZE_MAX);
+    logDock->append(message);
 }
 
 void FbMainWindow::logDestroyed()
 {
-    messageEdit = NULL;
+    logDock = NULL;
 }
 
 void FbMainWindow::closeEvent(QCloseEvent *event)

+ 4 - 20
source/fb2main.hpp

@@ -3,6 +3,7 @@
 
 #include <QMainWindow>
 #include <QDockWidget>
+#include <QListView>
 #include <QXmlParseException>
 
 QT_BEGIN_NAMESPACE
@@ -15,24 +16,9 @@ class QTreeView;
 class QWebInspector;
 QT_END_NAMESPACE
 
-class FbMainDock;
-
-class FbMessage;
-
-class FbLogDock: public QDockWidget
-{
-    Q_OBJECT
+class FbLogDock;
 
-public:
-    explicit FbLogDock(const QString &title, QWidget *parent = 0, Qt::WindowFlags flags = 0)
-        : QDockWidget(title, parent, flags) {}
-
-    QSize sizeHint() const {
-        QSize sh = QDockWidget::sizeHint();
-        sh.setHeight(40);
-        return sh;
-    }
-};
+class FbMainDock;
 
 class FbMainWindow : public QMainWindow
 {
@@ -64,7 +50,6 @@ private slots:
     void about();
     void documentWasModified();
     void logDestroyed();
-    void logShowed();
 
     void openSettings();
 
@@ -88,8 +73,7 @@ private:
     FbMainDock *mainDock;
     QTextEdit *noteEdit;
     QToolBar *toolEdit;
-    QWebInspector *inspector;
-    QTextEdit *messageEdit;
+    FbLogDock *logDock;
     QString curFile;
     bool isSwitched;
     bool isUntitled;