the new chatwidget now highlights the first new message since your last visit (curren...
[quassel.git] / src / qtui / chatscene.cpp
index 43ff248..8bf8add 100644 (file)
 #include <QGraphicsSceneMouseEvent>
 #include <QPersistentModelIndex>
 
-#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<MessageFilter*>(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<MsgId>();
+  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;
+}