&& _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--;
}
_firstLineRow = -1;
}
updateSceneRect();
- if(atBottom) {
- emit lastLineChanged(_lines.last());
+ if(atBottom || (!atTop && !moveTop)) {
+ emit lastLineChanged(_lines.last(), h);
}
}
Q_UNUSED(url)
Q_UNUSED(urlRect)
#else
- qDebug() << "load call" << this << webPreview.previewItem;
-
if(webPreview.parentItem != parentItem)
webPreview.parentItem = 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
void ChatScene::showWebPreview() {
#ifdef HAVE_WEBKIT
- qDebug() << "show event" << this << webPreview.previewItem;
if(webPreview.previewItem)
addItem(webPreview.previewItem);
#endif
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;
void clearWebPreview(ChatItem *parentItem = 0);
signals:
- void lastLineChanged(QGraphicsItem *);
+ void lastLineChanged(QGraphicsItem *item, qreal offset);
protected:
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent);
_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)));
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());
}
}
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);