even faster resizing
authorMarcus Eggenberger <egs@quassel-irc.org>
Thu, 11 Sep 2008 12:29:19 +0000 (14:29 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Thu, 11 Sep 2008 12:29:19 +0000 (14:29 +0200)
src/qtui/chatscene.cpp
src/qtui/chatscene.h
src/qtui/chatview.cpp
src/qtui/chatview.h

index f9f7b17..6c54f7c 100644 (file)
@@ -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);
+}
index 66026c1..f54869b 100644 (file)
@@ -88,6 +88,11 @@ private:
   QList<ChatLine *> _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;
 
index 4a5e286..6344c9c 100644 (file)
@@ -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();
index 832d151..5341109 100644 (file)
@@ -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: