X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=qml%2Fmain.qml;h=d30139a109005e2bba2a9662ce7e608b2915408d;hb=523b619b6b356d744a271b39b68ab48fb80a7a8a;hp=eb388ca3e11129b09c76fe4257f57c22e073d6ac;hpb=104eced768ad67d62641401e5e626bf20da9bdbb;p=harmattan%2Fcameraplus diff --git a/qml/main.qml b/qml/main.qml index eb388ca..d30139a 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -25,20 +25,12 @@ import com.nokia.meego 1.1 import com.nokia.extras 1.1 import QtCamera 1.0 import CameraPlus 1.0 -import QtMobility.systeminfo 1.2 +import QtMobility.systeminfo 1.2 as Qtm import QtMobility.location 1.2 -// TODO: postcapture -// TODO: disk space -// TODO: flash not ready -// TODO: focus, caf, ... +// TODO: flash not ready (battery low or flash not ready message) // 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: grid lines, face tracking, ambr -// TODO: complete settings pages -// TODO: stop camera properly when we get closed. +// TODO: grid lines, face tracking // TODO: select primary/secondary camera. // TODO: disable debug builds. // TODO: a way to get buffers to the application @@ -53,12 +45,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) { @@ -66,6 +54,12 @@ 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. @@ -116,19 +110,12 @@ PageStackWindow { active: cam.running && settings.useGps && settings.useGeotags } - CameraResources { - id: resourcePolicy - onAcquiredChanged: { - if (resourcePolicy.acquired) { - // TODO: - } - else { - // TODO: We need a way to force a stop. - } - } + PipelineManager { + id: pipelineManager + camera: cam } - DeviceInfo { + Qtm.DeviceInfo { id: deviceInfo } @@ -150,17 +137,60 @@ PageStackWindow { videoSuffix: cam.videoSuffix } + MountProtector { + id: mountProtector + path: fileNaming.path + } + + BatteryInfo { + id: batteryMonitor + active: cam.running + + function check() { + if (!checkBattery()) { + pageStack.currentPage.batteryLow(); + } + } + + onChargingChanged: { + batteryMonitor.check(); + } + + onCriticalChanged: { + batteryMonitor.check(); + } + } + function replacePage(file) { - pageStack.replace(Qt.resolvedUrl(file), {cam: cam}, true); + pageStack.replace(Qt.resolvedUrl(file), {cam: cam, dimmer: root.dimmer}, true); } function openFile(file) { - pageStack.push(Qt.resolvedUrl(file), {cam: cam}); + pageStack.push(Qt.resolvedUrl(file), {cam: cam, dimmer: root.dimmer}); + } + + function openFileNow(file) { + pageStack.push(Qt.resolvedUrl(file), {cam: cam, dimmer: root.dimmer}, true); + } + + function checkBattery() { + // We are fine if we are connected to the charger: + if (batteryMonitor.charging) { + return true; + } + + // If we have enough battery then we are fine: + if (!batteryMonitor.critical) { + return true; + } + + return false; } platformStyle: PageStackWindowStyle { - // TODO: Hack - background: " " + cornersVisible: false + background: "" + backgroundColor: "transparent" } ImageSettings { @@ -213,6 +243,17 @@ PageStackWindow { } Camera { + id: cam + anchors.fill: parent + + FocusReticle { + id: focusReticle + cam: cam + visible: pageStack.currentPage && pageStack.currentPage.controlsVisible && pageStack.currentPage.focusReticleVisible && cam && cam.autoFocus.canFocus(cam.scene.value); + cafStatus: cam ? cam.autoFocus.cafStatus : -1 + status: cam ? cam.autoFocus.status : -1 + } + /* onDeviceIdChanged: { // TODO: is this needed ? @@ -221,54 +262,163 @@ PageStackWindow { } } */ - id: cam - anchors.fill: parent - onError: { + if (pipelineManager.error) { + // Ignore any subsequent errors. + // Killing pulseaudio while recording will lead to an + // infinite supply of errors which will break the UI + // if we show a banner for each. + return; + } + + pipelineManager.error = true; + pageStack.currentPage.cameraError(); console.log("Camera error (" + code + "): " + message + " " + debug); showError(qsTr("Camera error. Please restart the application.")); - cam.stop(); + + // We cannot stop camera here. Seems there is a race condition somewhere + // which leads to a freeze if we do so. } - // TODO: hardcoding device id - Component.onCompleted: { cam.deviceId = 0; mode = settings.mode; } - Component.onDestruction: { - console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); + onRunningChanged: { + if (!cam.running) { + mountProtector.unlock(); + } } - // TODO: Hack + Component.onDestruction: cam.stop(); + + // We need to show viewfinder below pages. z: -1 Rectangle { + property bool dimmed: false id: camDimmer z: 1 anchors.fill: parent - opacity: 0 + opacity: dimmed ? 1.0 : 0.0 color: "black" + Behavior on opacity { + PropertyAnimation { duration: 150 } + } } 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 + } + + Binding { + target: cam.videoMute + property: "enabled" + value: settings.videoMuted + } + + TrackerStore { + id: trackerStore + active: cam.running + manufacturer: deviceInfo.manufacturer + model: deviceInfo.model } ModeController { @@ -277,12 +427,6 @@ PageStackWindow { dimmer: root.dimmer } - Iso { - id: iso - camera: cam - value: ready ? settings.imageIso : 0 - } - Connections { target: cam onModeChanged: { @@ -294,4 +438,9 @@ PageStackWindow { } } } + + Standby { + policyLost: pipelineManager.state == "policyLost" + show: !pageStack.currentPage || (pageStack.currentPage.standbyVisible && pageStack.currentPage.status == PageStatus.Active && pipelineManager.showStandBy) + } }