X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fclient%2Fmessagemodel.h;h=fd04a75ed23974461382a73497686f491a4220a0;hb=6c561d2b7b1bb303cfcd8a013179b1838d315910;hp=32e4438e8f3696d3783fb9ef0e25753f2303a41c;hpb=16c2a9940b223cf5538efdcb8a6eb011b8258150;p=quassel.git diff --git a/src/client/messagemodel.h b/src/client/messagemodel.h index 32e4438e..fd04a75e 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-2020 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,63 +15,158 @@ * 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_ -#define MESSAGEMODEL_H_ +#pragma once + +#include "client-export.h" #include +#include +#include + +#include "message.h" +#include "types.h" + +class MessageModelItem; +struct MsgId; + +class CLIENT_EXPORT 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 + }; -class MessageItem; + enum ColumnType + { + TimestampColumn, + SenderColumn, + ContentsColumn, + UserColumnType + }; -class MessageModel : public QAbstractItemModel { - Q_OBJECT + MessageModel(QObject* parent); - public: - enum MessageRoles { - MsgIdRole = Qt::UserRole, - BufferIdRole, - TypeRole, - FlagsRole, - TimestampRole, - UserRole - }; + inline QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override; + inline QModelIndex parent(const QModelIndex&) const override { return {}; } + inline int rowCount(const QModelIndex& parent = QModelIndex()) const override { return parent.isValid() ? 0 : messageCount(); } + inline int columnCount(const QModelIndex& /*parent*/ = QModelIndex()) const override { return 3; } - MessageModel(QObject *parent); - virtual ~MessageModel(); + QVariant data(const QModelIndex& index, int role) const override; + bool setData(const QModelIndex& index, const QVariant& value, int role) override; - 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; } + // virtual Qt::ItemFlags flags(const QModelIndex &index) const; - virtual QVariant data(const QModelIndex &index, int role) const; - virtual bool setData(const QModelIndex &index, const QVariant &value, int role); + bool insertMessage(const Message&, bool fakeMsg = false); + void insertMessages(const QList&); - //virtual Qt::ItemFlags flags(const QModelIndex &index) const; + void clear(); - void insertMessage(const Message &); - void insertMessages(const QList &); +signals: + void finishedBacklogFetch(BufferId bufferId); - protected: - virtual MessageItem *createMessageItem(const Message &) = 0; +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); - private: - QList _messageList; +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; + + void customEvent(QEvent* event) override; -class MessageItem { - - public: - MessageItem(const Message &); - virtual ~MessageItem(); +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); - virtual QVariant data(int column, int role) const = 0; - virtual bool setData(int column, const QVariant &value, int role) = 0; + // QList _messageList; + QList _messageBuffer; + QTimer _dayChangeTimer; + QDateTime _nextDayChange; + QHash _messagesWaiting; + + /// Period of time for one day in milliseconds + /// 24 hours * 60 minutes * 60 seconds * 1000 milliseconds + const qint64 DAY_IN_MSECS = 24 * 60 * 60 * 1000; +}; +// inlines +QModelIndex MessageModel::index(int row, int column, const QModelIndex& parent) const +{ + if (row < 0 || row >= rowCount(parent) || column < 0 || column >= columnCount(parent)) + return {}; + + return createIndex(row, column); +} + +// ************************************************** +// MessageModelItem +// ************************************************** +//! 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). + */ +class CLIENT_EXPORT MessageModelItem +{ +public: + inline virtual ~MessageModelItem() = default; + + virtual QVariant data(int column, int role) const; + 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; + bool operator>(const MessageModelItem&) const; + static bool lessThan(const MessageModelItem* m1, const MessageModelItem* m2); + +private: + BufferId _redirectedTo; }; -#endif +QDebug operator<<(QDebug dbg, const MessageModelItem& msgItem);