FlightDisplayViewVideo.qml 8.32 KB
Newer Older
1 2 3 4 5 6 7 8
/****************************************************************************
 *
 *   (c) 2009-2016 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.
 *
 ****************************************************************************/
9 10


11 12
import QtQuick                          2.11
import QtQuick.Controls                 2.4
13

14 15 16 17 18 19 20 21
import QGroundControl                   1.0
import QGroundControl.FlightDisplay     1.0
import QGroundControl.FlightMap         1.0
import QGroundControl.ScreenTools       1.0
import QGroundControl.Controls          1.0
import QGroundControl.Palette           1.0
import QGroundControl.Vehicle           1.0
import QGroundControl.Controllers       1.0
22

dogmaphobic's avatar
dogmaphobic committed
23
Item {
24 25
    id:     root
    clip:   true
26
    property double _ar:                QGroundControl.videoManager.aspectRatio
27
    property bool   _showGrid:          QGroundControl.settingsManager.videoSettings.gridLines.rawValue > 0
28
    property var    _videoReceiver:     QGroundControl.videoManager.videoReceiver
Gus Grubba's avatar
Gus Grubba committed
29 30
    property var    _dynamicCameras:    activeVehicle ? activeVehicle.dynamicCameras : null
    property bool   _connected:         activeVehicle ? !activeVehicle.connectionLost : false
31 32 33
    property int    _curCameraIndex:    _dynamicCameras ? _dynamicCameras.currentCamera : 0
    property bool   _isCamera:          _dynamicCameras ? _dynamicCameras.cameras.count > 0 : false
    property var    _camera:            _isCamera ? _dynamicCameras.cameras.get(_curCameraIndex) : null
34
    property bool   _hasZoom:           _camera && _camera.hasZoom
35
    property int    _fitMode:           QGroundControl.settingsManager.videoSettings.videoFit.rawValue
36

37
    property double _thermalHeightFactor: 0.85 //-- TODO
38

dogmaphobic's avatar
dogmaphobic committed
39 40 41
    Rectangle {
        id:             noVideo
        anchors.fill:   parent
dogmaphobic's avatar
dogmaphobic committed
42
        color:          Qt.rgba(0,0,0,0.75)
43
        visible:        !(_videoReceiver && _videoReceiver.videoRunning)
dogmaphobic's avatar
dogmaphobic committed
44
        QGCLabel {
45
            text:               QGroundControl.settingsManager.videoSettings.streamEnabled.rawValue ? qsTr("WAITING FOR VIDEO") : qsTr("VIDEO DISABLED")
46
            font.family:        ScreenTools.demiboldFontFamily
dogmaphobic's avatar
dogmaphobic committed
47
            color:              "white"
48
            font.pointSize:     mainIsMap ? ScreenTools.smallFontPointSize : ScreenTools.largeFontPointSize
dogmaphobic's avatar
dogmaphobic committed
49 50
            anchors.centerIn:   parent
        }
51 52 53 54 55 56
        MouseArea {
            anchors.fill: parent
            onDoubleClicked: {
                QGroundControl.videoManager.fullScreen = !QGroundControl.videoManager.fullScreen
            }
        }
dogmaphobic's avatar
dogmaphobic committed
57
    }
58
    Rectangle {
dogmaphobic's avatar
dogmaphobic committed
59
        anchors.fill:   parent
60
        color:          "black"
61
        visible:        _videoReceiver && _videoReceiver.videoRunning
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
        function getWidth() {
            //-- Fit Width or Stretch
            if(_fitMode === 0 || _fitMode === 2) {
                return parent.width
            }
            //-- Fit Height
            return _ar != 0.0 ? parent.height * _ar : parent.width
        }
        function getHeight() {
            //-- Fit Height or Stretch
            if(_fitMode === 1 || _fitMode === 2) {
                return parent.height
            }
            //-- Fit Width
            return _ar != 0.0 ? parent.width * (1 / _ar) : parent.height
        }
78
        //-- Main Video
79
        QGCVideoBackground {
80
            id:             videoContent
81 82
            height:         parent.getHeight()
            width:          parent.getWidth()
83
            anchors.centerIn: parent
84 85
            receiver:       _videoReceiver
            display:        _videoReceiver && _videoReceiver.videoSurface
86
            visible:        _videoReceiver && _videoReceiver.videoRunning && !(QGroundControl.videoManager.hasThermal && _camera.thermalMode === QGCCameraControl.THERMAL_FULL)
87
            Connections {
88
                target:         _videoReceiver
89 90
                onImageFileChanged: {
                    videoContent.grabToImage(function(result) {
91
                        if (!result.saveToFile(_videoReceiver.imageFile)) {
92 93 94 95 96
                            console.error('Error capturing video frame');
                        }
                    });
                }
            }
97 98 99 100 101
            Rectangle {
                color:  Qt.rgba(1,1,1,0.5)
                height: parent.height
                width:  1
                x:      parent.width * 0.33
102
                visible: _showGrid && !QGroundControl.videoManager.fullScreen
103 104 105 106 107 108
            }
            Rectangle {
                color:  Qt.rgba(1,1,1,0.5)
                height: parent.height
                width:  1
                x:      parent.width * 0.66
109
                visible: _showGrid && !QGroundControl.videoManager.fullScreen
110 111 112 113 114 115
            }
            Rectangle {
                color:  Qt.rgba(1,1,1,0.5)
                width:  parent.width
                height: 1
                y:      parent.height * 0.33
116
                visible: _showGrid && !QGroundControl.videoManager.fullScreen
117 118 119 120 121 122
            }
            Rectangle {
                color:  Qt.rgba(1,1,1,0.5)
                width:  parent.width
                height: 1
                y:      parent.height * 0.66
123
                visible: _showGrid && !QGroundControl.videoManager.fullScreen
124
            }
dogmaphobic's avatar
dogmaphobic committed
125
        }
126 127 128 129
        //-- Thermal Image
        Item {
            id:                 thermalItem
            width:              height * QGroundControl.videoManager.thermalAspectRatio
130
            height:             _camera ? (_camera.thermalMode === QGCCameraControl.THERMAL_FULL ? parent.height : (_camera.thermalMode === QGCCameraControl.THERMAL_PIP ? ScreenTools.defaultFontPixelHeight * 12 : parent.height * _thermalHeightFactor)) : 0
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
            anchors.centerIn:   parent
            visible:            QGroundControl.videoManager.hasThermal && _camera.thermalMode !== QGCCameraControl.THERMAL_OFF
            function pipOrNot() {
                if(_camera) {
                    if(_camera.thermalMode === QGCCameraControl.THERMAL_PIP) {
                        anchors.centerIn    = undefined
                        anchors.top         = parent.top
                        anchors.topMargin   = mainWindow.header.height + (ScreenTools.defaultFontPixelHeight * 0.5)
                        anchors.left        = parent.left
                        anchors.leftMargin  = ScreenTools.defaultFontPixelWidth * 12
                    } else {
                        anchors.top         = undefined
                        anchors.topMargin   = undefined
                        anchors.left        = undefined
                        anchors.leftMargin  = undefined
                        anchors.centerIn    = parent
                    }
                }
            }
            Connections {
                target:                 _camera
                onThermalModeChanged:   thermalItem.pipOrNot()
            }
            onVisibleChanged: {
                thermalItem.pipOrNot()
            }
            QGCVideoBackground {
                id:             thermalVideo
                anchors.fill:   parent
                receiver:       QGroundControl.videoManager.thermalVideoReceiver
                display:        QGroundControl.videoManager.thermalVideoReceiver ? QGroundControl.videoManager.thermalVideoReceiver.videoSurface : null
                opacity:        _camera ? (_camera.thermalMode === QGCCameraControl.THERMAL_BLEND ? _camera.thermalOpacity / 100 : 1.0) : 0
            }
        }
        //-- Full screen toggle
166 167 168 169
        MouseArea {
            anchors.fill: parent
            onDoubleClicked: {
                QGroundControl.videoManager.fullScreen = !QGroundControl.videoManager.fullScreen
170
            }
dogmaphobic's avatar
dogmaphobic committed
171
        }
172
        //-- Zoom
173 174 175 176 177 178 179 180 181 182 183 184 185 186
        PinchArea {
            id:             pinchZoom
            enabled:        _hasZoom
            anchors.fill:   parent
            onPinchStarted: pinchZoom.zoom = 0
            onPinchUpdated: {
                if(_hasZoom) {
                    var z = 0
                    if(pinch.scale < 1) {
                        z = Math.round(pinch.scale * -10)
                    } else {
                        z = Math.round(pinch.scale)
                    }
                    if(pinchZoom.zoom != z) {
187
                        _camera.stepZoom(z)
188 189 190 191 192
                    }
                }
            }
            property int zoom: 0
        }
193 194
    }
}