X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fmessagemodel.cpp;h=76943d4ca71df22798cf5c811b1bf040334d9d91;hp=906b2c1716b173de755a4d00b0b4bfe9a7bfe83c;hb=86831c8857f0a729580cee547e10c9621d50c780;hpb=946e79e0243dda74433016060f12abc65883f243 diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index 906b2c17..76943d4c 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -48,33 +48,33 @@ MessageModel::MessageModel(QObject *parent) QVariant MessageModel::data(const QModelIndex &index, int role) const { int row = index.row(); int column = index.column(); - if(row < 0 || row >= _messageList.count() || column < 0) + if(row < 0 || row >= messageCount() || column < 0) return QVariant(); if(role == ColumnTypeRole) return column; - return _messageList[row]->data(index.column(), role); + return messageItemAt(row)->data(index.column(), role); + // return _messageList[row]->data(index.column(), role); } bool MessageModel::setData(const QModelIndex &index, const QVariant &value, int role) { int row = index.row(); - if(row < 0 || row >= _messageList.count()) + if(row < 0 || row >= messageCount()) return false; - if(_messageList[row]->setData(index.column(), value, role)) { + if(messageItemAt(row)->setData(index.column(), value, role)) { emit dataChanged(index, index); return true; } - return false; } bool MessageModel::insertMessage(const Message &msg, bool fakeMsg) { MsgId id = msg.msgId(); int idx = indexForId(id); - if(!fakeMsg && idx < _messageList.count()) { // check for duplicate - if(_messageList[idx]->msgId() == id) + if(!fakeMsg && idx < messageCount()) { // check for duplicate + if(messageItemAt(idx)->msgId() == id) return false; } @@ -111,23 +111,31 @@ void MessageModel::insertMessageGroup(const QList &msglist) { // Q_ASSERT(0 == last || msglist.at(0).msgId() != msglist.at(last).msgId() || msglist.at(last).type() == Message::DayChange); int start = indexForId(msglist.first().msgId()); int end = start + msglist.count() - 1; - MessageModelItem *dayChangeItem = 0; + 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(_messageList.at(prevIdx)->msgType() == Message::DayChange - && _messageList.at(prevIdx)->timeStamp() > msglist.at(0).timestamp()) { + 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()); +// 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()) { + // we have to reinsert it with a changed msgId dayChangeMsg.setMsgId(msglist.last().msgId()); - dayChangeItem = createMessageModelItem(dayChangeMsg); } - delete oldItem; endRemoveRows(); start--; end--; @@ -135,13 +143,14 @@ void MessageModel::insertMessageGroup(const QList &msglist) { } } - if(!dayChangeItem && start < _messageList.count()) { + if(!dayChangeMsg.isValid() && start < messageCount()) { + // if(!dayChangeItem && start < _messageList.count()) { // check if we need to insert a daychange message at the end of the this group // if this assert triggers then indexForId() would have found a spot right before a DayChangeMsg // this should never happen as daychange messages share the msgId with the preceeding message - Q_ASSERT(_messageList[start]->msgType() != Message::DayChange); - QDateTime nextTs = _messageList[start]->timeStamp(); + Q_ASSERT(messageItemAt(start)->msgType() != Message::DayChange); + QDateTime nextTs = messageItemAt(start)->timestamp(); QDateTime prevTs = msglist.last().timestamp(); nextTs.setTimeSpec(Qt::UTC); prevTs.setTimeSpec(Qt::UTC); @@ -150,33 +159,35 @@ void MessageModel::insertMessageGroup(const QList &msglist) { if(nextDay != prevDay) { nextTs.setTime_t(nextDay * 86400); nextTs.setTimeSpec(Qt::LocalTime); - Message dayChangeMsg = Message::ChangeOfDay(nextTs); + dayChangeMsg = Message::ChangeOfDay(nextTs); dayChangeMsg.setMsgId(msglist.last().msgId()); - dayChangeItem = createMessageModelItem(dayChangeMsg); } } - if(dayChangeItem) + if(dayChangeMsg.isValid()) end++; - Q_ASSERT(start == 0 || _messageList[start - 1]->msgId() < msglist.first().msgId()); - Q_ASSERT(start == _messageList.count() || _messageList[start]->msgId() > msglist.last().msgId()); + 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 - } +// 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 == 0 || _messageList[start - 1]->msgId() < _messageList[start]->msgId()); - Q_ASSERT(end + 1 == _messageList.count() || _messageList[end]->msgId() < _messageList[end + 1]->msgId()); - Q_ASSERT(pos - 1 == end); + 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) { @@ -205,13 +216,13 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) { } idx = indexForId((*iter).msgId()); - if(idx < _messageList.count()) - dupeId = _messageList[idx]->msgId(); + if(idx < messageCount()) + dupeId = messageItemAt(idx)->msgId(); // we always compare to the previous entry... // if there isn't, we can fastforward to the top if(idx - 1 >= 0) - minId = _messageList[idx - 1]->msgId(); + minId = messageItemAt(idx - 1)->msgId(); else fastForward = true; @@ -233,8 +244,8 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) { if(grouplist.isEmpty()) { // as long as we don't have a starting point, we have to update the dupeId idx = indexForId((*iter).msgId()); - if(idx >= 0 && !_messageList.isEmpty()) - dupeId = _messageList[idx]->msgId(); + if(idx >= 0 && !messagesIsEmpty()) + dupeId = messageItemAt(idx)->msgId(); } if((*iter).msgId() != dupeId) { if(!grouplist.isEmpty()) { @@ -264,8 +275,8 @@ int MessageModel::insertMessagesGracefully(const QList &msglist) { if(grouplist.isEmpty()) { // as long as we don't have a starting point, we have to update the dupeId idx = indexForId((*iter).msgId()); - if(idx >= 0 && !_messageList.isEmpty()) - dupeId = _messageList[idx]->msgId(); + if(idx >= 0 && !messagesIsEmpty()) + dupeId = messageItemAt(idx)->msgId(); } if((*iter).msgId() != dupeId) { if(!grouplist.isEmpty()) { @@ -316,41 +327,41 @@ void MessageModel::customEvent(QEvent *event) { void MessageModel::clear() { beginRemoveRows(QModelIndex(), 0, rowCount() - 1); - qDeleteAll(_messageList); - _messageList.clear(); + removeAllMessages(); endRemoveRows(); _messagesWaiting.clear(); } // 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)->msgId()) + if(messagesIsEmpty() || id <= messageItemAt(0)->msgId()) return 0; - if(id > _messageList.last()->msgId()) - return _messageList.count(); + + if(id > lastMessageItem()->msgId()) + return messageCount(); // binary search - int start = 0; int end = _messageList.count()-1; + int start = 0; int end = messageCount() - 1; while(1) { if(end - start == 1) return end; int pivot = (end + start) / 2; - if(id <= _messageList.value(pivot)->msgId()) end = pivot; + if(id <= messageItemAt(pivot)->msgId()) end = pivot; else start = pivot; } } void MessageModel::changeOfDay() { _dayChangeTimer.setInterval(86400000); - if(!_messageList.isEmpty()) { - int idx = _messageList.count(); - while(idx > 0 && _messageList[idx - 1]->timeStamp() > _nextDayChange) { + if(!messagesIsEmpty()) { + int idx = messageCount(); + while(idx > 0 && messageItemAt(idx - 1)->timestamp() > _nextDayChange) { idx--; } beginInsertRows(QModelIndex(), idx, idx); Message dayChangeMsg = Message::ChangeOfDay(_nextDayChange); - dayChangeMsg.setMsgId(_messageList[idx - 1]->msgId()); - _messageList.insert(idx, createMessageModelItem(dayChangeMsg)); + dayChangeMsg.setMsgId(messageItemAt(idx - 1)->msgId()); + insertMessage__(idx, dayChangeMsg); endInsertRows(); } _nextDayChange = _nextDayChange.addSecs(86400); @@ -363,14 +374,14 @@ void MessageModel::requestBacklog(BufferId bufferId) { BacklogSettings backlogSettings; int requestCount = backlogSettings.dynamicBacklogAmount(); - for(int i = 0; i < _messageList.count(); i++) { - if(_messageList.at(i)->bufferId() == bufferId) { + for(int i = 0; i < messageCount(); i++) { + if(messageItemAt(i)->bufferId() == bufferId) { _messagesWaiting[bufferId] = requestCount; Client::backlogManager()->emitMessagesRequested(tr("Requesting %1 messages from backlog for buffer %2:%3") .arg(requestCount) .arg(Client::networkModel()->networkName(bufferId)) .arg(Client::networkModel()->bufferName(bufferId))); - Client::backlogManager()->requestBacklog(bufferId, -1, _messageList.at(i)->msgId(), requestCount); + Client::backlogManager()->requestBacklog(bufferId, -1, messageItemAt(i)->msgId(), requestCount); return; } } @@ -386,9 +397,9 @@ void MessageModel::messagesReceived(BufferId bufferId, int count) { } void MessageModel::buffersPermanentlyMerged(BufferId bufferId1, BufferId bufferId2) { - for(int i = 0; i < _messageList.count(); i++) { - if(_messageList[i]->bufferId() == bufferId2) { - _messageList[i]->setBufferId(bufferId1); + for(int i = 0; i < messageCount(); i++) { + if(messageItemAt(i)->bufferId() == bufferId2) { + messageItemAt(i)->setBufferId(bufferId1); QModelIndex idx = index(i, 0); emit dataChanged(idx, idx); } @@ -398,15 +409,11 @@ void MessageModel::buffersPermanentlyMerged(BufferId bufferId1, BufferId bufferI // ======================================== // MessageModelItem // ======================================== -MessageModelItem::MessageModelItem(const Message &msg) : - _timestamp(msg.timestamp()), - _msgId(msg.msgId()), - _bufferId(msg.bufferInfo().bufferId()), - _type(msg.type()), - _flags(msg.flags()) +MessageModelItem::MessageModelItem(const Message &msg) + : _msg(msg) { - if(!msg.sender().contains('!')) - _flags |= Message::ServerMsg; + if(!_msg.sender().contains('!')) + _msg.setFlags(_msg.flags() |= Message::ServerMsg); } QVariant MessageModelItem::data(int column, int role) const { @@ -414,11 +421,11 @@ QVariant MessageModelItem::data(int column, int role) const { return QVariant(); switch(role) { - case MessageModel::MsgIdRole: return QVariant::fromValue(_msgId); - case MessageModel::BufferIdRole: return QVariant::fromValue(_bufferId); - case MessageModel::TypeRole: return _type; - case MessageModel::FlagsRole: return (int)_flags; - case MessageModel::TimestampRole: return _timestamp; + 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(); } @@ -442,20 +449,20 @@ bool MessageModelItem::lessThan(const MessageModelItem *m1, const MessageModelIt } bool MessageModelItem::operator<(const MessageModelItem &other) const { - return _msgId < other._msgId; + return msgId() < other.msgId(); } bool MessageModelItem::operator==(const MessageModelItem &other) const { - return _msgId == other._msgId; + return msgId() == other.msgId(); } bool MessageModelItem::operator>(const MessageModelItem &other) const { - return _msgId > other._msgId; + return msgId() > other.msgId(); } QDebug operator<<(QDebug dbg, const MessageModelItem &msgItem) { dbg.nospace() << qPrintable(QString("MessageModelItem(MsgId:")) << msgItem.msgId() - << qPrintable(QString(",")) << msgItem.timeStamp() + << qPrintable(QString(",")) << msgItem.timestamp() << qPrintable(QString(", Type:")) << msgItem.msgType() << qPrintable(QString(", Flags:")) << msgItem.msgFlags() << qPrintable(QString(")")) << msgItem.data(1, Qt::DisplayRole).toString() << ":" << msgItem.data(2, Qt::DisplayRole).toString();