Revision control
++ // Copyright (C) 2017 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++
++ import QtCore
++ import QtQuick
++ import QtQuick.Controls
++ import QtQuick.Layouts
++ import QtMultimedia
++
++ Rectangle {
++ id : cameraUI
++
++ width: 800
++ height: 480
++
++ color: "black"
++ state: "PhotoCapture"
++
++ property string platformScreen: ""
++ property int buttonsPanelLandscapeWidth: cameraUI.width/2
++ property int buttonsPanelPortraitHeight: cameraUI.height/3
++
++ CameraPermission {
++ id: cameraPermission
++
++ onStatusChanged: {
++ // In case the application does not already have permissions at startup
++ if (status === Qt.PermissionStatus.Granted)
++ camera.start()
++ else if (status === Qt.PermissionStatus.Denied)
++ camera.stop()
++ }
++ }
++ Component.onCompleted: {
++ // In case the application already has permissions at startup
++ if (cameraPermission.status === Qt.PermissionStatus.Granted)
++ camera.start()
++ else
++ cameraPermission.request()
++ }
++
++ //! [0]
++ states: [
++ State {
++ name: "PhotoCapture"
++ StateChangeScript {
++ script: {
++ camera.start()
++ }
++ }
++ },
++ State {
++ name: "PhotoPreview"
++ },
++ State {
++ name: "VideoCapture"
++ StateChangeScript {
++ script: {
++ camera.start()
++ }
++ }
++ },
++ State {
++ name: "VideoPreview"
++ StateChangeScript {
++ script: {
++ camera.stop()
++ }
++ }
++ }
++ ]
++ //! [0]
++
++ CaptureSession {
++ id: captureSession
++ camera: Camera {
++ id: camera
++ }
++ imageCapture: ImageCapture {
++ id: imageCapture
++ }
++
++ recorder: MediaRecorder {
++ id: recorder
++ // resolution: "640x480"
++ // frameRate: 30
++ }
++ videoOutput: viewfinder
++ }
++
++ PhotoPreview {
++ id : photoPreview
++ anchors.fill : parent
++ onClosed: cameraUI.state = "PhotoCapture"
++ visible: (cameraUI.state === "PhotoPreview")
++ focus: visible
++ source: imageCapture.preview
++ }
++
++ VideoPreview {
++ id : videoPreview
++ anchors.fill : parent
++ onClosed: cameraUI.state = "VideoCapture"
++ visible: (cameraUI.state === "VideoPreview")
++ focus: visible
++
++ //don't load recorded video if preview is invisible
++ source: visible ? recorder.actualLocation : ""
++ }
++
++ // Display text and a button to request permission
++ RowLayout {
++ visible: cameraPermission.status !== Qt.PermissionStatus.Granted
++ anchors.centerIn: parent
++ Text {
++ color: "white"
++ text: "Camera permission not granted"
++ }
++
++ Button {
++ text: "Press to request"
++ onClicked: cameraPermission.request()
++ }
++ }
++
++ VideoOutput {
++ id: viewfinder
++ visible: ((cameraUI.state === "PhotoCapture") || (cameraUI.state === "VideoCapture"))
++ anchors.fill: parent
++ // autoOrientation: true
++ }
++
++ //! [1]
++ Item {
++ id: controlLayout
++
++ readonly property bool isMobile: Qt.platform.os === "android" || Qt.platform.os === "ios"
++ readonly property bool isLandscape: Screen.desktopAvailableWidth >= Screen.desktopAvailableHeight
++ property int buttonsWidth: state === "MobilePortrait" ? Screen.desktopAvailableWidth / 3.4 : 114
++
++ states: [
++ State {
++ name: "MobileLandscape"
++ when: controlLayout.isMobile && controlLayout.isLandscape
++ },
++ State {
++ name: "MobilePortrait"
++ when: controlLayout.isMobile && !controlLayout.isLandscape
++ },
++ State {
++ name: "Other"
++ when: !controlLayout.isMobile
++ }
++ ]
++
++ onStateChanged: {
++ console.log("State: " + controlLayout.state)
++ }
++ }
++ //! [1]
++
++ //! [2]
++ PhotoCaptureControls {
++ id: stillControls
++ state: controlLayout.state
++ anchors.fill: parent
++ buttonsWidth: controlLayout.buttonsWidth
++ buttonsPanelPortraitHeight: cameraUI.buttonsPanelPortraitHeight
++ buttonsPanelWidth: cameraUI.buttonsPanelLandscapeWidth
++ captureSession: captureSession
++ visible: (cameraUI.state === "PhotoCapture")
++ onPreviewSelected: cameraUI.state = "PhotoPreview"
++ onVideoModeSelected: cameraUI.state = "VideoCapture"
++ previewAvailable: imageCapture.preview.length !== 0
++ }
++ //! [2]
++
++ VideoCaptureControls {
++ id: videoControls
++ state: controlLayout.state
++ anchors.fill: parent
++ buttonsWidth: controlLayout.buttonsWidth
++ buttonsPanelPortraitHeight: cameraUI.buttonsPanelPortraitHeight
++ buttonsPanelWidth: cameraUI.buttonsPanelLandscapeWidth
++ captureSession: captureSession
++ visible: (cameraUI.state === "VideoCapture")
++ onPreviewSelected: cameraUI.state = "VideoPreview"
++ onPhotoModeSelected: cameraUI.state = "PhotoCapture"
++ }
++ }