You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1029 lines
55 KiB
1029 lines
55 KiB
/**************************************************************************** |
|
* |
|
* (c) 2009-2019 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> |
|
* |
|
* QGroundControl is licensed according to the terms in the file |
|
* COPYING.md in the root of the source code directory. |
|
* |
|
* @file |
|
* @author Gus Grubba <gus@auterion.com> |
|
*/ |
|
|
|
import QtQuick 2.11 |
|
import QtQuick.Controls 2.4 |
|
import QtQuick.Layouts 1.11 |
|
import QtQuick.Dialogs 1.3 |
|
import QtGraphicalEffects 1.0 |
|
|
|
import QtMultimedia 5.9 |
|
import QtPositioning 5.2 |
|
|
|
import QGroundControl 1.0 |
|
import QGroundControl.Controls 1.0 |
|
import QGroundControl.FactControls 1.0 |
|
import QGroundControl.FactSystem 1.0 |
|
import QGroundControl.FlightMap 1.0 |
|
import QGroundControl.Palette 1.0 |
|
import QGroundControl.ScreenTools 1.0 |
|
import QGroundControl.Vehicle 1.0 |
|
|
|
import CustomQuickInterface 1.0 |
|
import Custom.Widgets 1.0 |
|
import Custom.Camera 1.0 |
|
|
|
Item { |
|
id: _root |
|
height: mainColumn.height |
|
width: mainColumn.width + (ScreenTools.defaultFontPixelWidth * 2) |
|
visible: !QGroundControl.videoManager.fullScreen |
|
|
|
readonly property string _commLostStr: qsTr("NO CAMERA") |
|
readonly property real buttonSize: ScreenTools.defaultFontPixelWidth * 5 |
|
|
|
property real _spacers: ScreenTools.defaultFontPixelHeight * 0.5 |
|
property real _labelFieldWidth: ScreenTools.defaultFontPixelWidth * 28 |
|
property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 30 |
|
property real _editFieldHeight: ScreenTools.defaultFontPixelHeight * 2 |
|
property var _videoReceiver: QGroundControl.videoManager.videoReceiver |
|
property bool _recordingLocalVideo: _videoReceiver && _videoReceiver.recording |
|
|
|
property var _dynamicCameras: activeVehicle ? activeVehicle.dynamicCameras : null |
|
property bool _isCamera: _dynamicCameras ? _dynamicCameras.cameras.count > 0 : false |
|
property int _curCameraIndex: _dynamicCameras ? _dynamicCameras.currentCamera : 0 |
|
property var _camera: _isCamera ? _dynamicCameras.cameras.get(_curCameraIndex) : null |
|
property bool _communicationLost: activeVehicle ? activeVehicle.connectionLost : false |
|
property bool _noSdCard: _camera && _camera.storageTotal === 0 |
|
property bool _fullSD: _camera && _camera.storageTotal !== 0 && _camera.storageFree > 0 && _camera.storageFree < 250 // We get kiB from the camera |
|
property bool _cameraVideoMode: !_communicationLost && (_noSdCard ? false : _camera && _camera.cameraMode === QGCCameraControl.CAM_MODE_VIDEO) |
|
property bool _cameraPhotoMode: !_communicationLost && (_noSdCard ? false : _camera && (_camera.cameraMode === QGCCameraControl.CAM_MODE_PHOTO || _camera.cameraMode === QGCCameraControl.CAM_MODE_SURVEY)) |
|
property bool _cameraPhotoIdle: !_communicationLost && (_noSdCard ? false : _camera && _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_IDLE) |
|
property bool _cameraElapsedMode: !_communicationLost && (_noSdCard ? false : _camera && _camera.cameraMode === QGCCameraControl.CAM_MODE_PHOTO && _camera.photoMode === QGCCameraControl.PHOTO_CAPTURE_TIMELAPSE) |
|
property bool _cameraModeUndefined: !_cameraPhotoMode && !_cameraVideoMode |
|
property bool _recordingVideo: _cameraVideoMode && _camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING |
|
property bool _settingsEnabled: !_communicationLost && _camera && _camera.cameraMode !== QGCCameraControl.CAM_MODE_UNDEFINED && _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_IDLE && !_recordingVideo |
|
property bool _hasZoom: _camera && _camera.hasZoom |
|
property Fact _irPaletteFact: _camera ? _camera.irPalette : null |
|
property bool _isShortScreen: mainWindow.height / ScreenTools.realPixelDensity < 120 |
|
property real _gimbalPitch: activeVehicle ? -activeVehicle.gimbalPitch : 0 |
|
property real _gimbalYaw: activeVehicle ? activeVehicle.gimbalYaw : 0 |
|
property bool _hasGimbal: activeVehicle && activeVehicle.gimbalData |
|
Connections { |
|
target: QGroundControl.multiVehicleManager.activeVehicle |
|
onConnectionLostChanged: { |
|
if(_communicationLost && cameraSettings.visible) { |
|
cameraSettings.close() |
|
} |
|
} |
|
} |
|
|
|
DeadMouseArea { |
|
anchors.fill: parent |
|
} |
|
|
|
//------------------------------------------------------------------------- |
|
//-- Main Column |
|
Column { |
|
id: mainColumn |
|
spacing: _spacers |
|
anchors.centerIn: parent |
|
//--------------------------------------------------------------------- |
|
//-- Quick Thermal Modes |
|
Item { |
|
id: thermalBackgroundRect |
|
width: buttonsRow.width + (ScreenTools.defaultFontPixelWidth * 4) |
|
height: buttonsRow.height + (ScreenTools.defaultFontPixelHeight) |
|
visible: QGroundControl.videoManager.hasThermal || _irPaletteFact || _camera.vendor === "NextVision" |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
Component.onCompleted: { |
|
if(_irPaletteFact && QGroundControl.videoManager.hasThermal) { |
|
if(_camera.thermalMode === QGCCameraControl.THERMAL_OFF) |
|
standardMode.checked = true |
|
if(_camera.thermalMode === QGCCameraControl.THERMAL_PIP) |
|
thermalPip.checked = true |
|
if(_camera.thermalMode === QGCCameraControl.THERMAL_FULL) |
|
thermalFull.checked = true |
|
} |
|
else |
|
standardMode.checked = true |
|
} |
|
ButtonGroup { |
|
id: buttonGroup |
|
exclusive: true |
|
buttons: buttonsRow.children |
|
} |
|
Row { |
|
id: buttonsRow |
|
spacing: ScreenTools.defaultFontPixelWidth * 0.5 |
|
anchors.centerIn: parent |
|
//-- Standard |
|
CustomQuickButton { |
|
id: standardMode |
|
width: buttonSize |
|
height: buttonSize |
|
iconSource: "/custom/img/thermal-standard.svg" |
|
onClicked: { |
|
_camera.thermalMode = QGCCameraControl.THERMAL_OFF |
|
} |
|
} |
|
//-- PIP |
|
CustomQuickButton { |
|
id: thermalPip |
|
width: buttonSize |
|
height: buttonSize |
|
visible: _camera.vendor !== "NextVision" |
|
iconSource: "/custom/img/thermal-pip.svg" |
|
onClicked: { |
|
_camera.thermalMode = QGCCameraControl.THERMAL_PIP |
|
} |
|
} |
|
// Thermal |
|
CustomQuickButton { |
|
id: thermalFull |
|
width: buttonSize |
|
height: buttonSize |
|
iconSource: "/custom/img/thermal-brightness.svg" |
|
onClicked: { |
|
_camera.thermalMode = QGCCameraControl.THERMAL_FULL |
|
} |
|
} |
|
// Thermal palette options |
|
CustomQuickButton { |
|
checkable: false |
|
width: buttonSize |
|
height: buttonSize |
|
visible: _irPaletteFact |
|
iconSource: "/custom/img/thermal-palette.svg" |
|
onClicked: { |
|
thermalPalettes.open() |
|
} |
|
} |
|
} |
|
} |
|
//--------------------------------------------------------------------- |
|
//-- Main Camera Control |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth * 0.5 |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
Rectangle { |
|
id: cameraRect |
|
height: cameraCol.height |
|
width: cameraCol.width + (ScreenTools.defaultFontPixelWidth * 4) |
|
color: qgcPal.window |
|
radius: ScreenTools.defaultFontPixelWidth * 0.5 |
|
Column { |
|
id: cameraCol |
|
spacing: _spacers |
|
anchors.centerIn: parent |
|
Item { |
|
height: 1 |
|
width: 1 |
|
} |
|
//----------------------------------------------------------------- |
|
//-- Camera Name |
|
QGCLabel { |
|
text: activeVehicle ? (_camera && _camera.modelName !== "" ? _camera.modelName : _commLostStr) : _commLostStr |
|
font.pointSize: ScreenTools.smallFontPointSize |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
QGCLabel { |
|
text: { |
|
if(_noSdCard) return qsTr("NONE") |
|
if(_fullSD) return qsTr("FULL") |
|
return _camera ? _camera.storageFreeStr : "" |
|
} |
|
visible: _isShortScreen |
|
color: (_noSdCard || _fullSD) ? qgcPal.colorOrange : qgcPal.text |
|
font.pointSize: ScreenTools.smallFontPointSize |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
//----------------------------------------------------------------- |
|
//-- Camera Mode |
|
Item { |
|
width: modeCol.width |
|
height: modeCol.height |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
Column { |
|
id: modeCol |
|
spacing: _spacers |
|
QGCColoredImage { |
|
height: ScreenTools.defaultFontPixelHeight * 1.25 |
|
width: height |
|
source: (_cameraModeUndefined || _cameraPhotoMode) ? "/custom/img/camera_photo.svg" : "/custom/img/camera_video.svg" |
|
color: qgcPal.text |
|
fillMode: Image.PreserveAspectFit |
|
sourceSize.height: height |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
QGCLabel { |
|
text: _cameraVideoMode ? qsTr("Video") : qsTr("Photo") |
|
font.pointSize: ScreenTools.smallFontPointSize |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
} |
|
MouseArea { |
|
anchors.fill: parent |
|
enabled: !_cameraModeUndefined && _camera && _camera.videoStatus !== QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING && _cameraPhotoIdle |
|
onClicked: { |
|
_camera.toggleMode() |
|
} |
|
} |
|
} |
|
//----------------------------------------------------------------- |
|
//-- Shutter |
|
Rectangle { |
|
color: Qt.rgba(0,0,0,0) |
|
width: height |
|
height: ScreenTools.defaultFontPixelHeight * 4 |
|
radius: width * 0.5 |
|
border.color: qgcPal.buttonText |
|
border.width: 1 |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
Rectangle { |
|
width: parent.width * 0.85 |
|
height: width |
|
radius: width * 0.5 |
|
color: _cameraModeUndefined ? qgcPal.colorGrey : ( _cameraVideoMode ? qgcPal.colorRed : qgcPal.text ) |
|
visible: !pauseVideo.visible |
|
anchors.centerIn: parent |
|
QGCColoredImage { |
|
id: busyIndicator |
|
height: parent.height * 0.75 |
|
width: height |
|
source: "/qmlimages/MapSync.svg" |
|
sourceSize.height: height |
|
fillMode: Image.PreserveAspectFit |
|
mipmap: true |
|
smooth: true |
|
color: qgcPal.window |
|
visible: { |
|
if(_cameraPhotoMode && !_cameraPhotoIdle && !_cameraElapsedMode) { |
|
return true |
|
} |
|
return false |
|
} |
|
anchors.centerIn: parent |
|
RotationAnimation on rotation { |
|
loops: Animation.Infinite |
|
from: 360 |
|
to: 0 |
|
duration: 740 |
|
running: busyIndicator.visible |
|
} |
|
} |
|
QGCLabel { |
|
text: _camera ? _camera.photoLapse.toFixed(0) + 's' : qsTr('N/A') |
|
font.family: ScreenTools.demiboldFontFamily |
|
color: qgcPal.colorBlue |
|
visible: _cameraElapsedMode |
|
anchors.centerIn: parent |
|
} |
|
} |
|
Rectangle { |
|
id: pauseVideo |
|
width: parent.width * 0.5 |
|
height: width |
|
color: _cameraModeUndefined ? qgcPal.colorGrey : qgcPal.colorRed |
|
visible: { |
|
if(_cameraVideoMode && _camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) { |
|
return true |
|
} |
|
if(_cameraPhotoMode) { |
|
if(_camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IDLE || _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IN_PROGRESS) { |
|
return true |
|
} |
|
} |
|
return false |
|
} |
|
anchors.centerIn: parent |
|
} |
|
MouseArea { |
|
anchors.fill: parent |
|
enabled: !_noSdCard |
|
onClicked: { |
|
if(_cameraVideoMode) { |
|
if(_camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) { |
|
_camera.stopVideo() |
|
//-- Local video as well |
|
if (_recordingVideo) { |
|
_videoReceiver.stopRecording() |
|
} |
|
} else { |
|
if(!_fullSD) { |
|
_camera.startVideo() |
|
} |
|
//-- Local video as well |
|
if(_videoReceiver) { |
|
_videoReceiver.startRecording() |
|
} |
|
} |
|
} else { |
|
if(_camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IDLE || _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IN_PROGRESS) { |
|
_camera.stopTakePhoto() |
|
} else { |
|
if(!_fullSD) { |
|
_camera.takePhoto() |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
//----------------------------------------------------------------- |
|
//-- Settings |
|
Item { |
|
width: settingsCol.width |
|
height: settingsCol.height |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
Column { |
|
id: settingsCol |
|
spacing: _spacers |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
QGCColoredImage { |
|
width: ScreenTools.defaultFontPixelHeight * 1.25 |
|
height: width |
|
sourceSize.width: width |
|
source: "qrc:/custom/img/camera_settings.svg" |
|
color: qgcPal.text |
|
fillMode: Image.PreserveAspectFit |
|
opacity: _settingsEnabled ? 1 : 0.5 |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
QGCLabel { |
|
text: qsTr("Settings") |
|
font.pointSize: ScreenTools.smallFontPointSize |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
} |
|
MouseArea { |
|
anchors.fill: parent |
|
enabled: _settingsEnabled |
|
onClicked: { |
|
cameraSettings.open() |
|
} |
|
} |
|
} |
|
//----------------------------------------------------------------- |
|
//-- microSD Card |
|
Column { |
|
spacing: _spacers |
|
visible: !_isShortScreen |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
QGCColoredImage { |
|
width: ScreenTools.defaultFontPixelHeight * 1.25 |
|
height: width |
|
sourceSize.width: width |
|
source: "qrc:/custom/img/microSD.svg" |
|
color: qgcPal.text |
|
fillMode: Image.PreserveAspectFit |
|
opacity: _settingsEnabled ? 1 : 0.5 |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
QGCLabel { |
|
text: { |
|
if(_noSdCard) return qsTr("NONE") |
|
if(_fullSD) return qsTr("FULL") |
|
return _camera ? _camera.storageFreeStr : "" |
|
} |
|
color: (_noSdCard || _fullSD) ? qgcPal.colorOrange : qgcPal.text |
|
font.pointSize: ScreenTools.smallFontPointSize |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
} |
|
//----------------------------------------------------------------- |
|
//-- Recording Time / Images Captured |
|
QGCLabel { |
|
text: (_cameraVideoMode && _camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) ? _camera.recordTimeStr : "00:00:00" |
|
visible: _cameraVideoMode |
|
font.pointSize: ScreenTools.smallFontPointSize |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
QGCLabel { |
|
text: activeVehicle && _cameraPhotoMode ? ('00000' + activeVehicle.cameraTriggerPoints.count).slice(-5) : "00000" |
|
visible: _cameraPhotoMode |
|
font.pointSize: ScreenTools.smallFontPointSize |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
Item { |
|
height: 1 |
|
width: 1 |
|
} |
|
} |
|
} |
|
//-- Gimbal Indicator |
|
Rectangle { |
|
id: gimbalBackground |
|
width: _hasGimbal ? ScreenTools.defaultFontPixelWidth * 6 : 0 |
|
height: _hasGimbal ? (gimbalCol.height + (ScreenTools.defaultFontPixelHeight * 2)) : 0 |
|
visible: _hasGimbal |
|
color: Qt.rgba(qgcPal.window.r, qgcPal.window.g, qgcPal.window.b, 0.75) |
|
radius: ScreenTools.defaultFontPixelWidth * 0.5 |
|
anchors.verticalCenter: cameraRect.verticalCenter |
|
Column { |
|
id: gimbalCol |
|
spacing: ScreenTools.defaultFontPixelHeight * 0.75 |
|
anchors.centerIn: parent |
|
QGCColoredImage { |
|
id: gimbalIcon |
|
source: "/custom/img/gimbal_icon.svg" |
|
color: qgcPal.text |
|
width: ScreenTools.defaultFontPixelWidth * 2 |
|
height: width |
|
smooth: true |
|
mipmap: true |
|
antialiasing: true |
|
fillMode: Image.PreserveAspectFit |
|
sourceSize.width: width |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
Image { |
|
id: pitchScale |
|
height: cameraRect.height * 0.65 |
|
source: qgcPal.globalTheme === QGCPalette.Light ? "/custom/img/gimbal_pitch_indoors.svg" : "/custom/img/gimbal_pitch_outdoors.svg" |
|
fillMode: Image.PreserveAspectFit |
|
sourceSize.height: height |
|
smooth: true |
|
mipmap: true |
|
antialiasing: true |
|
|
|
Image { |
|
id: yawIndicator |
|
width: ScreenTools.defaultFontPixelWidth * 4 |
|
source: "/custom/img/gimbal_position.svg" |
|
fillMode: Image.PreserveAspectFit |
|
sourceSize.width: width |
|
x: pitchScale.width/2 |
|
y: (pitchScale.height * pitchScale.scaleRatio) + (pitchScale._pitch / pitchScale.rangeValue) * pitchScale.height |
|
smooth: true |
|
mipmap: true |
|
transform: [ |
|
Translate { |
|
x: -yawIndicator.width / 2 |
|
y: -yawIndicator.height / 2 |
|
}, |
|
Rotation { |
|
angle: _gimbalYaw |
|
} |
|
] |
|
} |
|
readonly property real minValue: -15 |
|
readonly property real centerValue: 0 |
|
readonly property real maxValue: 90 |
|
readonly property real rangeValue: maxValue - minValue |
|
readonly property real scaleRatio: 1/7 |
|
property real _pitch: _gimbalPitch < minValue ? minValue : (_gimbalPitch > maxValue ? maxValue : _gimbalPitch) |
|
} |
|
QGCLabel { |
|
id: gimbalLabel |
|
width: gimbalCol.width |
|
color: qgcPal.text |
|
font.pointSize: ScreenTools.smallFontPointSize |
|
text: activeVehicle ? activeVehicle.gimbalPitch.toFixed(0) : "-" |
|
horizontalAlignment: Text.AlignHCenter |
|
} |
|
} |
|
} // Gimbal Indicator |
|
} |
|
//-- Zoom Buttons |
|
ZoomControl { |
|
id: zoomControl |
|
visible: _hasZoom |
|
mainColor: qgcPal.window |
|
contentColor: qgcPal.text |
|
fontPointSize: ScreenTools.defaultFontPointSize * 1.75 |
|
zoomLevelVisible: false |
|
zoomLevel: _hasZoom ? _camera.zoomLevel : NaN |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
onlyContinousZoom: true |
|
onZoomIn: { |
|
_camera.stepZoom(1) |
|
} |
|
onZoomOut: { |
|
_camera.stepZoom(-1) |
|
} |
|
onContinuousZoomStart: { |
|
_camera.startZoom(zoomIn ? 1 : -1) |
|
} |
|
onContinuousZoomStop: { |
|
_camera.stopZoom() |
|
} |
|
} |
|
} |
|
//------------------------------------------------------------------------- |
|
//-- Camera Settings |
|
Popup { |
|
id: cameraSettings |
|
width: Math.min(mainWindow.width * 0.666, ScreenTools.defaultFontPixelWidth * 80) |
|
height: mainWindow.height * 0.666 |
|
modal: true |
|
focus: true |
|
parent: Overlay.overlay |
|
x: Math.round((mainWindow.width - width) * 0.5) |
|
y: Math.round((mainWindow.height - height) * 0.5) |
|
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside |
|
background: Rectangle { |
|
anchors.fill: parent |
|
color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) |
|
border.color: qgcPal.text |
|
radius: ScreenTools.defaultFontPixelWidth |
|
} |
|
Item { |
|
anchors.fill: parent |
|
anchors.margins: ScreenTools.defaultFontPixelHeight |
|
function showEditFact(fact) { |
|
factEditor.text = fact.valueString |
|
factEdit.fact = fact |
|
factEdit.visible = true |
|
} |
|
function hideEditFact() { |
|
factEdit.visible = false |
|
factEdit.fact = null |
|
} |
|
QGCLabel { |
|
id: cameraSettingsLabel |
|
text: _noSdCard ? qsTr("Settings") : (_cameraVideoMode ? qsTr("Video Settings") : qsTr("Photo Settings")) |
|
font.family: ScreenTools.demiboldFontFamily |
|
font.pointSize: ScreenTools.mediumFontPointSize |
|
anchors.margins: ScreenTools.defaultFontPixelWidth |
|
anchors.top: parent.top |
|
anchors.left: parent.left |
|
} |
|
QGCFlickable { |
|
clip: true |
|
anchors.top: cameraSettingsLabel.bottom |
|
anchors.bottom: parent.bottom |
|
anchors.margins: ScreenTools.defaultFontPixelWidth |
|
width: cameraSettingsCol.width + (ScreenTools.defaultFontPixelWidth * 2) |
|
contentHeight: cameraSettingsCol.height |
|
contentWidth: cameraSettingsCol.width |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
Column { |
|
id: cameraSettingsCol |
|
spacing: _spacers |
|
anchors.margins: ScreenTools.defaultFontPixelHeight |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
//------------------------------------------- |
|
//-- Camera Selector |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
visible: _isCamera && _dynamicCameras.cameraLabels.length > 1 |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
QGCLabel { |
|
text: qsTr("Camera Selector:") |
|
width: _labelFieldWidth |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
QGCComboBox { |
|
model: _isCamera ? _dynamicCameras.cameraLabels : [] |
|
width: _editFieldWidth |
|
height: _editFieldHeight |
|
onActivated: _dynamicCameras.currentCamera = index |
|
currentIndex: _dynamicCameras ? _dynamicCameras.currentCamera : 0 |
|
} |
|
} |
|
Rectangle { |
|
color: qgcPal.button |
|
height: 1 |
|
width: cameraSettingsCol.width |
|
visible: _isCamera && _dynamicCameras.cameraLabels.length > 1 |
|
} |
|
//------------------------------------------- |
|
//-- Stream Selector |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
visible: _isCamera && _camera.streamLabels.length > 1 |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
QGCLabel { |
|
text: qsTr("Stream Selector:") |
|
width: _labelFieldWidth |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
QGCComboBox { |
|
model: _camera ? _camera.streamLabels : [] |
|
width: _editFieldWidth |
|
height: _editFieldHeight |
|
onActivated: _camera.currentStream = index |
|
currentIndex: _camera ? _camera.currentStream : 0 |
|
} |
|
} |
|
Rectangle { |
|
color: qgcPal.button |
|
height: 1 |
|
width: cameraSettingsCol.width |
|
visible: _isCamera && _camera.streamLabels.length > 1 |
|
} |
|
//------------------------------------------- |
|
//-- Thermal Modes |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
visible: QGroundControl.videoManager.hasThermal |
|
property var thermalModes: [qsTr("Off"), qsTr("Blend"), qsTr("Full"), qsTr("Picture In Picture")] |
|
QGCLabel { |
|
text: qsTr("Thermal View Mode") |
|
width: _labelFieldWidth |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
QGCComboBox { |
|
width: _editFieldWidth |
|
height: _editFieldHeight |
|
model: parent.thermalModes |
|
currentIndex: _camera ? _camera.thermalMode : 0 |
|
onActivated: _camera.thermalMode = index |
|
} |
|
} |
|
Rectangle { |
|
color: qgcPal.button |
|
height: 1 |
|
width: cameraSettingsCol.width |
|
visible: QGroundControl.videoManager.hasThermal |
|
} |
|
//------------------------------------------- |
|
//-- Thermal Video Opacity |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
visible: QGroundControl.videoManager.hasThermal && _camera.thermalMode === QGCCameraControl.THERMAL_BLEND |
|
QGCLabel { |
|
text: qsTr("Blend Opacity") |
|
width: _labelFieldWidth |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
Slider { |
|
width: _editFieldWidth |
|
height: _editFieldHeight |
|
to: 100 |
|
from: 0 |
|
value: _camera ? _camera.thermalOpacity : 0 |
|
live: true |
|
onValueChanged: { |
|
_camera.thermalOpacity = value |
|
} |
|
} |
|
} |
|
Rectangle { |
|
color: qgcPal.button |
|
height: 1 |
|
width: cameraSettingsCol.width |
|
visible: QGroundControl.videoManager.hasThermal && _camera.thermalMode === QGCCameraControl.THERMAL_BLEND |
|
} |
|
//------------------------------------------- |
|
//-- Settings from Camera Definition File |
|
Repeater { |
|
model: _camera ? _camera.activeSettings : [] |
|
Item { |
|
width: repCol.width |
|
height: repCol.height |
|
Column { |
|
id: repCol |
|
spacing: _spacers |
|
property var _fact: _camera.getFact(modelData) |
|
Row { |
|
height: visible ? undefined : 0 |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
property bool _isBool: parent._fact.typeIsBool |
|
property bool _isCombo: !_isBool && parent._fact.enumStrings.length > 0 |
|
property bool _isSlider: parent._fact && !isNaN(parent._fact.increment) |
|
property bool _isEdit: !_isBool && !_isSlider && parent._fact.enumStrings.length < 1 |
|
QGCLabel { |
|
text: parent.parent._fact.shortDescription |
|
width: _labelFieldWidth |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
FactComboBox { |
|
width: parent._isCombo ? _editFieldWidth : 0 |
|
height: parent._isCombo ? _editFieldHeight : 0 |
|
fact: parent.parent._fact |
|
indexModel: false |
|
visible: parent._isCombo |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
QGCButton { |
|
visible: parent._isEdit |
|
width: parent._isEdit ? _editFieldWidth : 0 |
|
height: parent._isEdit ? _editFieldHeight : 0 |
|
text: parent.parent._fact.valueString |
|
onClicked: { |
|
showEditFact(parent.parent._fact) |
|
} |
|
} |
|
QGCSlider { |
|
width: parent._isSlider ? _editFieldWidth : 0 |
|
height: parent._isSlider ? _editFieldHeight : 0 |
|
maximumValue: parent.parent._fact.max |
|
minimumValue: parent.parent._fact.min |
|
stepSize: parent.parent._fact.increment |
|
visible: parent._isSlider |
|
updateValueWhileDragging: false |
|
anchors.verticalCenter: parent.verticalCenter |
|
Component.onCompleted: { |
|
value = parent.parent._fact.value |
|
} |
|
onValueChanged: { |
|
parent.parent._fact.value = value |
|
} |
|
} |
|
CustomOnOffSwitch { |
|
width: parent._isBool ? _editFieldWidth : 0 |
|
height: parent._isBool ? _editFieldHeight : 0 |
|
checked: parent.parent._fact ? parent.parent._fact.value : false |
|
onClicked: parent.parent._fact.value = checked ? 1 : 0 |
|
visible: parent._isBool |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
} |
|
Rectangle { |
|
color: qgcPal.button |
|
height: 1 |
|
width: cameraSettingsCol.width |
|
} |
|
} |
|
} |
|
} |
|
//------------------------------------------- |
|
//-- Time Lapse |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
visible: _cameraPhotoMode && !_noSdCard |
|
property var photoModes: [qsTr("Single"), qsTr("Time Lapse")] |
|
QGCLabel { |
|
text: qsTr("Photo Mode") |
|
width: _labelFieldWidth |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
QGCComboBox { |
|
width: _editFieldWidth |
|
height: _editFieldHeight |
|
model: parent.photoModes |
|
currentIndex: _camera ? _camera.photoMode : 0 |
|
onActivated: _camera.photoMode = index |
|
} |
|
} |
|
Rectangle { |
|
color: qgcPal.button |
|
height: 1 |
|
width: cameraSettingsCol.width |
|
visible: _cameraPhotoMode && !_noSdCard |
|
} |
|
//------------------------------------------- |
|
//-- Time Lapse Interval |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
visible: _cameraPhotoMode && _camera.photoMode === QGCCameraControl.PHOTO_CAPTURE_TIMELAPSE && !_noSdCard |
|
QGCLabel { |
|
text: qsTr("Photo Interval (seconds)") |
|
width: _labelFieldWidth |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
QGCSlider { |
|
width: _editFieldWidth |
|
height: _editFieldHeight |
|
maximumValue: 60 |
|
minimumValue: _camera ? (_camera.isE90 ? 3 : 5) : 5 |
|
stepSize: 1 |
|
value: _camera ? _camera.photoLapse : 5 |
|
updateValueWhileDragging: true |
|
anchors.verticalCenter: parent.verticalCenter |
|
onValueChanged: { |
|
if(_camera) { |
|
_camera.photoLapse = value |
|
} |
|
} |
|
} |
|
} |
|
Rectangle { |
|
color: qgcPal.button |
|
height: 1 |
|
width: cameraSettingsCol.width |
|
visible: _cameraPhotoMode && _camera.photoMode === QGCCameraControl.PHOTO_CAPTURE_TIMELAPSE && !_noSdCard |
|
} |
|
//------------------------------------------- |
|
//-- Gimbal Control |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
visible: _camera && !_camera.isThermal |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
QGCLabel { |
|
text: qsTr("Show Gimbal Control") |
|
width: _labelFieldWidth |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
CustomOnOffSwitch { |
|
checked: CustomQuickInterface.showGimbalControl |
|
width: _editFieldWidth |
|
height: _editFieldHeight |
|
anchors.verticalCenter: parent.verticalCenter |
|
onClicked: CustomQuickInterface.showGimbalControl = checked |
|
} |
|
} |
|
Rectangle { |
|
color: qgcPal.button |
|
height: 1 |
|
width: cameraSettingsCol.width |
|
visible: _camera && !_camera.isThermal |
|
} |
|
//------------------------------------------- |
|
//-- Screen Grid |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
visible: _camera && !_camera.isThermal |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
QGCLabel { |
|
text: qsTr("Screen Grid") |
|
width: _labelFieldWidth |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
CustomOnOffSwitch { |
|
checked: QGroundControl.settingsManager.videoSettings.gridLines.rawValue |
|
width: _editFieldWidth |
|
height: _editFieldHeight |
|
anchors.verticalCenter: parent.verticalCenter |
|
onClicked: QGroundControl.settingsManager.videoSettings.gridLines.rawValue = checked |
|
} |
|
} |
|
Rectangle { |
|
color: qgcPal.button |
|
height: 1 |
|
width: cameraSettingsCol.width |
|
visible: _camera && !_camera.isThermal |
|
} |
|
//------------------------------------------- |
|
//-- Video Fit |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
visible: _camera |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
QGCLabel { |
|
text: qsTr("Video Screen Fit") |
|
width: _labelFieldWidth |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
FactComboBox { |
|
width: _editFieldWidth |
|
height: _editFieldHeight |
|
fact: QGroundControl.settingsManager.videoSettings.videoFit |
|
indexModel: false |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
} |
|
Rectangle { |
|
color: qgcPal.button |
|
height: 1 |
|
width: cameraSettingsCol.width |
|
visible: _camera && !_camera.isThermal |
|
} |
|
//------------------------------------------- |
|
//-- Reset Camera |
|
Row { |
|
spacing: ScreenTools.defaultFontPixelWidth |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
QGCLabel { |
|
text: qsTr("Reset Camera Defaults") |
|
width: _labelFieldWidth |
|
anchors.verticalCenter: parent.verticalCenter |
|
} |
|
QGCButton { |
|
text: qsTr("Reset") |
|
onClicked: resetPrompt.open() |
|
width: _editFieldWidth |
|
height: _editFieldHeight |
|
enabled: !_recordingVideo |
|
anchors.verticalCenter: parent.verticalCenter |
|
MessageDialog { |
|
id: resetPrompt |
|
title: qsTr("Reset Camera to Factory Settings") |
|
text: qsTr("Confirm resetting all settings?") |
|
standardButtons: StandardButton.Yes | StandardButton.No |
|
onNo: resetPrompt.close() |
|
onYes: { |
|
_camera.resetSettings() |
|
QGroundControl.settingsManager.videoSettings.gridLines.rawValue = false |
|
_camera.photoMode = QGCCameraControl.PHOTO_CAPTURE_SINGLE |
|
_camera.photoLapse = 5.0 |
|
_camera.photoLapseCount = 0 |
|
resetPrompt.close() |
|
} |
|
} |
|
} |
|
} |
|
Rectangle { |
|
color: qgcPal.button |
|
height: 1 |
|
width: cameraSettingsCol.width |
|
} |
|
} |
|
} |
|
Rectangle { |
|
id: factEdit |
|
visible: false |
|
color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.5) : Qt.rgba(0,0,0,0.5) |
|
anchors.fill: parent |
|
property var fact: null |
|
DeadMouseArea { |
|
anchors.fill: parent |
|
} |
|
Rectangle { |
|
width: factEditCol.width * 1.25 |
|
height: factEditCol.height * 1.25 |
|
color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) |
|
border.width: 1 |
|
border.color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(0,0,0,0.35) : Qt.rgba(1,1,1,0.35) |
|
anchors.top: parent.top |
|
anchors.topMargin: ScreenTools.defaultFontPixelHeight * 8 |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
Column { |
|
id: factEditCol |
|
spacing: ScreenTools.defaultFontPixelHeight |
|
anchors.centerIn: parent |
|
QGCLabel { |
|
text: factEdit.fact ? factEdit.fact.shortDescription : "" |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
FactTextField { |
|
id: factEditor |
|
width: _editFieldWidth |
|
fact: factEdit.fact |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
} |
|
QGCButton { |
|
text: qsTr("Close") |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
onClicked: { |
|
factEditor.completeEditing() |
|
hideEditFact() |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
//------------------------------------------------------------------------- |
|
//-- Thermal Palettes |
|
Popup { |
|
id: thermalPalettes |
|
width: Math.min(mainWindow.width * 0.666, ScreenTools.defaultFontPixelWidth * 40) |
|
height: mainWindow.height * 0.5 |
|
modal: true |
|
focus: true |
|
parent: Overlay.overlay |
|
x: Math.round((mainWindow.width - width) * 0.5) |
|
y: Math.round((mainWindow.height - height) * 0.5) |
|
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside |
|
|
|
background: Rectangle { |
|
anchors.fill: parent |
|
color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) |
|
border.color: qgcPal.text |
|
radius: ScreenTools.defaultFontPixelWidth * 0.5 |
|
} |
|
Item { |
|
anchors.fill: parent |
|
anchors.margins: ScreenTools.defaultFontPixelHeight |
|
QGCFlickable { |
|
clip: true |
|
anchors.fill: parent |
|
width: comboListCol.width + (ScreenTools.defaultFontPixelWidth * 2) |
|
contentHeight: comboListCol.height |
|
contentWidth: comboListCol.width |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
ColumnLayout { |
|
id: comboListCol |
|
spacing: ScreenTools.defaultFontPixelHeight |
|
anchors.margins: ScreenTools.defaultFontPixelHeight |
|
anchors.horizontalCenter: parent.horizontalCenter |
|
QGCLabel { |
|
text: qsTr("Thermal Palettes") |
|
Layout.alignment: Qt.AlignHCenter |
|
} |
|
Repeater { |
|
model: _irPaletteFact ? _irPaletteFact.enumStrings : [] |
|
QGCButton { |
|
text: modelData |
|
Layout.minimumHeight: ScreenTools.defaultFontPixelHeight * 3 |
|
Layout.minimumWidth: ScreenTools.defaultFontPixelWidth * 30 |
|
Layout.fillHeight: true |
|
Layout.fillWidth: true |
|
Layout.alignment: Qt.AlignHCenter |
|
checked: index === _irPaletteFact.value |
|
onClicked: { |
|
_irPaletteFact.value = index |
|
if(thermalBackgroundRect.visible) { |
|
if(_camera.thermalMode !== QGCCameraControl.THERMAL_PIP && _camera.thermalMode !== QGCCameraControl.THERMAL_FULL) { |
|
_camera.thermalMode = QGCCameraControl.THERMAL_FULL |
|
thermalFull.checked = true |
|
} |
|
} |
|
|
|
thermalPalettes.close() |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
|