import QtMobility.location 1.2
// TODO: postcapture
-// TODO: flash not ready
-// TODO: focus, caf, ...
+// TODO: flash not ready (battery low or flash not ready message)
// TODO: portrait/landscape
-// TODO: stop viewfinder in settings pages ?
-// TODO: grid lines, face tracking, ambr
-// TODO: complete settings pages
+// TODO: grid lines, face tracking
// 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: changing scene mode doesn't affect the existing properties ?
-// TODO: upon startup all properties don't load correct values.
PageStackWindow {
id: root
Component.onCompleted: {
theme.inverted = true;
- if (settings.mode == Camera.VideoMode) {
- // TODO: We will use replacePage for now.
- // If we use openPage() then we end up with 2 video pages
- // stacked on top of each other.
- // The first one is created when the camera mode gets
- // changed to video upon startup and this becomes the 2nd one.
- replacePage("VideoPage.qml");
- }
- else {
- replacePage("ImagePage.qml");
- }
+ // TODO: hardcoding device id
+ root.resetCamera(0, settings.mode);
}
function showError(msg) {
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.
active: cam.running && settings.useGps && settings.useGeotags
}
- CameraResources {
- id: resourcePolicy
+ PipelineManager {
+ id: pipelineManager
+ camera: cam
}
DeviceInfo {
pageStack.push(Qt.resolvedUrl(file), {cam: cam});
}
+ function openFileNow(file) {
+ pageStack.push(Qt.resolvedUrl(file), {cam: cam}, true);
+ }
+
platformStyle: PageStackWindowStyle {
- // TODO: Hack
- background: " "
+ cornersVisible: false
+ background: ""
+ backgroundColor: "transparent"
}
ImageSettings {
}
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 ?
}
}
*/
- 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();
- resourcePolicy.acquire(CameraResources.None);
- mountProtector.unlock();
+
+ // We cannot stop camera here. Seems there is a race condition somewhere
+ // which leads to a freeze if we do so.
}
onRunningChanged: {
}
}
- // TODO: hardcoding device id
- Component.onCompleted: { cam.deviceId = 0; mode = settings.mode; }
Component.onDestruction: cam.stop();
- // TODO: Hack
+ // We need to show viewfinder below pages.
z: -1
Rectangle {
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 {
dimmer: root.dimmer
}
- Iso {
- id: iso
- camera: cam
- value: ready ? settings.imageIso : 0
- }
-
Connections {
target: cam
onModeChanged: {
}
}
}
+
+ Standby {
+ policyLost: pipelineManager.state == "policyLost"
+ show: !pageStack.currentPage || (pageStack.currentPage.standbyVisible && pageStack.currentPage.status == PageStatus.Active && pipelineManager.showStandBy)
+ }
}