X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatscene.cpp;h=d02bfc64a7429b4e3393a9942fe0cc03b7314c12;hp=67415cc3b7f658cbf8255e5424d81be1351e8535;hb=514e28135038076a91d3b4853b41b258551bd196;hpb=22128f214112de5e4f3111e0a90f7d5d99e82dac diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 67415cc3..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); @@ -202,7 +209,6 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { 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) { @@ -579,12 +590,17 @@ void ChatScene::loadWebPreview(ChatItem *parentItem, const QString &url, const Q 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; @@ -620,17 +636,23 @@ void ChatScene::showWebPreview() { #endif } -void ChatScene::clearWebPreviewEvent() { +void ChatScene::clearWebPreviewEvent(ClearWebPreviewEvent *event) { #ifdef HAVE_WEBKIT + 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); - } delete webPreview.previewItem; webPreview.previewItem = 0; } webPreview.parentItem = 0; webPreview.url = QString(); webPreview.urlRect = QRectF(); -#endif }