activating a view pulls in needed backlog for the displayed buffers
authorMarcus Eggenberger <egs@quassel-irc.org>
Tue, 24 Mar 2009 14:00:45 +0000 (15:00 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Tue, 24 Mar 2009 16:31:45 +0000 (17:31 +0100)
src/client/backlogrequester.cpp
src/client/backlogrequester.h
src/client/clientbacklogmanager.cpp
src/client/clientbacklogmanager.h
src/client/messagemodel.cpp
src/common/types.h
src/qtui/mainwin.cpp
src/uisupport/bufferview.cpp
src/uisupport/bufferview.h

index 1100784..3aee931 100644 (file)
@@ -51,7 +51,7 @@ bool BacklogRequester::buffer(BufferId bufferId, const MessageList &messages) {
   return !_buffersWaiting.isEmpty();
 }
 
-QList<BufferId> BacklogRequester::allBufferIds() const {
+BufferIdList BacklogRequester::allBufferIds() const {
   QSet<BufferId> bufferIds = Client::bufferViewOverlay()->bufferIds();
   bufferIds += Client::bufferViewOverlay()->tempRemovedBufferIds();
   return bufferIds.toList();
@@ -67,7 +67,7 @@ FixedBacklogRequester::FixedBacklogRequester(ClientBacklogManager *backlogManage
   _backlogCount = backlogSettings.fixedBacklogAmount();
 }
 
-void FixedBacklogRequester::requestBacklog(const QList<BufferId> &bufferIds) {
+void FixedBacklogRequester::requestBacklog(const BufferIdList &bufferIds) {
   setWaitingBuffers(bufferIds);
   backlogManager->emitMessagesRequested(QObject::tr("Requesting a total of up to %1 backlog messages for %2 buffers").arg(_backlogCount * bufferIds.count()).arg(bufferIds.count()));
   foreach(BufferId bufferId, bufferIds) {
@@ -108,7 +108,7 @@ PerBufferUnreadBacklogRequester::PerBufferUnreadBacklogRequester(ClientBacklogMa
   _additional = backlogSettings.perBufferUnreadBacklogAdditional();
 }
 
-void PerBufferUnreadBacklogRequester::requestBacklog(const QList<BufferId> &bufferIds) {
+void PerBufferUnreadBacklogRequester::requestBacklog(const BufferIdList &bufferIds) {
   setWaitingBuffers(bufferIds);
   backlogManager->emitMessagesRequested(QObject::tr("Requesting a total of up to %1 unread backlog messages for %2 buffers").arg((_limit + _additional) * bufferIds.count()).arg(bufferIds.count()));
   foreach(BufferId bufferId, bufferIds) {
index 85558f8..8aa3627 100644 (file)
@@ -51,11 +51,11 @@ public:
   //! returns false if it was the last missing backlogpart
   bool buffer(BufferId bufferId, const MessageList &messages);
   
+  virtual void requestBacklog(const BufferIdList &bufferIds) = 0;
   virtual inline void requestBacklog() { requestBacklog(allBufferIds()); }
-  virtual void requestBacklog(const QList<BufferId> &bufferIds) = 0;
 
 protected:
-  QList<BufferId> allBufferIds() const;
+  BufferIdList allBufferIds() const;
   inline void setWaitingBuffers(const QList<BufferId> &buffers) { setWaitingBuffers(buffers.toSet()); }
   void setWaitingBuffers(const QSet<BufferId> &buffers);
   void addWaitingBuffer(BufferId buffer);
@@ -76,7 +76,7 @@ private:
 class FixedBacklogRequester : public BacklogRequester {
 public:
   FixedBacklogRequester(ClientBacklogManager *backlogManager);
-  virtual void requestBacklog(const QList<BufferId> &bufferIds);
+  virtual void requestBacklog(const BufferIdList &bufferIds);
 
 private:
   int _backlogCount;
@@ -89,7 +89,7 @@ class GlobalUnreadBacklogRequester : public BacklogRequester {
 public:
   GlobalUnreadBacklogRequester(ClientBacklogManager *backlogManager);
   virtual void requestBacklog();
-  virtual void requestBacklog(const QList<BufferId> &) {}
+  virtual void requestBacklog(const BufferIdList &) {}
 
 private:
   int _limit;
@@ -102,7 +102,7 @@ private:
 class PerBufferUnreadBacklogRequester : public BacklogRequester {
 public:
   PerBufferUnreadBacklogRequester(ClientBacklogManager *backlogManager);
-  virtual void requestBacklog(const QList<BufferId> &bufferIds);
+  virtual void requestBacklog(const BufferIdList &bufferIds);
 
 private:
   int _limit;
index afd7e1f..f88c606 100644 (file)
@@ -47,8 +47,6 @@ void ClientBacklogManager::receiveBacklog(BufferId bufferId, MsgId first, MsgId
     msglist << msg;
   }
 
-  _backlogReceived << bufferId;
-
   if(isBuffering()) {
     bool lastPart = !_requester->buffer(bufferId, msglist);
     updateProgress(_requester->totalBuffers() - _requester->buffersWaiting(), _requester->totalBuffers());
@@ -98,13 +96,14 @@ void ClientBacklogManager::requestInitialBacklog() {
   }
 }
 
-void ClientBacklogManager::checkForBacklog(const BufferId bufferId) {
-  if(_backlogReceived.contains(bufferId))
-    return;
-
-  QList<BufferId> bufferIds;
-  bufferIds << bufferId;
-  checkForBacklog(bufferIds);
+BufferIdList ClientBacklogManager::filterNewBufferIds(const BufferIdList &bufferIds) {
+  BufferIdList newBuffers;
+  foreach(BufferId bufferId, bufferIds) {
+    if(!_buffersRequested.contains(bufferId))
+      newBuffers << bufferId;
+  }
+  _buffersRequested += bufferIds.toSet();
+  return newBuffers;
 }
 
 void ClientBacklogManager::checkForBacklog(const QList<BufferId> &bufferIds) {
@@ -116,11 +115,9 @@ void ClientBacklogManager::checkForBacklog(const QList<BufferId> &bufferIds) {
   case BacklogRequester::PerBufferFixed:
   default:
     {
-      QList<BufferId> buffers;
-      foreach(BufferId bufferId, bufferIds)
-        if(!_backlogReceived.contains(bufferId))
-          buffers << bufferId;
-      _requester->requestBacklog(buffers);
+      BufferIdList buffers = filterNewBufferIds(bufferIds);
+      if(!buffers.isEmpty())
+        _requester->requestBacklog(buffers);
     }
   };
 }
@@ -152,5 +149,5 @@ void ClientBacklogManager::dispatchMessages(const MessageList &messages, bool so
 void ClientBacklogManager::reset() {
   delete _requester;
   _requester = 0;
-  _backlogReceived.clear();
+  _buffersRequested.clear();
 }
index 0762edf..5f1e1cd 100644 (file)
@@ -44,7 +44,7 @@ public slots:
   void requestInitialBacklog();
 
   void checkForBacklog(BufferId bufferId);
-  void checkForBacklog(const QList<BufferId> &bufferIds);
+  void checkForBacklog(const BufferIdList &bufferIds);
 
 signals:
   void messagesReceived(BufferId bufferId, int count) const;
@@ -56,11 +56,17 @@ signals:
 private:
   bool isBuffering();
   void stopBuffering();
+  BufferIdList filterNewBufferIds(const BufferIdList &bufferIds);
 
   void dispatchMessages(const MessageList &messages, bool sort = false);
 
   BacklogRequester *_requester;
-  QSet<BufferId> _backlogReceived;
+  QSet<BufferId> _buffersRequested;
 };
 
+// inlines
+inline void ClientBacklogManager::checkForBacklog(BufferId bufferId) {
+  checkForBacklog(BufferIdList() << bufferId);
+}
+
 #endif // CLIENTBACKLOGMANAGER_H
index 07af7ac..91eb769 100644 (file)
@@ -219,7 +219,7 @@ int MessageModel::insertMessagesGracefully(const QList<Message> &msglist) {
     while(iter != msglist.constBegin()) {
       iter--;
 
-      if(!fastForward && (*iter).msgId() < minId)
+      if(!fastForward && (*iter).msgId() <= minId)
        break;
       processedMsgs++;
 
@@ -250,7 +250,7 @@ int MessageModel::insertMessagesGracefully(const QList<Message> &msglist) {
     }
   } else {
     while(iter != msglist.constEnd()) {
-      if(!fastForward && (*iter).msgId() < minId)
+      if(!fastForward && (*iter).msgId() <= minId)
        break;
       processedMsgs++;
 
index 104deb7..fc46881 100644 (file)
@@ -95,6 +95,10 @@ Q_DECLARE_METATYPE(NetworkId)
 Q_DECLARE_METATYPE(IdentityId)
 Q_DECLARE_METATYPE(AccountId)
 
+// a few typedefs
+typedef QList<MsgId> MsgIdList;
+typedef QList<BufferId> BufferIdList;
+
 //! Base class for exceptions.
 struct Exception {
   Exception(QString msg = "Unknown Exception") : _msg(msg) {};
@@ -103,7 +107,6 @@ struct Exception {
 
   protected:
     QString _msg;
-
 };
 
 #endif
index c798115..99fe6d5 100644 (file)
@@ -383,6 +383,23 @@ void MainWin::bufferViewToggled(bool enabled) {
   Q_ASSERT(dock);
   if(enabled) {
     Client::bufferViewOverlay()->addView(dock->bufferViewId());
+    BufferViewConfig *config = dock->config();
+    if(config && config->isInitialized()) {
+      BufferIdList buffers;
+      if(config->networkId().isValid()) {
+        foreach(BufferId bufferId, config->bufferList()) {
+          if(Client::networkModel()->networkId(bufferId) == config->networkId())
+            buffers << bufferId;
+        }
+        foreach(BufferId bufferId, config->temporarilyRemovedBuffers().toList()) {
+          if(Client::networkModel()->networkId(bufferId) == config->networkId())
+            buffers << bufferId;
+        }
+      } else {
+        buffers = BufferIdList::fromSet(config->bufferList().toSet() + config->temporarilyRemovedBuffers());
+      }
+      Client::backlogManager()->checkForBacklog(buffers);
+    }
   } else {
     Client::bufferViewOverlay()->removeView(dock->bufferViewId());
   }
index ec93ab0..4111ad3 100644 (file)
@@ -609,3 +609,11 @@ int BufferViewDock::bufferViewId() const {
   else
     return 0;
 }
+
+BufferViewConfig *BufferViewDock::config() const {
+  BufferView *view = bufferView();
+  if(!view)
+    return 0;
+  else
+    return view->config();
+}
index 22dd2e9..b2d1e0e 100644 (file)
@@ -136,6 +136,7 @@ public:
   BufferViewDock(BufferViewConfig *config, QWidget *parent);
 
   int bufferViewId() const;
+  BufferViewConfig *config() const;
   inline BufferView *bufferView() const { return qobject_cast<BufferView *>(widget()); }
 
 public slots: