Added animation to QML compositor when window is destroyed.
authorSamuel Rødal <samuel.rodal@nokia.com>
Fri, 18 Mar 2011 13:48:34 +0000 (14:48 +0100)
committerSamuel Rødal <samuel.rodal@nokia.com>
Fri, 18 Mar 2011 13:48:34 +0000 (14:48 +0100)
examples/qml-compositor/main.cpp
examples/qml-compositor/qml/QmlCompositor/WindowContainer.qml
examples/qml-compositor/qml/QmlCompositor/main.qml

index d6bb3b7..b09444b 100644 (file)
@@ -274,6 +274,11 @@ signals:
     void windowAdded(QVariant window);
     void windowDestroyed(QVariant window);
 
+public slots:
+    void destroyWindow(QVariant window) {
+        qvariant_cast<QObject *>(window)->deleteLater();
+    }
+
 private slots:
     void surfaceMapped(const QRect &rect) {
         WaylandSurface *surface = qobject_cast<WaylandSurface *>(sender());
@@ -292,7 +297,6 @@ private slots:
     void surfaceDestroyed(QObject *object) {
         WindowItem *item = m_windowMap.take(object);
         emit windowDestroyed(QVariant::fromValue(static_cast<QSGItem *>(item)));
-        item->deleteLater();
         setInputFocus(0);
     }
 
index 0bbf45c..9182f25 100644 (file)
@@ -47,8 +47,8 @@ Item {
     y: 0;
     opacity: 0
 
-    property variant chrome: null;
     property variant child: null;
+    property variant chrome: null;
     property bool animationsEnabled: false;
     property int index;
 
@@ -85,4 +85,18 @@ Item {
             NumberAnimation { easing.type: Easing.Linear; duration: 200; }
         }
     }
+
+    transform: Scale { id: scaleTransform; origin.x: container.width / 2; origin.y: container.height / 2; xScale: 1; yScale: 1 }
+
+    SequentialAnimation {
+        id: destroyAnimation
+        NumberAnimation { target: scaleTransform; property: "yScale"; easing.type: Easing.Linear; to: 0.01; duration: 200; }
+        NumberAnimation { target: scaleTransform; property: "xScale"; easing.type: Easing.Linear; to: 0.01; duration: 150; }
+        NumberAnimation { target: container; property: "opacity"; easing.type: Easing.Linear; to: 0.0; duration: 150; }
+        ScriptAction { script: container.parent.removeWindow(child); }
+    }
+
+    function runDestroyAnimation() {
+        destroyAnimation.start();
+    }
 }
index 0681f73..8024a6e 100644 (file)
@@ -76,9 +76,15 @@ Item {
     }
 
     function windowDestroyed(window) {
-        CompositorLogic.removeWindow(window.parent);
         var windowContainer = window.parent;
+        windowContainer.runDestroyAnimation();
+    }
+
+    function removeWindow(window) {
+        var windowContainer = window.parent;
+        CompositorLogic.removeWindow(windowContainer);
         windowContainer.chrome.destroy();
         windowContainer.destroy();
+        compositor.destroyWindow(window);
     }
 }