X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fmessagemodel.cpp;h=d10a9bcc1f9ea2043dd1736b79bc64f7b694263f;hp=76943d4ca71df22798cf5c811b1bf040334d9d91;hb=86bd6b1ffb870e65af6d830a2ea16471c348ed5a;hpb=86831c8857f0a729580cee547e10c9621d50c780 diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index 76943d4c..d10a9bcc 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -112,34 +112,25 @@ void MessageModel::insertMessageGroup(const QList &msglist) { int start = indexForId(msglist.first().msgId()); int end = start + msglist.count() - 1; Message dayChangeMsg; -// MessageModelItem *dayChangeItem = 0; - bool relocatedMsg = false; + if(start > 0) { // check if the preceeding msg is a daychange message and if so if // we have to drop or relocate it at the end of this chunk int prevIdx = start - 1; if(messageItemAt(prevIdx)->msgType() == Message::DayChange && messageItemAt(prevIdx)->timestamp() > msglist.at(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; - - - dayChangeMsg = takeMessageAt(prevIdx); - if(msglist.last().timestamp() < dayChangeMsg.timestamp()) { + Message oldDayChangeMsg = takeMessageAt(prevIdx); + if(msglist.last().timestamp() < oldDayChangeMsg.timestamp()) { // we have to reinsert it with a changed msgId + dayChangeMsg = oldDayChangeMsg; dayChangeMsg.setMsgId(msglist.last().msgId()); } endRemoveRows(); + start--; end--; - relocatedMsg = true; } } @@ -170,24 +161,14 @@ void MessageModel::insertMessageGroup(const QList &msglist) { Q_ASSERT(start == 0 || messageItemAt(start - 1)->msgId() < msglist.first().msgId()); Q_ASSERT(start == messageCount() || messageItemAt(start)->msgId() > msglist.last().msgId()); beginInsertRows(QModelIndex(), start, end); -// int pos = start; -// foreach(Message msg, msglist) { -// _messageList.insert(pos, createMessageModelItem(msg)); -// pos++; -// } -// if(dayChangeItem) { -// _messageList.insert(pos, dayChangeItem); -// pos++; // needed for the following assert -// } insertMessages__(start, msglist); if(dayChangeMsg.isValid()) insertMessage__(start + msglist.count(), dayChangeMsg); endInsertRows(); -// Q_ASSERT(start == end || _messageList.at(start)->msgId() != _messageList.at(end)->msgId() || _messageList.at(end)->msgType() == Message::DayChange); + Q_ASSERT(start == end || messageItemAt(start)->msgId() != messageItemAt(end)->msgId() || messageItemAt(end)->msgType() == Message::DayChange); Q_ASSERT(start == 0 || messageItemAt(start - 1)->msgId() < messageItemAt(start)->msgId()); Q_ASSERT(end + 1 == messageCount() || messageItemAt(end)->msgId() < messageItemAt(end + 1)->msgId()); -// Q_ASSERT(pos - 1 == end); } int MessageModel::insertMessagesGracefully(const QList &msglist) { @@ -238,7 +219,7 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) { while(iter != msglist.constBegin()) { iter--; - if(!fastForward && (*iter).msgId() < minId) + if(!fastForward && (*iter).msgId() <= minId) break; processedMsgs++; @@ -269,7 +250,7 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) { } } else { while(iter != msglist.constEnd()) { - if(!fastForward && (*iter).msgId() < minId) + if(!fastForward && (*iter).msgId() <= minId) break; processedMsgs++; @@ -326,10 +307,12 @@ void MessageModel::customEvent(QEvent *event) { } void MessageModel::clear() { - beginRemoveRows(QModelIndex(), 0, rowCount() - 1); - removeAllMessages(); - endRemoveRows(); _messagesWaiting.clear(); + if (rowCount() > 0) { + beginRemoveRows(QModelIndex(), 0, rowCount() - 1); + removeAllMessages(); + 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) @@ -367,6 +350,18 @@ void MessageModel::changeOfDay() { _nextDayChange = _nextDayChange.addSecs(86400); } +void MessageModel::insertErrorMessage(BufferInfo bufferInfo, const QString &errorString) { + int idx = messageCount(); + beginInsertRows(QModelIndex(), idx, idx); + Message msg(bufferInfo, Message::Error, errorString); + if(!messagesIsEmpty()) + msg.setMsgId(messageItemAt(idx-1)->msgId()); + else + msg.setMsgId(0); + insertMessage__(idx, msg); + endInsertRows(); +} + void MessageModel::requestBacklog(BufferId bufferId) { if(_messagesWaiting.contains(bufferId)) return; @@ -409,25 +404,19 @@ void MessageModel::buffersPermanentlyMerged(BufferId bufferId1, BufferId bufferI // ======================================== // MessageModelItem // ======================================== -MessageModelItem::MessageModelItem(const Message &msg) - : _msg(msg) -{ - if(!_msg.sender().contains('!')) - _msg.setFlags(_msg.flags() |= Message::ServerMsg); -} - QVariant MessageModelItem::data(int column, int role) const { if(column < MessageModel::TimestampColumn || column > MessageModel::ContentsColumn) return QVariant(); switch(role) { - case MessageModel::MsgIdRole: return QVariant::fromValue(msgId()); - case MessageModel::BufferIdRole: return QVariant::fromValue(bufferId()); - case MessageModel::TypeRole: return msgType(); - case MessageModel::FlagsRole: return (int)msgFlags(); - case MessageModel::TimestampRole: return timestamp(); - case MessageModel::RedirectedToRole: return qVariantFromValue(_redirectedTo); - default: return QVariant(); + case MessageModel::MessageRole: return QVariant::fromValue(message()); + case MessageModel::MsgIdRole: return QVariant::fromValue(msgId()); + case MessageModel::BufferIdRole: return QVariant::fromValue(bufferId()); + case MessageModel::TypeRole: return msgType(); + case MessageModel::FlagsRole: return (int)msgFlags(); + case MessageModel::TimestampRole: return timestamp(); + case MessageModel::RedirectedToRole: return qVariantFromValue(_redirectedTo); + default: return QVariant(); } }