From 54afee59c56e1a75352b32200b9503150601bd90 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Tue, 24 Mar 2009 15:00:45 +0100 Subject: [PATCH 1/1] activating a view pulls in needed backlog for the displayed buffers --- src/client/backlogrequester.cpp | 6 +++--- src/client/backlogrequester.h | 10 +++++----- src/client/clientbacklogmanager.cpp | 27 ++++++++++++--------------- src/client/clientbacklogmanager.h | 10 ++++++++-- src/client/messagemodel.cpp | 4 ++-- src/common/types.h | 5 ++++- src/qtui/mainwin.cpp | 17 +++++++++++++++++ src/uisupport/bufferview.cpp | 8 ++++++++ src/uisupport/bufferview.h | 1 + 9 files changed, 60 insertions(+), 28 deletions(-) diff --git a/src/client/backlogrequester.cpp b/src/client/backlogrequester.cpp index 1100784b..3aee9313 100644 --- a/src/client/backlogrequester.cpp +++ b/src/client/backlogrequester.cpp @@ -51,7 +51,7 @@ bool BacklogRequester::buffer(BufferId bufferId, const MessageList &messages) { return !_buffersWaiting.isEmpty(); } -QList BacklogRequester::allBufferIds() const { +BufferIdList BacklogRequester::allBufferIds() const { QSet 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 &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 &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) { diff --git a/src/client/backlogrequester.h b/src/client/backlogrequester.h index 85558f8b..8aa36274 100644 --- a/src/client/backlogrequester.h +++ b/src/client/backlogrequester.h @@ -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 &bufferIds) = 0; protected: - QList allBufferIds() const; + BufferIdList allBufferIds() const; inline void setWaitingBuffers(const QList &buffers) { setWaitingBuffers(buffers.toSet()); } void setWaitingBuffers(const QSet &buffers); void addWaitingBuffer(BufferId buffer); @@ -76,7 +76,7 @@ private: class FixedBacklogRequester : public BacklogRequester { public: FixedBacklogRequester(ClientBacklogManager *backlogManager); - virtual void requestBacklog(const QList &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 &) {} + 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 &bufferIds); + virtual void requestBacklog(const BufferIdList &bufferIds); private: int _limit; diff --git a/src/client/clientbacklogmanager.cpp b/src/client/clientbacklogmanager.cpp index afd7e1f7..f88c606d 100644 --- a/src/client/clientbacklogmanager.cpp +++ b/src/client/clientbacklogmanager.cpp @@ -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 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 &bufferIds) { @@ -116,11 +115,9 @@ void ClientBacklogManager::checkForBacklog(const QList &bufferIds) { case BacklogRequester::PerBufferFixed: default: { - QList 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(); } diff --git a/src/client/clientbacklogmanager.h b/src/client/clientbacklogmanager.h index 0762edfd..5f1e1cd9 100644 --- a/src/client/clientbacklogmanager.h +++ b/src/client/clientbacklogmanager.h @@ -44,7 +44,7 @@ public slots: void requestInitialBacklog(); void checkForBacklog(BufferId bufferId); - void checkForBacklog(const QList &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 _backlogReceived; + QSet _buffersRequested; }; +// inlines +inline void ClientBacklogManager::checkForBacklog(BufferId bufferId) { + checkForBacklog(BufferIdList() << bufferId); +} + #endif // CLIENTBACKLOGMANAGER_H diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index 07af7aca..91eb769f 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -219,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++; @@ -250,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++; diff --git a/src/common/types.h b/src/common/types.h index 104deb72..fc46881e 100644 --- a/src/common/types.h +++ b/src/common/types.h @@ -95,6 +95,10 @@ Q_DECLARE_METATYPE(NetworkId) Q_DECLARE_METATYPE(IdentityId) Q_DECLARE_METATYPE(AccountId) +// a few typedefs +typedef QList MsgIdList; +typedef QList BufferIdList; + //! Base class for exceptions. struct Exception { Exception(QString msg = "Unknown Exception") : _msg(msg) {}; @@ -103,7 +107,6 @@ struct Exception { protected: QString _msg; - }; #endif diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index c7981157..99fe6d52 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -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()); } diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index ec93ab07..4111ad3a 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -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(); +} diff --git a/src/uisupport/bufferview.h b/src/uisupport/bufferview.h index 22dd2e99..b2d1e0ed 100644 --- a/src/uisupport/bufferview.h +++ b/src/uisupport/bufferview.h @@ -136,6 +136,7 @@ public: BufferViewDock(BufferViewConfig *config, QWidget *parent); int bufferViewId() const; + BufferViewConfig *config() const; inline BufferView *bufferView() const { return qobject_cast(widget()); } public slots: -- 2.20.1