fixing auto scroll issues when chatlines are inserted (not appended) into the lower...
authorMarcus Eggenberger <egs@quassel-irc.org>
Mon, 6 Oct 2008 12:59:41 +0000 (14:59 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Mon, 6 Oct 2008 12:59:41 +0000 (14:59 +0200)
src/client/messagemodel.cpp
src/qtui/chatscene.cpp
src/qtui/chatscene.h
src/qtui/chatview.cpp
src/qtui/chatview.h

index edc1117..28872dc 100644 (file)
@@ -111,10 +111,13 @@ void MessageModel::insertMessageGroup(const QList<Message> &msglist) {
        && _messageList[prevIdx]->timeStamp() > msglist.value(0).timestamp()) {
       beginRemoveRows(QModelIndex(), prevIdx, prevIdx);
       MessageModelItem *oldItem = _messageList.takeAt(prevIdx);
        && _messageList[prevIdx]->timeStamp() > msglist.value(0).timestamp()) {
       beginRemoveRows(QModelIndex(), prevIdx, prevIdx);
       MessageModelItem *oldItem = _messageList.takeAt(prevIdx);
-      if(msglist.last().timestamp() < oldItem->timeStamp())
-       dayChangeItem = oldItem;
-      else
-       delete oldItem;
+      if(msglist.last().timestamp() < oldItem->timeStamp()) {
+       // we have to reinsert it (with changed msgId -> thus we need to recreate it)
+       Message dayChangeMsg = Message::ChangeOfDay(oldItem->timeStamp());
+       dayChangeMsg.setMsgId(msglist.last().msgId());
+       dayChangeItem = createMessageModelItem(dayChangeMsg);
+      }
+      delete oldItem;
       endRemoveRows();
       idx--;
     }
       endRemoveRows();
       idx--;
     }
index f68a81e..67415cc 100644 (file)
@@ -199,8 +199,8 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) {
     _firstLineRow = -1;
   }
   updateSceneRect();
     _firstLineRow = -1;
   }
   updateSceneRect();
-  if(atBottom) {
-    emit lastLineChanged(_lines.last());
+  if(atBottom || (!atTop && !moveTop)) {
+    emit lastLineChanged(_lines.last(), h);
   }
 
 }
   }
 
 }
