qa: Avoid deprecation warnings for QList/QSet conversions
[quassel.git] / src / qtui / webpreviewitem.cpp
index 4941fa2..e987e3d 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2016 by the Quassel Project                        *
+ *   Copyright (C) 2005-2019 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 #include "webpreviewitem.h"
 
 #ifdef HAVE_WEBENGINE
-#include <QWebEngineView>
-#include <QWebEngineSettings>
+#    include <QWebEngineSettings>
+#    include <QWebEngineView>
 #elif defined HAVE_WEBKIT
-#include <QWebView>
-#include <QWebSettings>
+#    include <QWebSettings>
+#    include <QWebView>
 #endif
 
 #if defined HAVE_WEBKIT || defined HAVE_WEBENGINE
 
-#include <QGraphicsProxyWidget>
-#include <QPainter>
+#    include <QGraphicsProxyWidget>
+#    include <QPainter>
 
-WebPreviewItem::WebPreviewItem(const QUrl &url)
-    : QGraphicsItem(0), // needs to be a top level item as we otherwise cannot guarantee that it's on top of other chatlines
+#    ifdef HAVE_WEBENGINE
+// QGraphicsProxyWidget does not stay synced with QWebEngineView, therefore we modify QWebEngineView
+// and manually trigger an update of the proxyItem on UpdateRequest Event. See: http://stackoverflow.com/a/30920209
+// and http://lists.qt-project.org/pipermail/development/2016-March/025280.html (At least in Qt5.6)
+class CustomWebView : public QWebEngineView
+{
+private:
+    QGraphicsProxyWidget* proxyItem;
+
+public:
+    CustomWebView(QGraphicsProxyWidget* pItem) { proxyItem = pItem; }
+    bool event(QEvent* event) override
+    {
+        if (event->type() == QEvent::UpdateRequest) {
+            proxyItem->update();
+        }
+
+        return QWebEngineView::event(event);
+    }
+};
+#    endif
+
+WebPreviewItem::WebPreviewItem(const QUrl& url)
+    : QGraphicsItem(nullptr)
+    ,  // needs to be a top level item as we otherwise cannot guarantee that it's on top of other chatlines
     _boundingRect(0, 0, 400, 300)
 {
     qreal frameWidth = 5;
 
-#ifdef HAVE_WEBENGINE
-    QWebEngineView *webView = new QWebEngineView;
+    QGraphicsProxyWidget* proxyItem = new QGraphicsProxyWidget(this);
+#    ifdef HAVE_WEBENGINE
+    QWebEngineView* webView = new CustomWebView(proxyItem);
     webView->settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, false);
-#elif defined HAVE_WEBKIT
-    QWebView *webView = new QWebView;
+#    elif defined HAVE_WEBKIT
+    QWebViewwebView = new QWebView;
     webView->settings()->setAttribute(QWebSettings::JavascriptEnabled, false);
-#endif
+#    endif
     webView->load(url);
     webView->setDisabled(true);
     webView->resize(1000, 750);
-    QGraphicsProxyWidget *proxyItem = new QGraphicsProxyWidget(this);
     proxyItem->setWidget(webView);
     proxyItem->setAcceptHoverEvents(false);
 
@@ -61,10 +84,10 @@ WebPreviewItem::WebPreviewItem(const QUrl &url)
     setZValue(30);
 }
 
-
-void WebPreviewItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+void WebPreviewItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
 {
-    Q_UNUSED(option); Q_UNUSED(widget);
+    Q_UNUSED(option);
+    Q_UNUSED(widget);
     painter->setClipRect(boundingRect());
     painter->setPen(QPen(Qt::black, 5));
     painter->setBrush(Qt::black);
@@ -72,5 +95,4 @@ void WebPreviewItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *op
     painter->drawRoundedRect(boundingRect(), 10, 10);
 }
 
-
-#endif //#ifdef HAVE_WEBKIT || HAVE_WEBENGINE
+#endif  //#ifdef HAVE_WEBKIT || HAVE_WEBENGINE