X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fmessagemodel.cpp;h=fd0ae3e66256e14e1d85c308aac0c881ed0e029c;hp=818c254e8d7dba52ebfcb5d6f8778acf2d71c173;hb=fb011e52bc6613198a65e037f0752f6361339aeb;hpb=8f0946673bc3edc84b6f13e16cbe8ece912b4a3b diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index 818c254e..fd0ae3e6 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -20,10 +20,13 @@ #include "messagemodel.h" -#include "message.h" - #include +#include "clientbacklogmanager.h" +#include "client.h" +#include "message.h" +#include "networkmodel.h" + class ProcessBufferEvent : public QEvent { public: inline ProcessBufferEvent() : QEvent(QEvent::User) {} @@ -66,8 +69,6 @@ bool MessageModel::setData(const QModelIndex &index, const QVariant &value, int return false; } - - bool MessageModel::insertMessage(const Message &msg, bool fakeMsg) { MsgId id = msg.msgId(); int idx = indexForId(id); @@ -307,10 +308,9 @@ void MessageModel::clear() { qDeleteAll(_messageList); _messageList.clear(); 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()) @@ -345,8 +345,37 @@ void MessageModel::changeOfDay() { _nextDayChange = _nextDayChange.addSecs(86400); } -/**********************************************************************************/ +void MessageModel::requestBacklog(BufferId bufferId) { + if(_messagesWaiting.contains(bufferId)) + return; + + static const int REQUEST_COUNT = 500; + + for(int i = 0; i < _messageList.count(); i++) { + if(_messageList.at(i)->bufferId() == bufferId) { + _messagesWaiting[bufferId] = REQUEST_COUNT; + Client::backlogManager()->emitMessagesRequested(tr("Requesting %1 messages from backlog for buffer %2:%3") + .arg(REQUEST_COUNT) + .arg(Client::networkModel()->networkName(bufferId)) + .arg(Client::networkModel()->bufferName(bufferId))); + Client::backlogManager()->requestBacklog(bufferId, REQUEST_COUNT, _messageList.at(i)->msgId().toInt()); + return; + } + } +} + +void MessageModel::messagesReceived(BufferId bufferId, int count) { + if(!_messagesWaiting.contains(bufferId)) + return; + + _messagesWaiting[bufferId] -= count; + if(_messagesWaiting[bufferId] <= 0) + _messagesWaiting.remove(bufferId); +} +// ======================================== +// MessageModelItem +// ======================================== MessageModelItem::MessageModelItem(const Message &msg) : _timestamp(msg.timestamp()), _msgId(msg.msgId()),