Backlog amount (initial and dynamic) can now be configured (Settings -> behavior...
[quassel.git] / src / client / messagemodel.cpp
index 818c254..82fd71b 100644 (file)
 
 #include "messagemodel.h"
 
-#include "message.h"
-
 #include <QEvent>
 
+#include "backlogsettings.h"
+#include "clientbacklogmanager.h"
+#include "client.h"
+#include "message.h"
+#include "networkmodel.h"
+
 class ProcessBufferEvent : public QEvent {
 public:
   inline ProcessBufferEvent() : QEvent(QEvent::User) {}
@@ -66,8 +70,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 +309,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 +346,38 @@ void MessageModel::changeOfDay() {
   _nextDayChange = _nextDayChange.addSecs(86400);
 }
 
-/**********************************************************************************/
+void MessageModel::requestBacklog(BufferId bufferId) {
+  if(_messagesWaiting.contains(bufferId))
+    return;
+
+  BacklogSettings backlogSettings;
+  int requestCount = backlogSettings.dynamicBacklogAmount();
+
+  for(int i = 0; i < _messageList.count(); i++) {
+    if(_messageList.at(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, requestCount, _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()),