update() is a signal not a slot. Use the correct macro
[harmattan/cameraplus] / qml / main.qml
index b0b08a6..dc62267 100644 (file)
@@ -28,24 +28,18 @@ import CameraPlus 1.0
 import QtMobility.systeminfo 1.2
 import QtMobility.location 1.2
 
-// TODO: resolutions and aspect ratios
 // TODO: postcapture
-// TODO: battery low state
-// TODO: disk space
 // TODO: flash not ready
 // TODO: focus, caf, ...
 // TODO: portrait/landscape
-// TODO: record video in a hidden directory and then copy the video to avoid tracker indexing it.
 // TODO: stop viewfinder in settings pages ?
-// TODO: prevent going to mass storage while recording and capturing
-// TODO: sounds
 // TODO: grid lines, face tracking, ambr
 // TODO: complete settings pages
-// TODO: stop camera properly when we get closed.
 // TODO: select primary/secondary camera.
 // TODO: disable debug builds.
 // TODO: a way to get buffers to the application
 // TODO: fcam like functionality (precise control over capture parameters).
+// TODO: mute video sound
 
 PageStackWindow {
         id: root
@@ -56,12 +50,8 @@ PageStackWindow {
 
         Component.onCompleted: {
                 theme.inverted = true;
-                if (settings.mode == 0) {
-                        openFile("ImagePage.qml");
-                }
-                else {
-                        openFile("VideoPage.qml");
-                }
+                // TODO: hardcoding device id
+                root.resetCamera(0, settings.mode);
         }
 
         function showError(msg) {
@@ -69,7 +59,16 @@ PageStackWindow {
                 error.show();
         }
 
+        function resetCamera(deviceId, mode) {
+                if (!cam.reset(deviceId, mode)) {
+                        showError(qsTr("Failed to set camera device and mode. Please restart the application."));
+                }
+        }
+
         PositionSource {
+                // NOTE: The source will not reset the position when we lose the signal.
+                // This shouldn't be a big problem as we are course enough.
+                // If we ever need street level updates then this will be an issue.
                 id: positionSource
                 active: settings.useGps
                 // TODO: we cannot bind to cam.running because camera will stop
@@ -118,14 +117,6 @@ PageStackWindow {
 
         CameraResources {
                 id: resourcePolicy
-                onAcquiredChanged: {
-                        if (resourcePolicy.acquired) {
-                                // TODO:
-                        }
-                        else {
-                                // TODO: We need a way to force a stop.
-                        }
-                }
         }
 
         DeviceInfo {
@@ -150,6 +141,11 @@ PageStackWindow {
                 videoSuffix: cam.videoSuffix
         }
 
+        MountProtector {
+                id: mountProtector
+                path: fileNaming.path
+        }
+
         function replacePage(file) {
                 pageStack.replace(Qt.resolvedUrl(file), {cam: cam}, true);
         }
@@ -168,7 +164,7 @@ PageStackWindow {
                 camera: cam
                 function setImageResolution() {
                         if (!imageSettings.setResolution(settings.imageAspectRatio, settings.imageResolution)) {
-                        showError(qsTr("Failed to set required resolution"));
+                                showError(qsTr("Failed to set required resolution"));
                         }
                 }
 
@@ -179,8 +175,26 @@ PageStackWindow {
                 }
         }
 
+        VideoSettings {
+                id: videoSettings
+                camera: cam
+
+                function setVideoResolution() {
+                        if (!videoSettings.setResolution(settings.videoAspectRatio, settings.videoResolution)) {
+                                showError(qsTr("Failed to set required resolution"));
+                        }
+                }
+
+                onReadyChanged: {
+                        if (ready) {
+                                videoSettings.setVideoResolution();
+                        }
+                }
+        }
+
         Connections {
                 target: settings
+
                 onImageAspectRatioChanged: {
                         imageSettings.setImageResolution();
                 }
@@ -188,6 +202,10 @@ PageStackWindow {
                 onImageResolutionChanged: {
                         imageSettings.setImageResolution();
                 }
+
+                onVideoResolutionChanged: {
+                        videoSettings.setVideoResolution();
+                }
         }
 
         Camera {
@@ -206,10 +224,17 @@ PageStackWindow {
                         console.log("Camera error (" + code + "): " + message + " " + debug);
                         showError(qsTr("Camera error. Please restart the application."));
                         cam.stop();
+                        resourcePolicy.acquire(CameraResources.None);
+                        mountProtector.unlock();
                 }
 
-                // TODO: hardcoding device id
-                Component.onCompleted: { cam.deviceId = 0; mode = settings.mode; }
+                onRunningChanged: {
+                        if (!cam.running) {
+                                mountProtector.unlock();
+                        }
+                }
+
+                Component.onDestruction: cam.stop();
 
                 // TODO: Hack
                 z: -1
@@ -221,24 +246,110 @@ PageStackWindow {
                         opacity: 0
                         color: "black"
                 }
+
+                notifications: Sounds {
+                        id: sounds
+                        mute: !settings.soundEnabled
+                }
+
         }
 
-        Scene {
-                id: sceneController
-                camera: cam
-                value: ready ? camera.mode == Camera.VideoMode ? settings.videoSceneMode : settings.imageSceneMode : 0
+        Binding {
+                target: cam.flash
+                property: "value"
+                when: cam.mode == Camera.ImageMode
+                value: settings.imageFlashMode
         }
 
-        ColorTone {
-                id: colorToneController
-                camera: cam
-                value: ready ? camera.mode == Camera.VideoMode ? settings.videoColorFilter : settings.imageColorFilter : 0
+        Binding {
+                target: settings
+                property: "imageFlashMode"
+                when: cam.mode == Camera.ImageMode
+                value: cam.flash.value
         }
 
-        WhiteBalance {
-                id: whiteBalanceController
-                camera: cam
-                value: ready ? camera.mode == Camera.VideoMode ? settings.videoWhiteBalance : settings.imageWhiteBalance : 0
+        Binding {
+                target: cam.scene
+                property: "value"
+                when: cam.mode == Camera.VideoMode
+                value: settings.videoSceneMode
+        }
+
+        Binding {
+                target: cam.scene
+                property: "value"
+                when: cam.mode == Camera.ImageMode
+                value: settings.imageSceneMode
+        }
+
+        Binding {
+                target: cam.evComp
+                property: "value"
+                when: cam.mode == Camera.ImageMode
+                value: settings.imageEvComp
+        }
+
+        Binding {
+                target: cam.evComp
+                property: "value"
+                when: cam.mode == Camera.VideoMode
+                value: settings.videoEvComp
+        }
+
+        Binding {
+                target: settings
+                property: "imageEvComp"
+                when: cam.mode == Camera.ImageMode
+                value: cam.evComp.value
+        }
+
+        Binding {
+                target: settings
+                property: "videoEvComp"
+                when: cam.mode == Camera.VideoMode
+                value: cam.evComp.value
+        }
+
+        Binding {
+                target: cam.whiteBalance
+                property: "value"
+                when: cam.mode == Camera.ImageMode
+                value: settings.imageWhiteBalance
+        }
+
+        Binding {
+                target: cam.whiteBalance
+                property: "value"
+                when: cam.mode == Camera.VideoMode
+                value: settings.videoWhiteBalance
+        }
+
+        Binding {
+                target: cam.colorTone
+                property: "value"
+                when: cam.mode == Camera.ImageMode
+                value: settings.imageColorFilter
+        }
+
+        Binding {
+                target: cam.colorTone
+                property: "value"
+                when: cam.mode == Camera.VideoMode
+                value: settings.videoColorFilter
+        }
+
+        Binding {
+                target: cam.iso
+                property: "value"
+                when: cam.mode == Camera.ImageMode
+                value: settings.imageIso
+        }
+
+        Binding {
+                target: settings
+                property: "imageIso"
+                when: cam.mode == Camera.ImageMode
+                value: cam.iso.value
         }
 
         ModeController {
@@ -247,12 +358,6 @@ PageStackWindow {
                 dimmer: root.dimmer
         }
 
-        Iso {
-                id: iso
-                camera: cam
-                value: ready ? settings.imageIso : 0
-        }
-
         Connections {
                 target: cam
                 onModeChanged: {