X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatscene.cpp;h=a6578fa657dcb7ca6711486c0c6a3dc169d28799;hp=43ff2480214db982911d5fc37438d5a94700cd11;hb=dbefd590650e9053c7a1513a5f49aad3e582108a;hpb=ba9de06a8634a30863d54001cb8f934746333d58 diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 43ff2480..a6578fa6 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -28,6 +28,8 @@ #include "chatline.h" #include "chatlinemodelitem.h" #include "chatscene.h" +#include "client.h" +#include "clientbacklogmanager.h" #include "columnhandleitem.h" #include "qtui.h" #include "qtuisettings.h" @@ -43,6 +45,8 @@ ChatScene::ChatScene(QAbstractItemModel *model, const QString &idString, QObject _selectingItem = 0; _isSelecting = false; _selectionStart = -1; + _fetchingBacklog = false; + connect(this, SIGNAL(sceneRectChanged(const QRectF &)), this, SLOT(rectChanged(const QRectF &))); connect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int, int))); @@ -101,7 +105,7 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { for(int i = end+1; i < _lines.count(); i++) { _lines[i]->setRow(i); } - + if(h > 0) { _height += h; for(int i = end+1; i < _lines.count(); i++) { @@ -110,6 +114,8 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { setSceneRect(QRectF(0, 0, _width, _height)); emit heightChanged(_height); } + + requestBacklogIfNeeded(); } void ChatScene::modelReset() { @@ -275,3 +281,27 @@ QString ChatScene::selectionToString() const { } return result; } + +void ChatScene::setIsFetchingBacklog(bool fetch) { + if(!isBacklogFetchingEnabled()) return; + + if(!fetch) { + _fetchingBacklog = false; + } else { + _fetchingBacklog = true; + requestBacklogIfNeeded(); + } +} + +void ChatScene::requestBacklogIfNeeded() { + const int REQUEST_COUNT = 50; + + if(!isBacklogFetchingEnabled() || !isFetchingBacklog() || !model()->rowCount()) return; + + MsgId msgId = model()->data(model()->index(0, 0), ChatLineModel::MsgIdRole).value(); + if(!_lastBacklogOffset.isValid() || (msgId < _lastBacklogOffset && _lastBacklogSize + REQUEST_COUNT <= model()->rowCount())) { + Client::backlogManager()->requestBacklog(bufferForBacklogFetching(), REQUEST_COUNT, msgId.toInt()); + _lastBacklogOffset = msgId; + _lastBacklogSize = model()->rowCount(); + } +}