From: Marcus Eggenberger Date: Thu, 11 Sep 2008 12:29:19 +0000 (+0200) Subject: even faster resizing X-Git-Tag: 0.3.1~283 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=642ccc0534c82498a4740931c6707bd419224688 even faster resizing --- diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index f9f7b17c..6c54f7c7 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -41,6 +41,7 @@ ChatScene::ChatScene(QAbstractItemModel *model, const QString &idString, qreal w _idString(idString), _model(model), _singleBufferScene(false), + _sceneRect(0, 0, width, 0), _selectingItem(0), _selectionStart(-1), _isSelecting(false), @@ -88,8 +89,8 @@ ChatScene::~ChatScene() { void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { Q_UNUSED(index); qreal h = 0; - qreal y = sceneRect().y(); - qreal width = sceneRect().width(); + qreal y = _sceneRect.y(); + qreal width = _sceneRect.width(); bool atTop = true; bool atBottom = false; bool moveTop = false; @@ -154,9 +155,9 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { // update sceneRect if(atTop || moveTop) { - setSceneRect(sceneRect().adjusted(0, h, 0, 0)); + updateSceneRect(_sceneRect.adjusted(0, h, 0, 0)); } else { - setSceneRect(sceneRect().adjusted(0, 0, 0, h)); + updateSceneRect(_sceneRect.adjusted(0, 0, 0, h)); emit sceneHeightChanged(h); } @@ -222,20 +223,19 @@ void ChatScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int e // update sceneRect if(atTop || moveTop) { - setSceneRect(sceneRect().adjusted(0, h, 0, 0)); + updateSceneRect(_sceneRect.adjusted(0, h, 0, 0)); } else { - setSceneRect(sceneRect().adjusted(0, 0, 0, -h)); + updateSceneRect(_sceneRect.adjusted(0, 0, 0, -h)); } - } void ChatScene::setWidth(qreal width, bool forceReposition) { - if(width == sceneRect().width() && !forceReposition) + if(width == _sceneRect.width() && !forceReposition) return; // clock_t startT = clock(); - qreal oldHeight = sceneRect().height(); - qreal y = sceneRect().y(); + qreal oldHeight = _sceneRect.height(); + qreal y = _sceneRect.y(); qreal linePos = y; foreach(ChatLine *line, _lines) { @@ -245,7 +245,7 @@ void ChatScene::setWidth(qreal width, bool forceReposition) { qreal height = linePos - y; - setSceneRect(QRectF(0, y, width, height)); + updateSceneRect(QRectF(0, y, width, height)); setHandleXLimits(); qreal dh = height - oldHeight; @@ -434,3 +434,8 @@ int ChatScene::sectionByScenePos(int x) { return ChatLineModel::ContentsColumn; } + +void ChatScene::updateSceneRect(const QRectF &rect) { + _sceneRect = rect; + setSceneRect(rect); +} diff --git a/src/qtui/chatscene.h b/src/qtui/chatscene.h index 66026c1b..f54869b3 100644 --- a/src/qtui/chatscene.h +++ b/src/qtui/chatscene.h @@ -88,6 +88,11 @@ private: QList _lines; bool _singleBufferScene; + // calls to QChatScene::sceneRect() are very expensive. As we manage the scenerect ourselves + // we store the size in a member variable. + QRectF _sceneRect; + void updateSceneRect(const QRectF &rect); + ColumnHandleItem *firstColHandle, *secondColHandle; qreal firstColHandlePos, secondColHandlePos; diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index 4a5e286c..6344c9c2 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -52,6 +52,7 @@ void ChatView::init(MessageFilter *filter) { _scene = new ChatScene(filter, filter->idString(), viewport()->width() - 2, this); // see below: resizeEvent() connect(_scene, SIGNAL(sceneHeightChanged(qreal)), this, SLOT(sceneHeightChanged(qreal))); + connect(_scene, SIGNAL(sceneRectChanged(const QRectF &)), this, SLOT(sceneRectChanged(const QRectF &))); setScene(_scene); _lastScrollbarPos = verticalScrollBar()->maximum(); diff --git a/src/qtui/chatview.h b/src/qtui/chatview.h index 832d151b..5341109f 100644 --- a/src/qtui/chatview.h +++ b/src/qtui/chatview.h @@ -49,6 +49,7 @@ protected: protected slots: virtual void sceneHeightChanged(qreal dh); + virtual inline void sceneRectChanged(const QRectF &rect) { setSceneRect(rect); } virtual void verticalScrollbarChanged(int); private: