Handle rowsInserted() and add new messages to the scene.
authorManuel Nickschas <sputnick@quassel-irc.org>
Wed, 21 May 2008 09:09:41 +0000 (09:09 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 21 May 2008 09:09:41 +0000 (09:09 +0000)
src/qtui/chatitem.cpp
src/qtui/chatline.cpp
src/qtui/chatline.h
src/qtui/chatscene.cpp
src/qtui/chatscene.h

index 1202b93..c518c5f 100644 (file)
@@ -37,7 +37,7 @@ ChatItem::~ChatItem() {
 
 QVariant ChatItem::data(int role) const {
   if(!_index.isValid()) {
-    qWarning() << "ChatItem::data(): Model index is invalid!";
+    qWarning() << "ChatItem::data(): Model index is invalid!" << _index;
     return QVariant();
   }
   return _index.data(role);
index 921258b..cf3c3fa 100644 (file)
@@ -33,6 +33,7 @@ ChatLine::ChatLine(const QModelIndex &index, QGraphicsItem *parent) : QGraphicsI
   _contentsItem = new ChatItem(QPersistentModelIndex(index.sibling(index.row(), ChatLineModel::ContentsColumn)), this);
 
   _timestampItem->setPos(0,0);
+  _width = _height = 0;
 }
 
 ChatLine::~ChatLine() {
@@ -41,20 +42,21 @@ ChatLine::~ChatLine() {
   delete _contentsItem;
 }
 
-// FIXME make more efficient by caching width/height
 QRectF ChatLine::boundingRect () const {
-  return childrenBoundingRect();
+  //return childrenBoundingRect();
+  return QRectF(0, 0, _width, _height);
 }
 
 int ChatLine::setColumnWidths(int ts, int sender, int contents) {
   _timestampItem->setWidth(ts);
   _senderItem->setWidth(sender);
-  int h = _contentsItem->setWidth(contents);
+  _height = _contentsItem->setWidth(contents);
 
   _senderItem->setPos(ts, 0);
   _contentsItem->setPos(ts + sender, 0);
 
-  return h;
+  _width = ts + sender + contents;
+  return _height;
 }
 
 void ChatLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
index a7db7e4..7f83735 100644 (file)
@@ -34,6 +34,9 @@ class ChatLine : public QGraphicsItem {
     virtual ~ChatLine();
 
     virtual QRectF boundingRect () const;
+    inline int width() const { return _width; }
+    inline int height() const { return _height; }
+
     virtual void paint (QPainter * painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
     //void layout();
 
@@ -47,6 +50,7 @@ class ChatLine : public QGraphicsItem {
 
   private:
     ChatItem *_timestampItem, *_senderItem, *_contentsItem;
+    int _width, _height;
 };
 
 #endif
index d51050f..d425555 100644 (file)
@@ -28,6 +28,9 @@
 #include "quasselui.h"
 
 ChatScene::ChatScene(MessageModel *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++) {
     ChatLine *line = new ChatLine(model->index(i, 0));
@@ -41,14 +44,40 @@ 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);
+    }
+    setSceneRect(QRectF(0, 0, _width, _height));
+  }
+}
+
 void ChatScene::setWidth(int w) {
   _width = w;
-  int h = 0;
+  _height = 0;
   foreach(ChatLine *line, _lines) {
-    line->setPos(0, h);
-    h += line->setColumnWidths(60, 80, w - 60 - 80);
+    line->setPos(0, _height);
+    _height += line->setColumnWidths(_timestampWidth, _senderWidth, w - _timestampWidth - _senderWidth);
   }
-  setSceneRect(QRectF(0, 0, w, h));
+  setSceneRect(QRectF(0, 0, _width, _height));
 }
 
 void ChatScene::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ) {
index 8122872..fd72010 100644 (file)
@@ -45,11 +45,12 @@ class ChatScene : public QGraphicsScene {
     void setWidth(int);
 
   protected slots:
-
+    void rowsInserted(const QModelIndex &, int, int);
     void mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent );
 
   private:
-    int _width;
+    int _width, _height;
+    int _timestampWidth, _senderWidth;
     MessageModel *_model;
     QList<ChatLine *> _lines;