X-Git-Url: http://cgit.sxemacs.org/?p=harmattan%2Fcameraplus;a=blobdiff_plain;f=qml%2Fmain.qml;h=9e89af69a55306b79cc31bf2d9df3ae2b2f65a14;hp=bb560a7793d506a9c1f74c523cba5620229bcd42;hb=38ae6c17352880f8603d806addba1dfa30b0f5a7;hpb=75e1e1d5bfce5269f3c53fb7e1f0820cfe9482df diff --git a/qml/main.qml b/qml/main.qml index bb560a7..9e89af6 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -1,185 +1,259 @@ // -*- 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 + * + * 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.systeminfo 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 video in a hidden directory and then copy the video to avoid tracker indexing it. -// TODO: stop viewfinder in postcapture and settings pages ? -// TODO: resource policy -// TODO: prevent going to mass storage while recording and capturing -// TODO: sounds -// TODO: grid lines, face tracking -// TODO: complete settings pages -// TODO: stop camera properly when we get closed. -// TODO: select primary/secondary camera. -// TODO: disable debug builds. -// TODO: seems start gets called when we are shutting down -// TODO: seems start gets called twice when we are starting up if screen is locked or dimmed ?! - -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"); - } - } - function showError(msg) { - error.text = msg; - error.show(); - } +// TODO: flash not ready (battery low or flash not ready message) - DeviceInfo { - id: deviceInfo - } +CameraWindow { + id: root - FSMonitor { - id: fileSystem - } + VisualItemModel { + id: mainModel - InfoBanner { - id: error + 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) + } - function openFile(file) { - var component = Qt.createComponent(file) + PlatformSettings { + id: platformSettings + } - if (component.status == Component.Ready) { - pageStack.push(component, {cam: cam}); - } - else { - console.log("Error loading component:", component.errorString()); - } + Settings { + id: settings + } + + 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 + 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 + 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.longitude + longitudeValid: positionSource.longitudeValid && settings.useGps + latitude: positionSource.latitude + latitudeValid: positionSource.latitudeValid && settings.useGps + elevation: positionSource.altitude + elevationValid: positionSource.altitudeValid && settings.useGps + orientation: orientation.orientation + artist: settings.creatorName + captureDirection: compass.direction + captureDirectionValid: compass.directionValid + horizontalError: positionSource.horizontalAccuracy + horizontalErrorValid: positionSource.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: { - // TODO: is this needed ? - 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) + } }