Hide the video overlay when the QML element is hidden
authorThomas McGuire <thomas.mcguire.qnx@kdab.com>
Wed, 5 Sep 2012 11:25:03 +0000 (13:25 +0200)
committerQt by Nokia <qt-info@nokia.com>
Thu, 6 Sep 2012 12:56:34 +0000 (14:56 +0200)
An display invalid rect is used for invisible QML
items.

Change-Id: Ifb2a25f1c5387ab8cef1359ac6c3e2f90a42cd10
Reviewed-by: Dmytro Poplavskiy <dmytro.poplavskiy@gmail.com>
src/imports/multimedia/qdeclarativevideooutput_window.cpp
src/imports/multimedia/qdeclarativevideooutput_window_p.h
src/plugins/blackberry/bbvideowindowcontrol.cpp

index d85a20f..50c4fd6 100644 (file)
@@ -48,7 +48,8 @@
 QT_BEGIN_NAMESPACE
 
 QDeclarativeVideoWindowBackend::QDeclarativeVideoWindowBackend(QDeclarativeVideoOutput *parent)
-    : QDeclarativeVideoBackend(parent)
+    : QDeclarativeVideoBackend(parent),
+      m_visible(true)
 {
 }
 
@@ -76,11 +77,21 @@ bool QDeclarativeVideoWindowBackend::init(QMediaService *service)
 void QDeclarativeVideoWindowBackend::itemChange(QQuickItem::ItemChange change,
                                                 const QQuickItem::ItemChangeData &changeData)
 {
-    if (change == QQuickItem::ItemSceneChange && m_videoWindowControl) {
+    if (!m_videoWindowControl)
+        return;
+
+    switch (change) {
+    case QQuickItem::ItemVisibleHasChanged:
+        m_visible = changeData.boolValue;
+        updateGeometry();
+        break;
+    case QQuickItem::ItemSceneChange:
         if (changeData.window)
             m_videoWindowControl->setWinId(changeData.window->winId());
         else
             m_videoWindowControl->setWinId(0);
+        break;
+    default: break;
     }
 }
 
@@ -115,7 +126,7 @@ void QDeclarativeVideoWindowBackend::updateGeometry()
     };
 
     const QRectF canvasRect = q->mapRectToScene(QRectF(0, 0, q->width(), q->height()));
-    m_videoWindowControl->setDisplayRect(canvasRect.toAlignedRect());
+    m_videoWindowControl->setDisplayRect(m_visible ? canvasRect.toAlignedRect() : QRect());
 }
 
 QSGNode *QDeclarativeVideoWindowBackend::updatePaintNode(QSGNode *oldNode,
index af2e686..c1c7d2f 100644 (file)
@@ -65,6 +65,7 @@ public:
 
 private:
     QPointer<QVideoWindowControl> m_videoWindowControl;
+    bool m_visible;
 };
 
 QT_END_NAMESPACE
index 6905619..3934c31 100644 (file)
@@ -292,10 +292,13 @@ void BbVideoWindowControl::updateVideoPosition()
         if (m_window != 0) {
             const int position[2] = { topLeft.x(), topLeft.y() };
             const int size[2] = { width, height };
+            const int visible = m_displayRect.isValid();
             if (screen_set_window_property_iv(m_window, SCREEN_PROPERTY_POSITION, position) != 0)
                 perror("Setting video position failed");
             if (screen_set_window_property_iv(m_window, SCREEN_PROPERTY_SIZE, size) != 0)
                 perror("Setting video size failed");
+            if (screen_set_window_property_iv(m_window, SCREEN_PROPERTY_VISIBLE, &visible) != 0)
+                perror("Setting video visibility failed");
         }
     }
 }