diff -U 3 -H -d -r -N -x '*~' -- tmpfs/quassel/src/client/messagemodel.cpp home/sphilips/projects/quassel/src/client/messagemodel.cpp --- tmpfs/quassel/src/client/messagemodel.cpp 2008-08-30 16:22:13.000000000 +0000 +++ home/sphilips/projects/quassel/src/client/messagemodel.cpp 2008-08-30 22:46:53.000000000 +0000 @@ -51,6 +51,8 @@ return false; } + + bool MessageModel::insertMessage(const Message &msg, bool fakeMsg) { MsgId id = msg.msgId(); int idx = indexForId(id); @@ -66,13 +68,49 @@ return true; } + +void MessageModel::insertMessageGroup(const QList &msglist) { + if(msglist.isEmpty()) return; + + int idx = indexForId(msglist.first().msgId()); + beginInsertRows(QModelIndex(), idx, idx+msglist.count()-1); + + foreach(Message msg, msglist) { + _messageList.insert(idx, createMessageModelItem(msg)); + idx++; + } + + endInsertRows(); +} + + void MessageModel::insertMessages(const QList &msglist) { if(msglist.isEmpty()) return; - // FIXME make this more efficient by grouping msgs - foreach(Message msg, msglist) - insertMessage(msg); + + //QTime start = QTime::currentTime(); + + int idx = indexForId(msglist.first().msgId()); + QList grouplist; + + MsgId id = idx < _messageList.count() ? _messageList.value(idx)->data(0, MsgIdRole).value() : NULL; + + foreach(Message msg, msglist) { + if (id != NULL && msg.msgId() > id) { + insertMessageGroup(grouplist); + idx += indexForId(msg.msgId()); + grouplist.clear(); + id = idx < _messageList.count() ? _messageList.value(idx)->data(0, MsgIdRole).value() : NULL; + } + grouplist.append(msg); + } + + if (!grouplist.isEmpty()) + insertMessageGroup(grouplist); + + //qDebug() << "Inserted Group: " << msglist.count() << " items in " << start.msecsTo(QTime::currentTime()) << " msec"; } + void MessageModel::clear() { beginRemoveRows(QModelIndex(), 0, rowCount() - 1); qDeleteAll(_messageList); @@ -80,6 +118,7 @@ endRemoveRows(); } + // returns index of msg with given Id or of the next message after that (i.e., the index where we'd insert this msg) int MessageModel::indexForId(MsgId id) { if(_messageList.isEmpty() || id <= _messageList.value(0)->data(0, MsgIdRole).value()) return 0; @@ -119,3 +158,20 @@ } } + +// Stuff for later +bool MessageModelItem::lessThan(const MessageModelItem *m1, const MessageModelItem *m2){ + return (*m1) < (*m2); +} + +bool MessageModelItem::operator<(const MessageModelItem &other) const { + return _msgId < other._msgId; +} + +bool MessageModelItem::operator==(const MessageModelItem &other) const { + return _msgId == other._msgId; +} + +bool MessageModelItem::operator>(const MessageModelItem &other) const { + return _msgId > other._msgId; +} diff -U 3 -H -d -r -N -x '*~' -- tmpfs/quassel/src/client/messagemodel.h home/sphilips/projects/quassel/src/client/messagemodel.h --- tmpfs/quassel/src/client/messagemodel.h 2008-08-30 16:22:13.000000000 +0000 +++ home/sphilips/projects/quassel/src/client/messagemodel.h 2008-08-30 22:10:12.000000000 +0000 @@ -65,6 +65,7 @@ bool insertMessage(const Message &, bool fakeMsg = false); void insertMessages(const QList &); + void insertMessageGroup(const QList &); void clear(); @@ -73,7 +74,6 @@ private: QList _messageList; - int indexForId(MsgId); }; @@ -96,6 +96,12 @@ inline Message::Type msgType() const { return _type; } inline Message::Flags msgFlags() const { return _flags; } + // 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: QDateTime _timestamp; MsgId _msgId;