From: Manuel Nickschas Date: Wed, 21 May 2008 09:09:41 +0000 (+0000) Subject: Handle rowsInserted() and add new messages to the scene. X-Git-Tag: 0.3.0~411 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=da2b5b2e4e2b0ea1847a0a5f0cb4a3752fc655c9;ds=inline Handle rowsInserted() and add new messages to the scene. --- diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index 1202b93f..c518c5fe 100644 --- a/src/qtui/chatitem.cpp +++ b/src/qtui/chatitem.cpp @@ -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); diff --git a/src/qtui/chatline.cpp b/src/qtui/chatline.cpp index 921258b1..cf3c3fa3 100644 --- a/src/qtui/chatline.cpp +++ b/src/qtui/chatline.cpp @@ -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) { diff --git a/src/qtui/chatline.h b/src/qtui/chatline.h index a7db7e4a..7f837357 100644 --- a/src/qtui/chatline.h +++ b/src/qtui/chatline.h @@ -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 diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index d51050f9..d4255556 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -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 ) { diff --git a/src/qtui/chatscene.h b/src/qtui/chatscene.h index 8122872f..fd720106 100644 --- a/src/qtui/chatscene.h +++ b/src/qtui/chatscene.h @@ -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 _lines;