From: Manuel Nickschas Date: Thu, 22 May 2008 19:08:29 +0000 (+0000) Subject: Quassel now handles even huge ChatScenes without slowing to a crawl. X-Git-Tag: 0.3.0~406 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=99bb37d9938f3d88ce7551ded454146359fadc03 Quassel now handles even huge ChatScenes without slowing to a crawl. For some bizarre reason, setting the scene's rect myself (which should save Qt from computing bounding rects) causes huge mem consumption and slows down everything. I have no idea why that would be. --- diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index b7b8cf1e..73d0bc84 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -37,6 +37,7 @@ ChatScene::ChatScene(MessageModel *model, QObject *parent) : QGraphicsScene(pare _lines.append(line); addItem(line); } + emit heightChanged(height()); } ChatScene::~ChatScene() { @@ -66,7 +67,7 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { for(int i = end+1; i < _lines.count(); i++) { _lines.value(i)->moveBy(0, h); } - //setSceneRect(0, 0, _width, _height); + emit heightChanged(height()); } } @@ -77,8 +78,7 @@ void ChatScene::setWidth(int w) { line->setPos(0, _height); _height += line->setColumnWidths(_timestampWidth, _senderWidth, w - _timestampWidth - _senderWidth); } - qDebug() << "setting width"; - setSceneRect(0, 0, _width, _height * 2); + emit heightChanged(_height); } void ChatScene::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ) { diff --git a/src/qtui/chatscene.h b/src/qtui/chatscene.h index fd720106..a0bcefc0 100644 --- a/src/qtui/chatscene.h +++ b/src/qtui/chatscene.h @@ -44,6 +44,9 @@ class ChatScene : public QGraphicsScene { public slots: void setWidth(int); + signals: + void heightChanged(int height); + protected slots: void rowsInserted(const QModelIndex &, int, int); void mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ); diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index 22d3b0e3..a4582546 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -33,9 +33,10 @@ ChatView::ChatView(Buffer *buf, QWidget *parent) : QGraphicsView(parent), Abstra |QGraphicsView::DontSavePainterState |QGraphicsView::DontAdjustForAntialiasing); _scene = new ChatScene(Client::messageModel(), this); - _scene->setWidth(width()); + connect(_scene, SIGNAL(heightChanged(int)), this, SLOT(sceneHeightChanged(int))); + //_scene->setWidth(width()); setScene(_scene); - + setSceneRect(0, 0, width(), 0); } @@ -54,6 +55,10 @@ void ChatView::resizeEvent(QResizeEvent *event) { qDebug() << "resize"; } +void ChatView::sceneHeightChanged(int h) { + setSceneRect(0, 0, width(), h); +} + void ChatView::clear() { } diff --git a/src/qtui/chatview.h b/src/qtui/chatview.h index 9799142d..100b311b 100644 --- a/src/qtui/chatview.h +++ b/src/qtui/chatview.h @@ -56,6 +56,9 @@ class ChatView : public QGraphicsView, public AbstractChatView { protected: virtual void resizeEvent(QResizeEvent *event); + protected slots: + virtual void sceneHeightChanged(int height); + private: ChatScene *_scene; };