From: Marcus Eggenberger Date: Mon, 6 Oct 2008 12:59:41 +0000 (+0200) Subject: fixing auto scroll issues when chatlines are inserted (not appended) into the lower... X-Git-Tag: 0.3.1~196 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=22128f214112de5e4f3111e0a90f7d5d99e82dac fixing auto scroll issues when chatlines are inserted (not appended) into the lower half of the scene --- diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index edc11179..28872dc7 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -111,10 +111,13 @@ void MessageModel::insertMessageGroup(const QList &msglist) { && _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--; } diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index f68a81e2..67415cc3 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -199,8 +199,8 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { _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 - qDebug() << "load call" << this << webPreview.previewItem; - if(webPreview.parentItem != parentItem) webPreview.parentItem = parentItem; @@ -607,7 +605,6 @@ void ChatScene::clearWebPreview(ChatItem *parentItem) { #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 @@ -618,7 +615,6 @@ void ChatScene::clearWebPreview(ChatItem *parentItem) { void ChatScene::showWebPreview() { #ifdef HAVE_WEBKIT - qDebug() << "show event" << this << webPreview.previewItem; if(webPreview.previewItem) addItem(webPreview.previewItem); #endif @@ -626,14 +622,11 @@ void ChatScene::showWebPreview() { void ChatScene::clearWebPreviewEvent() { #ifdef HAVE_WEBKIT - qDebug() << "clear event" << this << webPreview.previewItem; if(webPreview.previewItem) { -// if(webPreview.previewItem->scene()) { -// removeItem(webPreview.previewItem); -// items(); -// } + if(webPreview.previewItem->scene()) { + removeItem(webPreview.previewItem); + } delete webPreview.previewItem; - items(); webPreview.previewItem = 0; } webPreview.parentItem = 0; diff --git a/src/qtui/chatscene.h b/src/qtui/chatscene.h index f3c3d6e5..04182326 100644 --- a/src/qtui/chatscene.h +++ b/src/qtui/chatscene.h @@ -70,7 +70,7 @@ public slots: void clearWebPreview(ChatItem *parentItem = 0); signals: - void lastLineChanged(QGraphicsItem *); + void lastLineChanged(QGraphicsItem *item, qreal offset); protected: virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent); diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index f0daee04..0c3d4bbe 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -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 &))); - 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))); @@ -76,10 +76,11 @@ void ChatView::resizeEvent(QResizeEvent *event) { 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); - 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()); } } diff --git a/src/qtui/chatview.h b/src/qtui/chatview.h index eab096b9..293e97c6 100644 --- a/src/qtui/chatview.h +++ b/src/qtui/chatview.h @@ -48,7 +48,7 @@ protected: 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);