@@ -573,8 +573,6 @@ void ChatScene::loadWebPreview(ChatItem *parentItem, const QString &url, const Q
   Q_UNUSED(url)
   Q_UNUSED(urlRect)
 #else
   Q_UNUSED(url)
   Q_UNUSED(urlRect)
 #else
-    qDebug() << "load call" << this << webPreview.previewItem;
-
   if(webPreview.parentItem != parentItem)
     webPreview.parentItem = parentItem;
 
   if(webPreview.parentItem != parentItem)
     webPreview.parentItem = parentItem;
 
@@ -607,7 +605,6 @@ void ChatScene::clearWebPreview(ChatItem *parentItem) {
 #ifndef HAVE_WEBKIT
   Q_UNUSED(parentItem)
 #else
 #ifndef HAVE_WEBKIT
   Q_UNUSED(parentItem)
 #else
-    qDebug() << "clear call" << this << webPreview.previewItem;
   if(parentItem == 0 || webPreview.parentItem == parentItem) {
     // posting an event ensures that the item will not be removed as
     // the result of another event. this could result in bad segfaults
   if(parentItem == 0 || webPreview.parentItem == parentItem) {
     // posting an event ensures that the item will not be removed as
     // the result of another event. this could result in bad segfaults
@@ -618,7 +615,6 @@ void ChatScene::clearWebPreview(ChatItem *parentItem) {
 
 void ChatScene::showWebPreview() {
 #ifdef HAVE_WEBKIT
 
 void ChatScene::showWebPreview() {
 #ifdef HAVE_WEBKIT
-  qDebug() << "show event" << this << webPreview.previewItem;
   if(webPreview.previewItem)
     addItem(webPreview.previewItem);
 #endif
   if(webPreview.previewItem)
     addItem(webPreview.previewItem);
 #endif
@@ -626,14 +622,11 @@ void ChatScene::showWebPreview() {
 
 void ChatScene::clearWebPreviewEvent() {
 #ifdef HAVE_WEBKIT
 
 void ChatScene::clearWebPreviewEvent() {
 #ifdef HAVE_WEBKIT
-  qDebug() << "clear event" << this << webPreview.previewItem;
   if(webPreview.previewItem) {
   if(webPreview.previewItem) {
-//     if(webPreview.previewItem->scene()) {
-//       removeItem(webPreview.previewItem);
-//       items();
-//     }
+    if(webPreview.previewItem->scene()) {
+      removeItem(webPreview.previewItem);
+    }
     delete webPreview.previewItem;
     delete webPreview.previewItem;
-    items();
     webPreview.previewItem = 0;
   }
   webPreview.parentItem = 0;
     webPreview.previewItem = 0;
   }
   webPreview.parentItem = 0;
index f3c3d6e..0418232 100644 (file)
@@ -70,7 +70,7 @@ public slots:
   void clearWebPreview(ChatItem *parentItem = 0);
 
 signals:
   void clearWebPreview(ChatItem *parentItem = 0);
 
 signals:
-  void lastLineChanged(QGraphicsItem *);
+  void lastLineChanged(QGraphicsItem *item, qreal offset);
 
 protected:
   virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent);
 
 protected:
   virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent);
index f0daee0..0c3d4bb 100644 (file)
@@ -56,7 +56,7 @@ void ChatView::init(MessageFilter *filter) {
 
   _scene = new ChatScene(filter, filter->idString(), viewport()->width() - 2, this); // see below: resizeEvent()
   connect(_scene, SIGNAL(sceneRectChanged(const QRectF &)), this, SLOT(sceneRectChanged(const QRectF &)));
 
   _scene = new ChatScene(filter, filter->idString(), viewport()->width() - 2, this); // see below: resizeEvent()
   connect(_scene, SIGNAL(sceneRectChanged(const QRectF &)), this, SLOT(sceneRectChanged(const QRectF &)));
-  connect(_scene, SIGNAL(lastLineChanged(QGraphicsItem *)), this, SLOT(lastLineChanged(QGraphicsItem *)));
+  connect(_scene, SIGNAL(lastLineChanged(QGraphicsItem *, qreal)), this, SLOT(lastLineChanged(QGraphicsItem *, qreal)));
   setScene(_scene);
 
   connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(verticalScrollbarChanged(int)));
   setScene(_scene);
 
   connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(verticalScrollbarChanged(int)));
@@ -76,10 +76,11 @@ void ChatView::resizeEvent(QResizeEvent *event) {
   verticalScrollBar()->setValue(verticalScrollBar()->maximum());
 }
 
   verticalScrollBar()->setValue(verticalScrollBar()->maximum());
 }
 
-void ChatView::lastLineChanged(QGraphicsItem *chatLine) {
+void ChatView::lastLineChanged(QGraphicsItem *chatLine, qreal offset) {
+  Q_UNUSED(chatLine)
   QAbstractSlider *vbar = verticalScrollBar();
   Q_ASSERT(vbar);
   QAbstractSlider *vbar = verticalScrollBar();
   Q_ASSERT(vbar);
-  if(vbar->maximum() - vbar->value() <= chatLine->boundingRect().height() + 5) { // 5px grace area
+  if(vbar->maximum() - vbar->value() <= offset + 5) { // 5px grace area
     vbar->setValue(vbar->maximum());
   }
 }
     vbar->setValue(vbar->maximum());
   }
 }
index eab096b..293e97c 100644 (file)
@@ -48,7 +48,7 @@ protected:
   virtual void resizeEvent(QResizeEvent *event);
 
 protected slots:
   virtual void resizeEvent(QResizeEvent *event);
 
 protected slots:
-  void lastLineChanged(QGraphicsItem *chatLine);
+  void lastLineChanged(QGraphicsItem *chatLine, qreal offset);
   virtual inline void sceneRectChanged(const QRectF &rect) { setSceneRect(rect); }
   virtual void verticalScrollbarChanged(int);
 
   virtual inline void sceneRectChanged(const QRectF &rect) { setSceneRect(rect); }
   virtual void verticalScrollbarChanged(int);