Switch some dirty hacking to using real infrastructure. A Chatline now contains three...
[quassel.git] / src / client / messagemodel.h
index 32e4438..5b2786a 100644 (file)
 #define MESSAGEMODEL_H_
 
 #include <QAbstractItemModel>
+#include <QDateTime>
 
-class MessageItem;
+#include "message.h"
+#include "types.h"
+
+class MessageModelItem;
+class MsgId;
 
 class MessageModel : public QAbstractItemModel {
   Q_OBJECT
 
   public:
-    enum MessageRoles {
+    enum MessageRole {
       MsgIdRole = Qt::UserRole,
       BufferIdRole,
       TypeRole,
       FlagsRole,
       TimestampRole,
+      DisplayRole,
+      FormatRole,
       UserRole
     };
 
+    enum ColumnType {
+      TimestampColumn, SenderColumn, ContentsColumn, UserColumnType
+    };
+
     MessageModel(QObject *parent);
     virtual ~MessageModel();
 
-    inline QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const { return createIndex(row, column); }
-    inline QModelIndex parent(const QModelIndex &index) const { return QModelIndex(); }
-    inline int rowCount(const QModelIndex &parent = QModelIndex()) const { return _messageList.count(); }
-    inline int columnCount(const QModelIndex &parent = QModelIndex()) const { return 3; }
+    inline QModelIndex index(int row, int column, const QModelIndex &/*parent*/ = QModelIndex()) const { return createIndex(row, column); }
+    inline QModelIndex parent(const QModelIndex &) const { return QModelIndex(); }
+    inline int rowCount(const QModelIndex &/*parent*/ = QModelIndex()) const { return _messageList.count(); }
+    inline int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const { return 3; }
 
     virtual QVariant data(const QModelIndex &index, int role) const;
     virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
@@ -55,23 +66,36 @@ class MessageModel : public QAbstractItemModel {
     void insertMessages(const QList<Message> &);
 
   protected:
-    virtual MessageItem *createMessageItem(const Message &) = 0;
+    virtual MessageModelItem *createMessageModelItem(const Message &) = 0;
 
   private:
-    QList<MessageItem *> _messageList;
+    QList<MessageModelItem *> _messageList;
+
+    int indexForId(MsgId);
 
 };
 
-class MessageItem {
-      
+class MessageModelItem {
+
   public:
-    MessageItem(const Message &);
-    virtual ~MessageItem();
 
+    //! Creates a MessageModelItem from a Message object.
+    /** This baseclass implementation takes care of all Message data *except* the stylable strings.
+     *  Subclasses need to provide Qt::DisplayRole at least, which should describe the plaintext
+     *  strings without formattings (e.g. for searching purposes).
+     */
+    MessageModelItem(const Message &);
+    virtual ~MessageModelItem();
 
-    virtual QVariant data(int column, int role) const = 0;
+    virtual QVariant data(int column, int role) const;
     virtual bool setData(int column, const QVariant &value, int role) = 0;
 
+  private:
+    QDateTime _timestamp;
+    MsgId _msgId;
+    BufferId _bufferId;
+    Message::Type _type;
+    Message::Flags _flags;
 };
 
 #endif