fixing crash on disconnect
[quassel.git] / src / client / messagemodel.h
index a9ae901..0d540cd 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel IRC Team                         *
+ *   Copyright (C) 2005-09 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -44,6 +44,7 @@ public:
     TimestampRole,
     FormatRole,
     ColumnTypeRole,
+    RedirectedToRole,
     UserRole
   };
 
@@ -55,7 +56,7 @@ public:
 
   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 rowCount(const QModelIndex &parent = QModelIndex()) const { return parent.isValid() ? 0 : messageCount(); }
   inline int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const { return 3; }
 
   virtual QVariant data(const QModelIndex &index, int role) const;
@@ -68,19 +69,48 @@ public:
 
   void clear();
 
+public slots:
+  void requestBacklog(BufferId bufferId);
+  void messagesReceived(BufferId bufferId, int count);
+  void buffersPermanentlyMerged(BufferId bufferId1, BufferId bufferId2);
+
 protected:
-  virtual MessageModelItem *createMessageModelItem(const Message &) = 0;
+//   virtual MessageModelItem *createMessageModelItem(const Message &) = 0;
+
+  virtual int messageCount() const = 0;
+  virtual bool messagesIsEmpty() const = 0;
+  virtual const MessageModelItem *messageItemAt(int i) const = 0;
+  virtual MessageModelItem *messageItemAt(int i) = 0;
+  virtual const MessageModelItem *firstMessageItem() const= 0;
+  virtual MessageModelItem *firstMessageItem() = 0;
+  virtual const MessageModelItem *lastMessageItem() const= 0;
+  virtual MessageModelItem *lastMessageItem() = 0;
+  virtual void insertMessage__(int pos, const Message &) = 0;
+  virtual void insertMessages__(int pos, const QList<Message> &) = 0;
+  virtual void removeMessageAt(int i) = 0;
+  virtual void removeAllMessages() = 0;
+  virtual Message takeMessageAt(int i) = 0;
+
   virtual void customEvent(QEvent *event);
 
+private slots:
+  void changeOfDay();
+
 private:
   void insertMessageGroup(const QList<Message> &);
   int insertMessagesGracefully(const QList<Message> &); // inserts as many contiguous msgs as possible. returns numer of inserted msgs.
   int indexForId(MsgId);
 
-  QList<MessageModelItem *> _messageList;
+  //  QList<MessageModelItem *> _messageList;
   QList<Message> _messageBuffer;
+  QTimer _dayChangeTimer;
+  QDateTime _nextDayChange;
+  QHash<BufferId, int> _messagesWaiting;
 };
 
+// **************************************************
+//  MessageModelItem
+// **************************************************
 class MessageModelItem {
 public:
   //! Creates a MessageModelItem from a Message object.
@@ -88,18 +118,20 @@ public:
    *  Subclasses need to provide Qt::DisplayRole at least, which should describe the plaintext
    *  strings without formattings (e.g. for searching purposes).
    */
-  MessageModelItem(const Message &);
+  MessageModelItem() {}
   inline virtual ~MessageModelItem() {}
 
   virtual QVariant data(int column, int role) const;
-  virtual bool setData(int column, const QVariant &value, int role) = 0;
-
-  inline const QDateTime &timeStamp() const { return _timestamp; }
-  inline MsgId msgId() const { return _msgId; }
-  inline BufferId bufferId() const { return _bufferId; }
-  inline Message::Type msgType() const { return _type; }
-  inline Message::Flags msgFlags() const { return _flags; }
-  
+  virtual bool setData(int column, const QVariant &value, int role);
+
+  virtual const Message &message() const = 0;
+  virtual const QDateTime &timestamp() const = 0;
+  virtual const MsgId &msgId() const = 0;
+  virtual const BufferId &bufferId() const = 0;
+  virtual void setBufferId(BufferId bufferId) = 0;
+  virtual Message::Type msgType() const = 0;
+  virtual Message::Flags msgFlags() const = 0;
+
   // For sorting
   bool operator<(const MessageModelItem &) const;
   bool operator==(const MessageModelItem &) const;
@@ -107,11 +139,10 @@ public:
   static bool lessThan(const MessageModelItem *m1, const MessageModelItem *m2);
 
 private:
-  QDateTime _timestamp;
-  MsgId _msgId;
-  BufferId _bufferId;
-  Message::Type _type;
-  Message::Flags _flags;
+  Message _msg;
+  BufferId _redirectedTo;
 };
 
+QDebug operator<<(QDebug dbg, const MessageModelItem &msgItem);
+
 #endif