X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fqtui%2Fchatscene.cpp;h=8bf8adde4988c2a35674e69c9dae86d28b4c78d7;hb=6e50e532fa24b8e36237eb7ae9c5c9b21058519f;hp=43ff2480214db982911d5fc37438d5a94700cd11;hpb=ba9de06a8634a30863d54001cb8f934746333d58;p=quassel.git diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 43ff2480..8bf8adde 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -23,12 +23,14 @@ #include #include -#include "buffer.h" #include "chatitem.h" #include "chatline.h" #include "chatlinemodelitem.h" #include "chatscene.h" +#include "client.h" +#include "clientbacklogmanager.h" #include "columnhandleitem.h" +#include "messagefilter.h" #include "qtui.h" #include "qtuisettings.h" @@ -36,13 +38,22 @@ const qreal minContentsWidth = 200; ChatScene::ChatScene(QAbstractItemModel *model, const QString &idString, QObject *parent) : QGraphicsScene(parent), - _idString(idString), - _model(model) + _idString(idString), + _width(0), + _height(0), + _model(model), + _singleBufferScene(false), + _selectingItem(0), + _lastItem(0), + _selectionStart(-1), + _isSelecting(false), + _fetchingBacklog(false) { - _width = 0; - _selectingItem = 0; - _isSelecting = false; - _selectionStart = -1; + MessageFilter *filter = qobject_cast(model); + if(filter) { + _singleBufferScene = filter->isSingleBufferFilter(); + } + 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 +112,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 +121,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 +288,36 @@ 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(); + } +} + +int ChatScene::sectionByScenePos(int x) { + if(x < firstColHandlePos) + return ChatLineModel::TimestampColumn; + if(x < secondColHandlePos) + return ChatLineModel::SenderColumn; + + return ChatLineModel::ContentsColumn; +}