From: Marcus Eggenberger Date: Sat, 4 Oct 2008 19:48:05 +0000 (+0200) Subject: WebPreview is now delayed by 2 seconds. X-Git-Tag: 0.3.1~207 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=8c171717381424c896b9f720db203ddb815c76e1 WebPreview is now delayed by 2 seconds. Insertion / Removal are now handled by Qt's event system to avoid interferaence with other Events (read: avoid segfaults) Preview is now longer removed if a new message is inserted and you still hover over the link --- diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 4734d9c9..d778df23 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -38,6 +38,11 @@ const qreal minContentsWidth = 200; +class ClearWebPreviewEvent : public QEvent { +public: + inline ClearWebPreviewEvent() : QEvent(QEvent::User) {} +}; + ChatScene::ChatScene(QAbstractItemModel *model, const QString &idString, qreal width, QObject *parent) : QGraphicsScene(0, 0, width, 0, parent), _idString(idString), @@ -85,6 +90,9 @@ ChatScene::ChatScene(QAbstractItemModel *model, const QString &idString, qreal w if(model->rowCount() > 0) rowsInserted(QModelIndex(), 0, model->rowCount() - 1); + + webPreview.delayTimer.setSingleShot(true); + connect(&webPreview.delayTimer, SIGNAL(timeout()), this, SLOT(showWebPreview())); } ChatScene::~ChatScene() { @@ -92,9 +100,6 @@ ChatScene::~ChatScene() { void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { Q_UNUSED(index); - - clearWebPreview(); - // QModelIndex sidx = model()->index(start, 0); // QModelIndex eidx = model()->index(end, 0); // qDebug() << "rowsInserted" << start << end << "-" << sidx.data(MessageModel::MsgIdRole).value() << eidx.data(MessageModel::MsgIdRole).value(); @@ -203,8 +208,6 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { void ChatScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) { Q_UNUSED(parent); - clearWebPreview(); - qreal h = 0; // total height of removed items; bool atTop = (start == 0); @@ -556,6 +559,13 @@ void ChatScene::updateSceneRect(const QRectF &rect) { setSceneRect(rect); } +void ChatScene::customEvent(QEvent *event) { + if(event->type() != QEvent::User) + return; + + event->accept(); + clearWebPreviewEvent(); +} void ChatScene::loadWebPreview(ChatItem *parentItem, const QString &url, const QRectF &urlRect) { #ifndef HAVE_WEBKIT @@ -574,7 +584,7 @@ void ChatScene::loadWebPreview(ChatItem *parentItem, const QString &url, const Q delete webPreview.previewItem; } webPreview.previewItem = new WebPreviewItem(url); - addItem(webPreview.previewItem); + webPreview.delayTimer.start(2000); } if(webPreview.urlRect != urlRect) { webPreview.urlRect = urlRect; @@ -596,14 +606,32 @@ void ChatScene::clearWebPreview(ChatItem *parentItem) { Q_UNUSED(parentItem) #else if(parentItem == 0 || webPreview.parentItem == parentItem) { - if(webPreview.previewItem) { - removeItem(webPreview.previewItem); - delete webPreview.previewItem; - webPreview.previewItem = 0; - } - webPreview.parentItem = 0; - webPreview.url = QString(); - webPreview.urlRect = QRectF(); + // posting an event ensures that the item will not be removed as + // the result of another event. this could result in bad segfaults + QCoreApplication::postEvent(this, new ClearWebPreviewEvent()); } #endif } + +void ChatScene::showWebPreview() { +#ifdef HAVE_WEBKIT + if(webPreview.previewItem) + addItem(webPreview.previewItem); +#endif +} + +void ChatScene::clearWebPreviewEvent() { +#ifdef HAVE_WEBKIT + if(webPreview.previewItem) { + if(!webPreview.delayTimer.isActive()) + removeItem(webPreview.previewItem); + else + webPreview.delayTimer.stop(); + delete webPreview.previewItem; + webPreview.previewItem = 0; + } + webPreview.parentItem = 0; + webPreview.url = QString(); + webPreview.urlRect = QRectF(); +#endif +} diff --git a/src/qtui/chatscene.h b/src/qtui/chatscene.h index c6ea9fec..f3c3d6e5 100644 --- a/src/qtui/chatscene.h +++ b/src/qtui/chatscene.h @@ -76,6 +76,7 @@ protected: virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent); virtual void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent); virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent); + virtual void customEvent(QEvent *event); protected slots: void rowsInserted(const QModelIndex &, int, int); @@ -83,6 +84,8 @@ protected slots: private slots: void handlePositionChanged(qreal xpos); + void showWebPreview(); + void clearWebPreviewEvent(); private: void setHandleXLimits(); @@ -120,6 +123,7 @@ private: WebPreviewItem *previewItem; QString url; QRectF urlRect; + QTimer delayTimer; WebPreview() : parentItem(0), previewItem(0) {} }; WebPreview webPreview; diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index 22150ddd..f0daee04 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -65,9 +65,13 @@ void ChatView::init(MessageFilter *filter) { void ChatView::resizeEvent(QResizeEvent *event) { QGraphicsView::resizeEvent(event); + // we can reduce viewport updates if we scroll to the bottom allready at the beginning + verticalScrollBar()->setValue(verticalScrollBar()->maximum()); + // FIXME: without the hardcoded -2 Qt reserves space for a horizontal scrollbar even though it's disabled permanently. // this does only occur on QtX11 (at least not on Qt for Mac OS). Seems like a Qt Bug. scene()->updateForViewport(viewport()->width() - 2, viewport()->height()); + _lastScrollbarPos = verticalScrollBar()->maximum(); verticalScrollBar()->setValue(verticalScrollBar()->maximum()); }