Fixed VideoPlayerPage.qml failure to set cameraConfig
[harmattan/cameraplus] / qml / main.qml
index c5ab62a..748ff83 100644 (file)
 // -*- qml -*-
-import QtQuick 1.1
-import com.nokia.meego 1.1
-import com.nokia.extras 1.1
+
+/*!
+ * This file is part of CameraPlus.
+ *
+ * Copyright (C) 2012-2013 Mohammed Sameer <msameer@foolab.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+import QtQuick 2.0
 import QtCamera 1.0
 import CameraPlus 1.0
+import QtMobility.location 1.2
 
-// TODO: metadata creator name, gps, geotags
-// TODO: resolutions and aspect ratios
-// TODO: postcapture
-// TODO: battery low state
-// TODO: disk space
-// TODO: flash not ready
-// TODO: focus, caf, ...
-// TODO: indicators
-// TODO: portrait/landscape
-// TODO: record in a hidden directory and then copy the video to avoid tracker indexing it.
-
-PageStackWindow {
-        id: root
-
-        property alias dimmer: camDimmer
-
-        showStatusBar: false
-
-        Component.onCompleted: {
-                theme.inverted = true;
-                if (settings.mode == 0) {
-                        openFile("ImagePage.qml");
-                }
-                else {
-                        openFile("VideoPage.qml");
-                }
-        }
+// TODO: flash not ready (battery low or flash not ready message)
 
-        function showError(msg) {
-                error.text = msg;
-                error.show();
-        }
+CameraWindow {
+    id: root
 
-        InfoBanner {
-                id: error
+    VisualItemModel {
+        id: mainModel
+
+        SettingsView {
+            camera: viewfinder.camera
+            width: mainView.width
+            height: mainView.height
         }
 
-        Settings {
-                id: settings
+        CameraView {
+            id: viewfinder
+            width: mainView.width
+            height: mainView.height
         }
 
-        FileNaming {
-                id: fileNaming
-                imageSuffix: cam.imageSuffix
-                videoSuffix: cam.videoSuffix
+        PostCaptureView {
+            camera: viewfinder.camera
+            width: mainView.width
+            height: mainView.height
         }
+    }
 
-        // Stolen from https://qt.gitorious.org/qt-components/qt-components/blobs/master/examples/meego/QmlComponentGallery/qml/ListPage.qml
-        function replacePage(file) {
-                var component = Qt.createComponent(file)
+    ListView {
+        id: mainView
+        LayoutMirroring.enabled: false
+        anchors.fill: parent
+        orientation: ListView.Horizontal
+        model: mainModel
+        snapMode: ListView.SnapOneItem
+        highlightRangeMode: ListView.StrictlyEnforceRange
+        boundsBehavior: Flickable.StopAtBounds
+        currentIndex: 1
+        interactive: !currentItem.pressed
+    }
 
-                if (component.status == Component.Ready) {
-                        pageStack.replace(component, {cam: cam}, true);
-                }
-                else {
-                        console.log("Error loading component:", component.errorString());
-                }
-        }
+    Component.onCompleted: {
+        platformSettings.init()        
+        // TODO: hardcoding device id
+        root.resetCamera(0, settings.mode)
+    }
+
+    PlatformSettings {
+        id: platformSettings
+    }
 
-        function openFile(file) {
-                var component = Qt.createComponent(file)
+    Settings {
+        id: settings
+    }
 
-                if (component.status == Component.Ready) {
-                        pageStack.push(component, {cam: cam});
-                }
-                else {
-                        console.log("Error loading component:", component.errorString());
-                }
+    PipelineManager {
+        id: pipelineManager
+        camera: viewfinder.camera
+        currentItem: mainView.currentItem
+    }
+
+    function resetCamera(deviceId, mode) {
+        if (!viewfinder.camera.reset(deviceId, mode)) {
+            showError(qsTr("Failed to set camera device and mode. Please restart the application."))
         }
+    }
+
+    function showError(msg) {
+        error.text = msg
+        error.show()
+    }
+
+    property alias dimmer: camDimmer
+
+    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
+        // when the connection dialog pops up and we end up with an infinite loop
+        // active: cam.running && settings.useGps
+        onPositionChanged: geocode.search(position.coordinate.longitude, position.coordinate.latitude)
+    }
+
+    MetaData {
+        id: metaData
+        camera: viewfinder.camera
+        manufacturer: deviceInfo.manufacturer
+        model: deviceInfo.model
+        country: geocode.country
+        city: geocode.city
+        suburb: geocode.suburb
+        longitude: positionSource.position.coordinate.longitude
+        longitudeValid: positionSource.position.longitudeValid && settings.useGps
+        latitude: positionSource.position.coordinate.latitude
+        latitudeValid: positionSource.position.latitudeValid && settings.useGps
+        elevation: positionSource.position.coordinate.altitude
+        elevationValid: positionSource.position.altitudeValid && settings.useGps
+        orientation: orientation.orientation
+        artist: settings.creatorName
+        captureDirection: compass.direction
+        captureDirectionValid: compass.directionValid
+        horizontalError: positionSource.position.horizontalAccuracy
+        horizontalErrorValid: positionSource.position.horizontalAccuracyValid && settings.useGps
+        dateTimeEnabled: true
+    }
+
+    Orientation {
+        id: orientation
+        active: viewfinder.camera.running || (mainView.currentIndex == 2 && Qt.application.active)
+    }
+
+    Compass {
+        id: compass
+        active: viewfinder.camera.running
+    }
 
-        platformStyle: PageStackWindowStyle {
-                // TODO: Hack
-                background: " "
+    ReverseGeocode {
+        id: geocode
+        active: viewfinder.camera.running && settings.useGps && settings.useGeotags
+    }
+
+    DeviceInfo {
+        id: deviceInfo
+    }
+
+    FSMonitor {
+        id: fileSystem
+    }
+
+    CameraInfoBanner {
+        id: error
+    }
+
+    FileNaming {
+        id: fileNaming
+        imageSuffix: viewfinder.camera.imageSuffix
+        videoSuffix: viewfinder.camera.videoSuffix
+    }
+
+    MountProtector {
+        id: mountProtector
+        path: fileNaming.path
+    }
+
+    TrackerStore {
+        id: trackerStore
+        active: viewfinder.camera.running
+        manufacturer: deviceInfo.manufacturer
+        model: deviceInfo.model
+    }
+
+    function checkDiskSpace() {
+        return fileSystem.hasFreeSpace(fileNaming.path)
+    }
+
+    ImageSettings {
+        id: imageSettings
+        camera: viewfinder.camera
+
+        function setImageResolution() {
+            if (!imageSettings.setResolution(settings.imageAspectRatio, settings.imageResolution)) {
+                showError(qsTr("Failed to set required resolution"))
+            }
         }
 
-        Connections {
-                target: platformWindow
-                onActiveChanged: {
-                        if (platformWindow.active) {
-                                if (!cam.start()) {
-                                        showError("Camera failed to start. Please restart the camera.");
-                                }
-                        }
-                        else {
-                                // This is a noop if camera is not idle so calling it will not hurt
-                                cam.stop();
-                        }
-                }
+        onReadyChanged: {
+            if (ready) {
+                imageSettings.setImageResolution()
+            }
         }
+    }
 
-        Camera {
-                onIdleChanged: {
-                        if (idle && !platformWindow.active) {
-                                stop();
-                        }
-                }
-
-                onDeviceIdChanged: {
-                        if (platformWindow.active) {
-                                cam.start();
-                        }
-                }
-
-                id: cam
-                anchors.fill: parent
-
-                // TODO: hardcoding device id
-                Component.onCompleted: { cam.deviceId = 0; mode = settings.mode; }
-
-                // TODO: Hack
-                z: -1
-
-                Rectangle {
-                        id: camDimmer
-                        z: 1
-                        anchors.fill: parent
-                        opacity: 0
-                        color: "black"
-                }
+    VideoSettings {
+        id: videoSettings
+        camera: viewfinder.camera
+
+        function setVideoResolution() {
+            if (!videoSettings.setResolution(settings.videoAspectRatio, settings.videoResolution)) {
+                showError(qsTr("Failed to set required resolution"))
+            }
         }
 
-        Scene {
-                id: sceneController
-                camera: cam
-                value: ready ? camera.mode == Camera.VideoMode ? settings.videoSceneMode : settings.imageSceneMode : 0
+        onReadyChanged: {
+            if (ready) {
+                videoSettings.setVideoResolution()
+            }
         }
+    }
+
+    Connections {
+        target: settings
 
-        ColorTone {
-                id: colorToneController
-                camera: cam
-                value: ready ? camera.mode == Camera.VideoMode ? settings.videoColorFilter : settings.imageColorFilter : 0
+        onImageAspectRatioChanged: {
+            imageSettings.setImageResolution()
         }
 
-        WhiteBalance {
-                id: whiteBalanceController
-                camera: cam
-                value: ready ? camera.mode == Camera.VideoMode ? settings.videoWhiteBalance : settings.imageWhiteBalance : 0
+        onImageResolutionChanged: {
+            imageSettings.setImageResolution()
         }
 
-        ModeController {
-                id: cameraMode
-                cam: cam
-                dimmer: root.dimmer
+        onVideoResolutionChanged: {
+            videoSettings.setVideoResolution()
         }
+    }
 
-        Connections {
-                target: cam
-                onModeChanged: {
-                        if (cam.mode == Camera.VideoMode) {
-                                replacePage("VideoPage.qml");
-                        }
-                        else {
-                                replacePage("ImagePage.qml");
-                        }
-                }
+    ModeController {
+        id: cameraMode
+        cam: viewfinder.camera
+        dimmer: root.dimmer
+    }
+
+    Rectangle {
+        property bool dimmed: false
+        id: camDimmer
+        z: 1
+        anchors.fill: parent
+        opacity: dimmed ? 1.0 : 0.0
+        color: "black"
+        Behavior on opacity {
+            PropertyAnimation { duration: 150 }
         }
+    }
+
+    DeviceKeys {
+        id: keys
+        active: Qt.application.active && pipelineManager.scaleAcquired
+        repeat: !settings.zoomAsShutter
+    }
+
+    Standby {
+        policyLost: pipelineManager.state == "policyLost"
+        show: !Qt.application.active || pipelineManager.showStandBy ||
+            (mainView.currentIndex == 1 && !viewfinder.camera.running)
+    }
 }