X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fmessagemodel.h;h=1bafe22f81c3d0ea78d5f9a8705218e606a313f0;hp=71c1c8124da48e6e215c0602cb644a0fb378b5cd;hb=921e54680da16fcf2adb7a90506875aceb6633a4;hpb=e28ac2cd72a6be486f9f11d2a526f32ffea061b9 diff --git a/src/client/messagemodel.h b/src/client/messagemodel.h index 71c1c812..1bafe22f 100644 --- a/src/client/messagemodel.h +++ b/src/client/messagemodel.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel IRC Team * + * Copyright (C) 2005-2015 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #ifndef MESSAGEMODEL_H_ @@ -23,6 +23,7 @@ #include #include +#include #include "message.h" #include "types.h" @@ -30,75 +31,138 @@ class MessageModelItem; struct MsgId; -class MessageModel : public QAbstractItemModel { - Q_OBJECT - - public: - enum MessageRole { - MsgIdRole = Qt::UserRole, - BufferIdRole, - TypeRole, - FlagsRole, - TimestampRole, - DisplayRole, - FormatRole, - ColumnTypeRole, - UserRole +class MessageModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + enum MessageModelRole { + DisplayRole = Qt::DisplayRole, + EditRole = Qt::EditRole, + BackgroundRole = Qt::BackgroundRole, + MessageRole = Qt::UserRole, + MsgIdRole, + BufferIdRole, + TypeRole, + FlagsRole, + TimestampRole, + FormatRole, + ColumnTypeRole, + RedirectedToRole, + UserRole }; enum ColumnType { - TimestampColumn, SenderColumn, ContentsColumn, UserColumnType + 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 index(int row, int column, const QModelIndex &parent = QModelIndex()) const; 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; } + 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; virtual bool setData(const QModelIndex &index, const QVariant &value, int role); //virtual Qt::ItemFlags flags(const QModelIndex &index) const; - void insertMessage(const Message &); + bool insertMessage(const Message &, bool fakeMsg = false); void insertMessages(const QList &); void clear(); - protected: - virtual MessageModelItem *createMessageModelItem(const Message &) = 0; - - private: - QList _messageList; - +signals: + void finishedBacklogFetch(BufferId bufferId); + +public slots: + void requestBacklog(BufferId bufferId); + void messagesReceived(BufferId bufferId, int count); + void buffersPermanentlyMerged(BufferId bufferId1, BufferId bufferId2); + void insertErrorMessage(BufferInfo bufferInfo, const QString &errorString); + +protected: +// 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 &) = 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 &); + int insertMessagesGracefully(const QList &); // inserts as many contiguous msgs as possible. returns numer of inserted msgs. int indexForId(MsgId); + // QList _messageList; + QList _messageBuffer; + QTimer _dayChangeTimer; + QDateTime _nextDayChange; + QHash _messagesWaiting; }; -class MessageModelItem { - public: +// inlines +QModelIndex MessageModel::index(int row, int column, const QModelIndex &parent) const +{ + if (row < 0 || row >= rowCount(parent) || column < 0 || column >= columnCount(parent)) + return QModelIndex(); + + return createIndex(row, column); +} + +// ************************************************** +// MessageModelItem +// ************************************************** +class MessageModelItem +{ +public: //! 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(); + MessageModelItem() {} + inline virtual ~MessageModelItem() {} 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; + virtual bool setData(int column, const QVariant &value, int role); + + virtual const Message &message() const = 0; + virtual const QDateTime ×tamp() 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; + bool operator>(const MessageModelItem &) const; + static bool lessThan(const MessageModelItem *m1, const MessageModelItem *m2); + +private: + BufferId _redirectedTo; }; + +QDebug operator<<(QDebug dbg, const MessageModelItem &msgItem); + #endif