+ }
+
+ 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
+ }
+
+ 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"))