ChatView now uses MessageFilter to display only messages for its buffer.
[quassel.git] / src / qtui / chatscene.cpp
index a78c2ba..10ebfc7 100644 (file)
 #include "chatscene.h"
 #include "quasselui.h"
 
-ChatScene::ChatScene(MessageModel *model, QObject *parent) : QGraphicsScene(parent), _model(model) {
+ChatScene::ChatScene(QAbstractItemModel *model, QObject *parent) : QGraphicsScene(parent), _model(model) {
+  _width = 0;
+  _timestampWidth = 60;
+  _senderWidth = 80;
   connect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int, int)));
   for(int i = 0; i < model->rowCount(); i++) {
-    ChatItem *item = new ChatItem(QPersistentModelIndex(model->index(i, 2)));
-    addItem(item);
-    item->setPos(30, i*item->boundingRect().height());
+    ChatLine *line = new ChatLine(model->index(i, 0));
+    _lines.append(line);
+    addItem(line);
   }
-
-  
+  emit heightChanged(height());
 }
 
 ChatScene::~ChatScene() {
@@ -43,6 +45,41 @@ ChatScene::~ChatScene() {
 
 }
 
+void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) {
+  Q_UNUSED(index);
+  // maybe make this more efficient by prepending stuff with negative yval
+  // dunno if that's worth not guranteeing that 0 is on the top...
+  // TODO bulk inserts, iterators
+  int h = 0;
+  int y = 0;
+  if(_width && start > 0) y = _lines.value(start - 1)->y() + _lines.value(start - 1)->height();
+  for(int i = start; i <= end; i++) {
+    ChatLine *line = new ChatLine(model()->index(i, 0));
+    _lines.insert(i, line);
+    addItem(line);
+    if(_width > 0) {
+      line->setPos(0, y+h);
+      h += line->setColumnWidths(_timestampWidth, _senderWidth, _width - _timestampWidth - _senderWidth);
+    }
+  }
+  if(h > 0) {
+    _height += h;
+    for(int i = end+1; i < _lines.count(); i++) {
+      _lines.value(i)->moveBy(0, h);
+    }
+    emit heightChanged(height());
+  }
+}
+
+void ChatScene::setWidth(int w) {
+  _width = w;
+  _height = 0;
+  foreach(ChatLine *line, _lines) {
+    line->setPos(0, _height);
+    _height += line->setColumnWidths(_timestampWidth, _senderWidth, w - _timestampWidth - _senderWidth);
+  }
+  emit heightChanged(_height);
+}
 
 void ChatScene::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ) {
   /*