qt6-bb10/qtmultimedia/examples/multimedia/declarative-camera/VideoCaptureControls.qml

214 lines
7.8 KiB
QML

// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtMultimedia
import QtQuick.Layouts
FocusScope {
id : captureControls
property CaptureSession captureSession
property bool previewAvailable : false
property int buttonsmargin: 8
property int buttonsPanelWidth
property int buttonsPanelPortraitHeight
property int buttonsWidth
signal previewSelected
signal photoModeSelected
Rectangle {
id: buttonPaneShadow
color: Qt.rgba(0.08, 0.08, 0.08, 1)
GridLayout {
id: buttonsColumn
anchors.margins: captureControls.buttonsmargin
flow: captureControls.state === "MobilePortrait"
? GridLayout.LeftToRight : GridLayout.TopToBottom
Item {
implicitWidth: captureControls.buttonsWidth
implicitHeight: 70
CameraButton {
text: "Record"
anchors.fill: parent
visible: captureControls.captureSession.recorder.recorderState !== MediaRecorder.RecordingState
onClicked: captureControls.captureSession.recorder.record()
}
}
Item {
implicitWidth: captureControls.buttonsWidth
implicitHeight: 70
CameraButton {
id: stopButton
text: "Stop"
anchors.fill: parent
visible: captureControls.captureSession.recorder.recorderState === MediaRecorder.RecordingState
onClicked: captureControls.captureSession.recorder.stop()
}
}
Item {
implicitWidth: captureControls.buttonsWidth
implicitHeight: 70
CameraButton {
text: "View"
anchors.fill: parent
onClicked: captureControls.previewSelected()
//don't show View button during recording
visible: captureControls.captureSession.recorder.actualLocation.toString() !== ""
&& !stopButton.visible
}
}
}
GridLayout {
id: bottomColumn
anchors.margins: captureControls.buttonsmargin
flow: captureControls.state === "MobilePortrait"
? GridLayout.LeftToRight : GridLayout.TopToBottom
CameraListButton {
implicitWidth: captureControls.buttonsWidth
onValueChanged: captureControls.captureSession.camera.cameraDevice = value
state: captureControls.state
}
CameraButton {
text: "Switch to Photo"
implicitWidth: captureControls.buttonsWidth
onClicked: captureControls.photoModeSelected()
}
CameraButton {
id: quitButton
text: "Quit"
implicitWidth: captureControls.buttonsWidth
onClicked: Qt.quit()
}
}
}
ZoomControl {
x : 0
y : 0
width : 100
height: parent.height - (flashControl.visible * flashControl.height) -
(captureControls.state === "MobilePortrait" ? buttonPaneShadow.height : 0)
currentZoom: captureControls.captureSession.camera.zoomFactor
maximumZoom: captureControls.captureSession.camera.maximumZoomFactor
minimumZoom: captureControls.captureSession.camera.minimumZoomFactor
onZoomTo: (target) => captureControls.captureSession.camera.zoomFactor = target
}
FlashControl {
id: flashControl
x : 10
y : captureControls.state === "MobilePortrait" ?
parent.height - (buttonPaneShadow.height + height) : parent.height - height
cameraDevice: captureControls.captureSession.camera
}
states: [
State {
name: "MobilePortrait"
PropertyChanges {
buttonPaneShadow.width: parent.width
buttonPaneShadow.height: buttonsPanelPortraitHeight
buttonsColumn.height: captureControls.buttonsPanelPortraitHeight / 2 - buttonsmargin
bottomColumn.height: captureControls.buttonsPanelPortraitHeight / 2 - buttonsmargin
}
AnchorChanges {
target: buttonPaneShadow
// qmllint disable incompatible-type
anchors.bottom: captureControls.bottom
anchors.left: captureControls.left
anchors.right: captureControls.right
// qmllint enable incompatible-type
}
AnchorChanges {
target: buttonsColumn
// qmllint disable incompatible-type
anchors.left: buttonPaneShadow.left
anchors.right: buttonPaneShadow.right
anchors.top: buttonPaneShadow.top
// qmllint enable incompatible-type
}
AnchorChanges {
target: bottomColumn
// qmllint disable incompatible-type
anchors.bottom: buttonPaneShadow.bottom
anchors.left: buttonPaneShadow.left
anchors.right: buttonPaneShadow.right
// qmllint enable incompatible-type
}
},
State {
name: "MobileLandscape"
PropertyChanges {
buttonPaneShadow.width: buttonsPanelWidth
buttonPaneShadow.height: parent.height
buttonsColumn.height: parent.height
buttonsColumn.width: buttonPaneShadow.width / 2
bottomColumn.height: parent.height
bottomColumn.width: buttonPaneShadow.width / 2
}
AnchorChanges {
target: buttonPaneShadow
// qmllint disable incompatible-type
anchors.top: captureControls.top
anchors.right: captureControls.right
// qmllint enable incompatible-type
}
AnchorChanges {
target: buttonsColumn
// qmllint disable incompatible-type
anchors.top: buttonPaneShadow.top
anchors.bottom: buttonPaneShadow.bottom
anchors.left: buttonPaneShadow.left
// qmllint enable incompatible-type
}
AnchorChanges {
target: bottomColumn
// qmllint disable incompatible-type
anchors.top: buttonPaneShadow.top
anchors.bottom: buttonPaneShadow.bottom
anchors.right: buttonPaneShadow.right
// qmllint enable incompatible-type
}
},
State {
name: "Other"
PropertyChanges {
buttonPaneShadow.width: bottomColumn.width + 16
buttonPaneShadow.height: parent.height
}
AnchorChanges {
target: buttonPaneShadow
// qmllint disable incompatible-type
anchors.top: captureControls.top
anchors.right: captureControls.right
// qmllint enable incompatible-type
}
AnchorChanges {
target: buttonsColumn
// qmllint disable incompatible-type
anchors.top: buttonPaneShadow.top
anchors.right: buttonPaneShadow.right
// qmllint enable incompatible-type
}
AnchorChanges {
target: bottomColumn
// qmllint disable incompatible-type
anchors.bottom: buttonPaneShadow.bottom
anchors.right: buttonPaneShadow.right
// qmllint enable incompatible-type
}
}
]
}