X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fclient%2Fmessagemodel.cpp;h=28872dc7edac30cba7af997c0d2bfa8e2e20d458;hb=22128f214112de5e4f3111e0a90f7d5d99e82dac;hp=41701c3274c157962e9ee2c4191051fc37d45721;hpb=e178f81f44f5e305315f7755ca404c2a5f992711;p=quassel.git diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index 41701c32..28872dc7 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -76,10 +76,7 @@ bool MessageModel::insertMessage(const Message &msg, bool fakeMsg) { return false; } - MessageModelItem *item = createMessageModelItem(msg); - beginInsertRows(QModelIndex(), idx, idx); - _messageList.insert(idx, item); - endInsertRows(); + insertMessageGroup(QList() << msg); return true; } @@ -102,21 +99,31 @@ void MessageModel::insertMessages(const QList &msglist) { } void MessageModel::insertMessageGroup(const QList &msglist) { + // the msglist can be assumed to be non empty int idx = indexForId(msglist.first().msgId()); + int start = idx; + int end = idx + msglist.count() - 1; + MessageModelItem *dayChangeItem = 0; + if(idx > 0) { int prevIdx = idx - 1; if(_messageList[prevIdx]->msgType() == Message::DayChange && _messageList[prevIdx]->timeStamp() > msglist.value(0).timestamp()) { beginRemoveRows(QModelIndex(), prevIdx, prevIdx); MessageModelItem *oldItem = _messageList.takeAt(prevIdx); + if(msglist.last().timestamp() < oldItem->timeStamp()) { + // we have to reinsert it (with changed msgId -> thus we need to recreate it) + Message dayChangeMsg = Message::ChangeOfDay(oldItem->timeStamp()); + dayChangeMsg.setMsgId(msglist.last().msgId()); + dayChangeItem = createMessageModelItem(dayChangeMsg); + } delete oldItem; endRemoveRows(); idx--; } } - Message dayChangeMsg; - bool needsDayChangeMsg = false; - if(idx < _messageList.count() && _messageList[idx]->msgType() != Message::DayChange) { + + if(!dayChangeItem && idx < _messageList.count() && _messageList[idx]->msgType() != Message::DayChange) { QDateTime nextTs = _messageList[idx]->timeStamp(); QDateTime prevTs = msglist.last().timestamp(); nextTs.setTimeSpec(Qt::UTC); @@ -126,20 +133,22 @@ void MessageModel::insertMessageGroup(const QList &msglist) { if(nextDay != prevDay) { nextTs.setTime_t(nextDay * 86400); nextTs.setTimeSpec(Qt::LocalTime); - dayChangeMsg = Message::ChangeOfDay(nextTs); + Message dayChangeMsg = Message::ChangeOfDay(nextTs); dayChangeMsg.setMsgId(msglist.last().msgId()); - needsDayChangeMsg = true; + dayChangeItem = createMessageModelItem(dayChangeMsg); } } - int start = idx; - int end = idx + msglist.count() - 1; + + if(dayChangeItem) + end++; + beginInsertRows(QModelIndex(), start, end); foreach(Message msg, msglist) { _messageList.insert(idx, createMessageModelItem(msg)); idx++; } - if(needsDayChangeMsg) { - _messageList.insert(idx, createMessageModelItem(dayChangeMsg)); + if(dayChangeItem) { + _messageList.insert(idx, dayChangeItem); } endInsertRows(); }