Revision control

Copy as Markdown

// 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"
}
}