Add opacity animation to settings and post capture views
[harmattan/cameraplus] / qml / MainPage.qml
index 5598c0b..95cba6b 100644 (file)
@@ -25,12 +25,16 @@ import QtCamera 1.0
 import CameraPlus 1.0
 
 // TODO: flash not ready (battery low or flash not ready message)
-// TODO: rotate post capture image
-// TODO: front camera
+// TODO: Sounds
+// TODO: N950 conf
 
 CameraPage {
     id: root
 
+    property bool deviceChangeInProgress: false
+    property bool inCaptureMode: mainView.currentIndex == 1
+    property Item dimmer: camDimmer
+
     CameraTheme {
         id: cameraTheme
     }
@@ -38,10 +42,19 @@ CameraPage {
     VisualItemModel {
         id: mainModel
 
-        SettingsView {
-            camera: viewfinder.camera
+        Loader {
+            id: settingsLoader
             width: mainView.width
             height: mainView.height
+
+            property bool pressed: false
+            property bool inhibitDim: false
+            property int policyMode: settings.mode == Camera.VideoMode ? CameraResources.Video : CameraResources.Image
+            opacity: item ? 1.0 : 0
+
+            Behavior on opacity {
+                NumberAnimation {duration: 200}
+            }
         }
 
         CameraView {
@@ -50,10 +63,19 @@ CameraPage {
             height: mainView.height
         }
 
-        PostCaptureView {
-            camera: viewfinder.camera
+        Loader {
+            id: postCaptureLoader
+            property bool pressed: item ? item.pressed : false
+            property bool inhibitDim: item ? item.inhibitDim : false
+            property int policyMode: item ? item.policyMode : settings.mode == Camera.VideoMode ? CameraResources.Video : CameraResources.Image
+
             width: mainView.width
             height: mainView.height
+            opacity: item ? 1.0 : 0
+
+            Behavior on opacity {
+                NumberAnimation {duration: 200}
+            }
         }
     }
 
@@ -68,12 +90,21 @@ CameraPage {
         boundsBehavior: Flickable.StopAtBounds
         currentIndex: 1
         interactive: !currentItem.pressed
+        onContentXChanged: {
+            if (contentX == 0) {
+                settingsLoader.source = Qt.resolvedUrl("SettingsView.qml")
+            } else if (contentX == width) {
+                settingsLoader.source = ""
+                postCaptureLoader.source = ""
+            } else if (contentX == width * 2) {
+                postCaptureLoader.source = Qt.resolvedUrl("PostCaptureView.qml")
+            }
+        }
     }
 
     Component.onCompleted: {
         platformSettings.init()        
-        // TODO: hardcoding device id
-        root.resetCamera(0, settings.mode)
+        root.resetCamera(settings.device, settings.mode)
     }
 
     PlatformSettings {
@@ -82,6 +113,45 @@ CameraPage {
 
     Settings {
         id: settings
+        onDeviceAboutToChange: {
+            root.deviceChangeInProgress = true
+        }
+
+        onDeviceChanged: {
+            viewfinder.cameraDeviceChanged()
+
+            // Reset pipeline manager error
+            pipelineManager.error = false
+
+            if (root.resetCamera(settings.device, settings.mode)) {
+                root.deviceChangeInProgress = false
+                pipelineManager.startCamera()
+            }
+        }
+
+        onImageAspectRatioChanged: {
+            if (!root.deviceChangeInProgress) {
+                imageSettings.setImageResolution()
+            }
+        }
+
+        onImageResolutionChanged: {
+            if (!root.deviceChangeInProgress) {
+                imageSettings.setImageResolution()
+            }
+        }
+
+        onVideoResolutionChanged: {
+            if (!root.deviceChangeInProgress) {
+                videoSettings.setVideoResolution()
+            }
+        }
+
+        onVideoAspectRatioChanged: {
+            if (!root.deviceChangeInProgress) {
+                videoSettings.setVideoResolution()
+            }
+        }
     }
 
     PipelineManager {
@@ -93,7 +163,17 @@ CameraPage {
     function resetCamera(deviceId, mode) {
         if (!viewfinder.camera.reset(deviceId, mode)) {
             showError(qsTr("Failed to set camera device and mode. Please restart the application."))
+            return false
+        }
+
+        if (mode == Camera.ImageMode) {
+            imageSettings.setImageResolution()
+        }
+        else if (mode == Camera.VideoMode) {
+            videoSettings.setVideoResolution()
         }
+
+        return true
     }
 
     function showError(msg) {
@@ -101,13 +181,18 @@ CameraPage {
         error.show()
     }
 
-    property alias dimmer: camDimmer
+    PlatformQuirks {
+        id: platformQuirks
+    }
+
+    DisplayState {
+        id: displayState
+        inhibitDim: mainView.currentItem != null ? mainView.currentItem.inhibitDim : false
+    }
+
     CameraPositionSource {
         id: positionSource
-        active: settings.useGps
-        // TODO: we cannot bind to cam.running because camera will stop
-        // when the connection dialog pops up and we end up with an infinite loop
-        // active: cam.running && settings.useGps
+        active: (viewfinder.camera.running || platformQuirks.forceOn) && settings.useGps && displayState.isOn
         onPositionChanged: geocode.search(position.coordinate.longitude, position.coordinate.latitude)
     }
 
@@ -146,7 +231,7 @@ CameraPage {
 
     ReverseGeocode {
         id: geocode
-        active: viewfinder.camera.running && settings.useGps && settings.useGeotags
+        active: (viewfinder.camera.running || platformQuirks.forceOn) && settings.useGps && settings.useGeotags && displayState.isOn
     }
 
     DeviceInfo {
@@ -165,11 +250,14 @@ CameraPage {
         id: fileNaming
         imageSuffix: viewfinder.camera.imageSuffix
         videoSuffix: viewfinder.camera.videoSuffix
+        imagePath: platformSettings.imagePath
+        videoPath: platformSettings.videoPath
+        temporaryVideoPath: platformSettings.temporaryVideoPath
+        settings: settings
     }
 
     MountProtector {
         id: mountProtector
-        path: fileNaming.path
     }
 
     TrackerStore {
@@ -179,10 +267,6 @@ CameraPage {
         model: deviceInfo.model
     }
 
-    function checkDiskSpace() {
-        return fileSystem.hasFreeSpace(fileNaming.path)
-    }
-
     ImageSettings {
         id: imageSettings
         camera: viewfinder.camera
@@ -192,12 +276,6 @@ CameraPage {
                 showError(qsTr("Failed to set required resolution"))
             }
         }
-
-        onReadyChanged: {
-            if (ready) {
-                imageSettings.setImageResolution()
-            }
-        }
     }
 
     VideoSettings {
@@ -209,28 +287,6 @@ CameraPage {
                 showError(qsTr("Failed to set required resolution"))
             }
         }
-
-        onReadyChanged: {
-            if (ready) {
-                videoSettings.setVideoResolution()
-            }
-        }
-    }
-
-    Connections {
-        target: settings
-
-        onImageAspectRatioChanged: {
-            imageSettings.setImageResolution()
-        }
-
-        onImageResolutionChanged: {
-            imageSettings.setImageResolution()
-        }
-
-        onVideoResolutionChanged: {
-            videoSettings.setVideoResolution()
-        }
     }
 
     ModeController {
@@ -253,13 +309,37 @@ CameraPage {
 
     DeviceKeys {
         id: keys
-        active: Qt.application.active && pipelineManager.scaleAcquired
+        active: Qt.application.active && pipelineManager.scaleAcquired && root.inCaptureMode && !mainView.moving
         repeat: !settings.zoomAsShutter
     }
 
+    Timer {
+        id: proximityTimer
+        running: proximitySensor.close
+        repeat: false
+        interval: 500
+        onTriggered: {
+            if (proximitySensor.close) {
+                proximitySensor.sensorClosed = true
+            }
+        }
+    }
+
+    CameraProximitySensor {
+        id: proximitySensor
+        property bool sensorClosed: false
+
+        active: Qt.application.active && viewfinder.camera.running && settings.proximityAsShutter && root.inCaptureMode && !mainView.moving
+        onCloseChanged: {
+            if (!close) {
+                sensorClosed = false
+            }
+        }
+    }
+
     Standby {
         policyLost: pipelineManager.state == "policyLost"
         show: !Qt.application.active || pipelineManager.showStandBy ||
-            (mainView.currentIndex == 1 && !viewfinder.camera.running)
+            (inCaptureMode && !viewfinder.camera.running)
     }
 }