~ubuntu-branches/ubuntu/trusty/quassel/trusty

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/***************************************************************************
 *   Copyright (C) 2005-2014 by the Quassel Project                        *
 *   devel@quassel-irc.org                                                 *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) version 3.                                           *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   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.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
 ***************************************************************************/

#ifndef MESSAGEMODEL_H_
#define MESSAGEMODEL_H_

#include <QAbstractItemModel>
#include <QDateTime>
#include <QTimer>

#include "message.h"
#include "types.h"

class MessageModelItem;
struct MsgId;

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
    };

    MessageModel(QObject *parent);

    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 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;

    bool insertMessage(const Message &, bool fakeMsg = false);
    void insertMessages(const QList<Message> &);

    void clear();

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<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<Message> _messageBuffer;
    QTimer _dayChangeTimer;
    QDateTime _nextDayChange;
    QHash<BufferId, int> _messagesWaiting;
};


// 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() {}
    inline virtual ~MessageModelItem() {}

    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;
};


QDebug operator<<(QDebug dbg, const MessageModelItem &msgItem);

#endif