X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatscene.cpp;h=d02bfc64a7429b4e3393a9942fe0cc03b7314c12;hp=f68a81e2ea75143ad76440d6b8dc17fa0d692329;hb=514e28135038076a91d3b4853b41b258551bd196;hpb=0a3fcc38ea09618d41280e2fcb20e73fb10b8ceb diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index f68a81e2..d02bfc64 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "chatitem.h" #include "chatline.h" @@ -38,9 +39,9 @@ const qreal minContentsWidth = 200; -class ClearWebPreviewEvent : public QEvent { +class ChatScene::ClearWebPreviewEvent : public QEvent { public: - inline ClearWebPreviewEvent() : QEvent(QEvent::User) {} + inline ClearWebPreviewEvent() : QEvent((QEvent::Type)ChatScene::ClearWebPreviewEventType) {} }; ChatScene::ChatScene(QAbstractItemModel *model, const QString &idString, qreal width, QObject *parent) @@ -93,6 +94,8 @@ ChatScene::ChatScene(QAbstractItemModel *model, const QString &idString, qreal w webPreview.delayTimer.setSingleShot(true); connect(&webPreview.delayTimer, SIGNAL(timeout()), this, SLOT(showWebPreview())); + webPreview.deleteTimer.setInterval(600000); + connect(&webPreview.deleteTimer, SIGNAL(timeout()), this, SLOT(deleteWebPreview())); } ChatScene::~ChatScene() { @@ -188,6 +191,10 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { } } + // check if all went right + Q_ASSERT(start == 0 || _lines.at(start - 1)->pos().y() + _lines.at(start - 1)->height() == _lines.at(start)->pos().y()); + Q_ASSERT(end + 1 == _lines.count() || _lines.at(end)->pos().y() + _lines.at(end)->height() == _lines.at(end + 1)->pos().y()); + if(!atBottom) { if(start < _firstLineRow) { int prevFirstLineRow = _firstLineRow + (end - start + 1); @@ -199,10 +206,9 @@ 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); } - } void ChatScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) { @@ -263,6 +269,8 @@ void ChatScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int e } } + Q_ASSERT(start == 0 || _lines.at(start - 1)->pos().y() + _lines.at(start - 1)->height() == _lines.at(start)->pos().y()); + Q_ASSERT(end + 1 == _lines.count() || _lines.at(end)->pos().y() + _lines.at(end)->height() == _lines.at(end + 1)->pos().y()); // update sceneRect // when searching for the first non-date-line we have to take into account that our @@ -557,14 +565,17 @@ void ChatScene::updateSceneRect(qreal width) { void ChatScene::updateSceneRect(const QRectF &rect) { _sceneRect = rect; setSceneRect(rect); + update(); } void ChatScene::customEvent(QEvent *event) { - if(event->type() != QEvent::User) + switch(event->type()) { + case ClearWebPreviewEventType: + clearWebPreviewEvent((ClearWebPreviewEvent *)event); + break; + default: return; - - event->accept(); - clearWebPreviewEvent(); + } } void ChatScene::loadWebPreview(ChatItem *parentItem, const QString &url, const QRectF &urlRect) { @@ -573,20 +584,23 @@ 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; if(webPreview.url != url) { webPreview.url = url; // load a new web view and delete the old one (if exists) - if(webPreview.previewItem) { + if(webPreview.previewItem && webPreview.previewItem->scene()) { removeItem(webPreview.previewItem); delete webPreview.previewItem; } webPreview.previewItem = new WebPreviewItem(url); webPreview.delayTimer.start(2000); + webPreview.deleteTimer.stop(); + } else if(webPreview.previewItem && !webPreview.previewItem->scene()) { + // we just have to readd the item to the scene + webPreview.delayTimer.start(2000); + webPreview.deleteTimer.stop(); } if(webPreview.urlRect != urlRect) { webPreview.urlRect = urlRect; @@ -607,7 +621,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,26 +631,28 @@ void ChatScene::clearWebPreview(ChatItem *parentItem) { void ChatScene::showWebPreview() { #ifdef HAVE_WEBKIT - qDebug() << "show event" << this << webPreview.previewItem; if(webPreview.previewItem) addItem(webPreview.previewItem); #endif } -void ChatScene::clearWebPreviewEvent() { +void ChatScene::clearWebPreviewEvent(ClearWebPreviewEvent *event) { #ifdef HAVE_WEBKIT - qDebug() << "clear event" << this << webPreview.previewItem; + event->accept(); + if(webPreview.previewItem && webPreview.previewItem->scene()) { + removeItem(webPreview.previewItem); + webPreview.deleteTimer.start(); + } + webPreview.delayTimer.stop(); +#endif +} + +void ChatScene::deleteWebPreview() { if(webPreview.previewItem) { -// if(webPreview.previewItem->scene()) { -// removeItem(webPreview.previewItem); -// items(); -// } delete webPreview.previewItem; - items(); webPreview.previewItem = 0; } webPreview.parentItem = 0; webPreview.url = QString(); webPreview.urlRect = QRectF(); -#endif }