From: Marcus Eggenberger Date: Wed, 4 Feb 2009 13:18:37 +0000 (+0100) Subject: fixes #448 - progress indicator for backlog X-Git-Tag: 0.4.0~142 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=5bd4e3fcf31a7a337f91b3bba86bd237aa5e7ed6 fixes #448 - progress indicator for backlog --- diff --git a/src/client/abstractmessageprocessor.cpp b/src/client/abstractmessageprocessor.cpp index ae895cdd..2419c316 100644 --- a/src/client/abstractmessageprocessor.cpp +++ b/src/client/abstractmessageprocessor.cpp @@ -26,7 +26,3 @@ AbstractMessageProcessor::AbstractMessageProcessor(QObject *parent) : QObject(parent) { } - -// void AbstractMessageProcessor::postProcess(Message &msg) { -// Client::buffer(msg.bufferInfo())->updateActivityLevel(msg); -// } diff --git a/src/client/abstractmessageprocessor.h b/src/client/abstractmessageprocessor.h index 68db9213..ff9daadf 100644 --- a/src/client/abstractmessageprocessor.h +++ b/src/client/abstractmessageprocessor.h @@ -28,20 +28,16 @@ class AbstractMessageProcessor : public QObject { Q_OBJECT - public: - AbstractMessageProcessor(QObject *parent); - virtual void reset() = 0; +public: + AbstractMessageProcessor(QObject *parent); + virtual void reset() = 0; - public slots: - virtual void process(Message &msg) = 0; - virtual void process(QList &msgs) = 0; - - signals: - void progressUpdated(int value, int maximum); - - protected: - inline void postProcess(Message &msg) { Client::networkModel()->updateBufferActivity(msg); } +public slots: + virtual void process(Message &msg) = 0; + virtual void process(QList &msgs) = 0; +protected: + inline void postProcess(Message &msg) { Client::networkModel()->updateBufferActivity(msg); } }; #endif diff --git a/src/client/backlogrequester.cpp b/src/client/backlogrequester.cpp index 9feaca43..a08227d8 100644 --- a/src/client/backlogrequester.cpp +++ b/src/client/backlogrequester.cpp @@ -27,11 +27,22 @@ BacklogRequester::BacklogRequester(bool buffering, ClientBacklogManager *backlogManager) : backlogManager(backlogManager), - _isBuffering(buffering) + _isBuffering(buffering), + _totalBuffers(0) { Q_ASSERT(backlogManager); } +void BacklogRequester::setWaitingBuffers(const QSet &buffers) { + _buffersWaiting = buffers; + _totalBuffers = _buffersWaiting.count(); +} + +void BacklogRequester::addWaitingBuffer(BufferId buffer) { + _buffersWaiting << buffer; + _totalBuffers++; +} + bool BacklogRequester::buffer(BufferId bufferId, const MessageList &messages) { _bufferedMessages << messages; _buffersWaiting.remove(bufferId); diff --git a/src/client/backlogrequester.h b/src/client/backlogrequester.h index 2ff19515..c3c6832b 100644 --- a/src/client/backlogrequester.h +++ b/src/client/backlogrequester.h @@ -45,6 +45,8 @@ public: inline bool isBuffering() { return _isBuffering; } inline const QList &bufferedMessages() { return _bufferedMessages; } + inline int buffersWaiting() const { return _buffersWaiting.count(); } + inline int totalBuffers() const { return _totalBuffers; } //! returns false if it was the last missing backlogpart bool buffer(BufferId bufferId, const MessageList &messages); @@ -52,15 +54,16 @@ public: protected: inline QList allBufferIds() const { return Client::networkModel()->allBufferIds(); } - inline void setWaitingBuffers(const QList &buffers) { _buffersWaiting = buffers.toSet(); } - inline void setWaitingBuffers(const QSet &buffers) { _buffersWaiting = buffers; } - inline void addWaitingBuffer(BufferId buffer) { _buffersWaiting << buffer; } + inline void setWaitingBuffers(const QList &buffers) { setWaitingBuffers(buffers.toSet()); } + void setWaitingBuffers(const QSet &buffers); + void addWaitingBuffer(BufferId buffer); ClientBacklogManager *backlogManager; private: bool _isBuffering; MessageList _bufferedMessages; + int _totalBuffers; QSet _buffersWaiting; }; diff --git a/src/client/clientbacklogmanager.cpp b/src/client/clientbacklogmanager.cpp index 4ac1f602..6f45da35 100644 --- a/src/client/clientbacklogmanager.cpp +++ b/src/client/clientbacklogmanager.cpp @@ -48,8 +48,9 @@ void ClientBacklogManager::receiveBacklog(BufferId bufferId, MsgId first, MsgId } if(isBuffering()) { - if(!_requester->buffer(bufferId, msglist)) { - // this was the last part to buffer + bool lastPart = !_requester->buffer(bufferId, msglist); + updateProgress(_requester->totalBuffers() - _requester->buffersWaiting(), _requester->totalBuffers()); + if(lastPart) { stopBuffering(); reset(); } @@ -92,6 +93,9 @@ void ClientBacklogManager::requestInitialBacklog() { }; _requester->requestBacklog(); + if(_requester->isBuffering()) { + updateProgress(0, _requester->totalBuffers()); + } } void ClientBacklogManager::stopBuffering() { diff --git a/src/client/clientbacklogmanager.h b/src/client/clientbacklogmanager.h index e0bcfa30..5a8585bd 100644 --- a/src/client/clientbacklogmanager.h +++ b/src/client/clientbacklogmanager.h @@ -47,6 +47,8 @@ signals: void messagesRequested(const QString &) const; void messagesProcessed(const QString &) const; + void updateProgress(int, int); + private: bool isBuffering(); void stopBuffering(); diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 8e11a291..10aedfa9 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -455,7 +455,6 @@ void MainWin::setupTitleSetter() { void MainWin::setupStatusBar() { // MessageProcessor progress statusBar()->addPermanentWidget(msgProcessorStatusWidget); - connect(Client::messageProcessor(), SIGNAL(progressUpdated(int, int)), msgProcessorStatusWidget, SLOT(setProgress(int, int))); // Core Lag: updateLagIndicator(); @@ -479,9 +478,6 @@ void MainWin::setupStatusBar() { connect(showStatusbar, SIGNAL(toggled(bool)), statusBar(), SLOT(setVisible(bool))); connect(showStatusbar, SIGNAL(toggled(bool)), this, SLOT(saveStatusBarStatus(bool))); - - connect(Client::backlogManager(), SIGNAL(messagesRequested(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); - connect(Client::backlogManager(), SIGNAL(messagesProcessed(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); } void MainWin::saveStatusBarStatus(bool enabled) { @@ -546,6 +542,15 @@ void MainWin::setConnectedState() { action->setVisible(!Client::internalCore()); } + disconnect(Client::backlogManager(), SIGNAL(updateProgress(int, int)), msgProcessorStatusWidget, SLOT(setProgress(int, int))); + disconnect(Client::backlogManager(), SIGNAL(messagesRequested(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); + disconnect(Client::backlogManager(), SIGNAL(messagesProcessed(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); + if(!Client::internalCore()) { + connect(Client::backlogManager(), SIGNAL(updateProgress(int, int)), msgProcessorStatusWidget, SLOT(setProgress(int, int))); + connect(Client::backlogManager(), SIGNAL(messagesRequested(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); + connect(Client::backlogManager(), SIGNAL(messagesProcessed(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); + } + // _viewMenu->setEnabled(true); if(!Client::internalCore()) statusBar()->showMessage(tr("Connected to core.")); diff --git a/src/qtui/msgprocessorstatuswidget.cpp b/src/qtui/msgprocessorstatuswidget.cpp index 9118778d..f5616bf6 100644 --- a/src/qtui/msgprocessorstatuswidget.cpp +++ b/src/qtui/msgprocessorstatuswidget.cpp @@ -20,17 +20,19 @@ #include "msgprocessorstatuswidget.h" -MsgProcessorStatusWidget::MsgProcessorStatusWidget(QWidget *parent) : QWidget(parent) { +MsgProcessorStatusWidget::MsgProcessorStatusWidget(QWidget *parent) + : QWidget(parent) +{ ui.setupUi(this); - hide(); } void MsgProcessorStatusWidget::setProgress(int value, int max) { - if(max <= 0) { + if(max <= 0 || value == max) { hide(); } else { - if(isHidden()) show(); + if(isHidden()) + show(); ui.progressBar->setMaximum(max); ui.progressBar->setValue(value); } diff --git a/src/qtui/msgprocessorstatuswidget.h b/src/qtui/msgprocessorstatuswidget.h index dd299325..b29f671b 100644 --- a/src/qtui/msgprocessorstatuswidget.h +++ b/src/qtui/msgprocessorstatuswidget.h @@ -26,15 +26,14 @@ class MsgProcessorStatusWidget : public QWidget { Q_OBJECT - public: - MsgProcessorStatusWidget(QWidget *parent = 0); +public: + MsgProcessorStatusWidget(QWidget *parent = 0); - public slots: - void setProgress(int value, int max); - - private: - Ui::MsgProcessorStatusWidget ui; +public slots: + void setProgress(int value, int max); +private: + Ui::MsgProcessorStatusWidget ui; }; #endif diff --git a/src/qtui/qtuimessageprocessor.cpp b/src/qtui/qtuimessageprocessor.cpp index 9bc1c8c3..3aa3acd2 100644 --- a/src/qtui/qtuimessageprocessor.cpp +++ b/src/qtui/qtuimessageprocessor.cpp @@ -31,9 +31,7 @@ const int progressUpdateDelay = 100; // ms between progress signal updates QtUiMessageProcessor::QtUiMessageProcessor(QObject *parent) : AbstractMessageProcessor(parent), _processing(false), - _processMode(TimerBased), - _msgsProcessed(0), - _msgCount(0) + _processMode(TimerBased) { NotificationSettings notificationSettings; _nicksCaseSensitive = notificationSettings.nicksCaseSensitive(); @@ -76,20 +74,17 @@ void QtUiMessageProcessor::process(QList &msgs) { if(msgs.isEmpty()) return; _processQueue.append(msgs); - _msgCount += msgs.count(); - if(!isProcessing()) startProcessing(); - else updateProgress(); + if(!isProcessing()) + startProcessing(); } void QtUiMessageProcessor::startProcessing() { if(processMode() == TimerBased) { - if(_currentBatch.isEmpty() && _processQueue.isEmpty()) return; + if(_currentBatch.isEmpty() && _processQueue.isEmpty()) + return; _processing = true; - _msgsProcessed = 0; - _msgCount = _currentBatch.count(); - foreach(QList msglist, _processQueue) _msgCount += msglist.count(); - updateProgress(); - if(!_processTimer.isActive()) _processTimer.start(); + if(!_processTimer.isActive()) + _processTimer.start(); } } @@ -98,28 +93,12 @@ void QtUiMessageProcessor::processNextMessage() { if(_processQueue.isEmpty()) { _processTimer.stop(); _processing = false; - _msgsProcessed = _msgCount = 0; - updateProgress(); return; } _currentBatch = _processQueue.takeFirst(); } Message msg = _currentBatch.takeFirst(); process(msg); - _msgsProcessed++; - updateProgress(); -} - -void QtUiMessageProcessor::updateProgress(bool start) { - if(start) { - _progressTimer.start(); - emit progressUpdated(_msgsProcessed, _msgCount); - } else { - if(_msgCount == 0 || _progressTimer.elapsed() >= progressUpdateDelay) { - _progressTimer.restart(); - emit progressUpdated(_msgsProcessed, _msgCount); - } - } } void QtUiMessageProcessor::checkForHighlight(Message &msg) { diff --git a/src/qtui/qtuimessageprocessor.h b/src/qtui/qtuimessageprocessor.h index 64ae5a05..40eb8604 100644 --- a/src/qtui/qtuimessageprocessor.h +++ b/src/qtui/qtuimessageprocessor.h @@ -55,15 +55,12 @@ private slots: private: void checkForHighlight(Message &msg); void startProcessing(); - void updateProgress(bool start = false); QList > _processQueue; QList _currentBatch; QTimer _processTimer; bool _processing; Mode _processMode; - int _msgsProcessed, _msgCount; - QTime _progressTimer; struct HighlightRule { QString name; diff --git a/src/qtui/ui/msgprocessorstatuswidget.ui b/src/qtui/ui/msgprocessorstatuswidget.ui index ab3e469d..454cdf94 100644 --- a/src/qtui/ui/msgprocessorstatuswidget.ui +++ b/src/qtui/ui/msgprocessorstatuswidget.ui @@ -5,7 +5,7 @@ 0 0 - 229 + 251 26 @@ -31,7 +31,7 @@ - Processing Messages + Receiving Backlog