Revision control

Copy as Markdown

// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtMultimedia
import QtQuick.Layouts
import QtQuick.Controls
Pane {
id: top
required property real backgroundOpacity
required property var camera
required property var captureSession
required property var recorder
required property var imagesTakenCount
ScrollView {
width: parent.width
height: parent.height
clip: true
ColumnLayout {
RowLayout {
// Capture image
Button {
text: "Snap"
onClicked: top.captureSession.imageCapture.captureToFile("")
}
Label {
text: "Captured: " + top.imagesTakenCount
}
Button {
enabled: window.imageCaptureTracker > 0
text: "View snap"
onClicked: () => {
photoPreview.visible = true
}
}
}
RowLayout {
Button {
visible: top.recorder.recorderState === MediaRecorder.StoppedState
text: "Record"
onClicked: () => { top.recorder.record() }
}
Button {
visible:
top.recorder.recorderState === MediaRecorder.RecordingState ||
top.recorder.recorderState === MediaRecorder.PausedState
text: "Stop"
onClicked: () => { top.recorder.stop() }
}
Button {
visible: top.recorder.recorderState !== MediaRecorder.PausedState
enabled: top.recorder.recorderState === MediaRecorder.RecordingState
text: "Pause"
onClicked: () => { top.recorder.pause() }
}
Button {
visible: top.recorder.recorderState === MediaRecorder.PausedState
text: "Continue"
onClicked: () => { top.recorder.record() }
}
Button {
enabled: window.videoCaptureTracker > 0
Layout.fillWidth: true
text: "View video"
onClicked: () => {
capturedVideoOutputPane.visible = true
mediaPlayer.play()
}
}
}
ColumnLayout {
enabled: top.camera.minimumZoomFactor < top.camera.maximumZoomFactor
RowLayout {
Label {
text: "Zoom: " + top.camera.zoomFactor.toFixed(1)
font.bold: true
}
Label { text: "min: " + top.camera.minimumZoomFactor.toFixed(1) + " max: " + top.camera.maximumZoomFactor.toFixed(1) }
}
Slider {
Layout.fillWidth: true
from: top.camera.minimumZoomFactor
to: Math.min(top.camera.maximumZoomFactor, 10)
value: top.camera.zoomFactor
onMoved: top.camera.zoomFactor = value
}
}
RowLayout {
enabled: top.camera.supportedFocusModes.length > 1
Label { text: "Focus mode" }
ComboBox {
Layout.alignment: Qt.AlignRight
model: top.camera.supportedFocusModes
.map(item => {
return {
"value": item,
"text": top.camera.focusModeToString(item)
}
})
valueRole: "value"
textRole: "text"
displayText: top.camera.focusModeToString(top.camera.focusMode)
currentIndex: model.findIndex(
item => item.value === top.camera.focusMode)
onActivated: index => {
if (top.camera.isFocusModeSupported(currentValue))
top.camera.focusMode = currentValue
else
console.log("Selected unsupported focus mode")
}
}
} // Focus mode
RowLayout {
// Flash mode
enabled: top.camera.supportedFlashModes.length > 1
Label { text: "Flash mode" }
ComboBox {
Layout.alignment: Qt.AlignRight
model: top.camera.supportedFlashModes.map(item => {
return {
"value": item,
"text": top.camera.flashModeToString(item)
}
})
textRole: "text"
valueRole: "value"
currentIndex: model.findIndex(
item => item.value === top.camera.flashMode)
onActivated: index => {
if (top.camera.isFlashModeSupported(currentValue))
top.camera.flashMode = currentValue
else
console.log("Selected unsupported flash mode")
}
}
} // Flash mode
ColumnLayout {
enabled: top.camera.supportedFocusModes.includes(Camera.FocusModeManual)
&& top.camera.supportedFeatures & Camera.FocusDistance
Label {
text: "focusDistance " + top.camera.focusDistance.toFixed(1)
font.bold: true
}
Slider {
Layout.fillWidth: true
from: 0
to: 1
value: top.camera.focusDistance
onMoved: top.camera.focusDistance = value
}
}
}
}
}