PlanToolBar.qml 11.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import QtQuick          2.3
import QtQuick.Controls 1.2
import QtQuick.Layouts  1.2
import QtQuick.Dialogs  1.2

import QGroundControl                   1.0
import QGroundControl.ScreenTools       1.0
import QGroundControl.Controls          1.0
import QGroundControl.FactControls      1.0
import QGroundControl.Palette           1.0

// Toolbar for Plan View
Rectangle {
    id:                 _root
    height:             ScreenTools.toolbarHeight
    anchors.left:       parent.left
    anchors.right:      parent.right
    anchors.top:        parent.top
    z:                  toolBar.z + 1
Gus Grubba's avatar
Gus Grubba committed
20
    color:              qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.8) : Qt.rgba(0,0,0,0.75)
21
    visible:            false
22
    anchors.bottomMargin: 1
23 24 25 26 27 28

    signal showFlyView

    property var    missionController
    property var    currentMissionItem          ///< Mission item to display status for

Donald Gagne's avatar
Donald Gagne committed
29 30 31 32 33
    property var    missionItems:               _controllerValid ? missionController.visualItems : undefined
    property real   missionDistance:            _controllerValid ? missionController.missionDistance : NaN
    property real   missionTime:                _controllerValid ? missionController.missionTime : NaN
    property real   missionMaxTelemetry:        _controllerValid ? missionController.missionMaxTelemetry : NaN
    property bool   missionDirty:               _controllerValid ? missionController.dirty : false
34 35 36 37 38

    property var    _activeVehicle:             QGroundControl.multiVehicleManager.activeVehicle

    property bool   _statusValid:               currentMissionItem != undefined
    property bool   _missionValid:              missionItems != undefined
Donald Gagne's avatar
Donald Gagne committed
39
    property bool   _controllerValid:           missionController != undefined
40 41
    property bool   _manualUpload:              QGroundControl.settingsManager.appSettings.automaticMissionUpload.rawValue == 0

42
    property real   _dataFontSize:              ScreenTools.isMobile ? ScreenTools.smallFontPointSize : ScreenTools.defaultFontPointSize
43 44 45
    property real   _largeValueWidth:           ScreenTools.defaultFontPixelWidth * 8
    property real   _smallValueWidth:           ScreenTools.defaultFontPixelWidth * 4
    property real   _labelToValueSpacing:       ScreenTools.defaultFontPixelWidth
46
    property real   _rowSpacing:                ScreenTools.isMobile ? 1 : 0
47 48 49 50 51 52 53 54
    property real   _distance:                  _statusValid ? currentMissionItem.distance : NaN
    property real   _altDifference:             _statusValid ? currentMissionItem.altDifference : NaN
    property real   _gradient:                  _statusValid && currentMissionItem.distance > 0 ? Math.atan(currentMissionItem.altDifference / currentMissionItem.distance) : NaN
    property real   _gradientPercent:           isNaN(_gradient) ? NaN : _gradient * 100
    property real   _azimuth:                   _statusValid ? currentMissionItem.azimuth : NaN
    property real   _missionDistance:           _missionValid ? missionDistance : NaN
    property real   _missionMaxTelemetry:       _missionValid ? missionMaxTelemetry : NaN
    property real   _missionTime:               _missionValid ? missionTime : NaN
55 56 57 58 59 60 61
    property int    _batteryChangePoint:        _controllerValid ? missionController.batteryChangePoint : -1
    property int    _batteriesRequired:         _controllerValid ? missionController.batteriesRequired : -1

    property string _distanceText:              isNaN(_distance) ?              "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_distance).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString
    property string _altDifferenceText:         isNaN(_altDifference) ?         "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_altDifference).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString
    property string _gradientText:              isNaN(_gradient) ?              "-.-" : _gradientPercent.toFixed(0) + "%"
    property string _azimuthText:               isNaN(_azimuth) ?               "-.-" : Math.round(_azimuth)
62 63
    property string _missionDistanceText:       isNaN(_missionDistance) ?       "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_missionDistance).toFixed(0) + " " + QGroundControl.appSettingsDistanceUnitsString
    property string _missionMaxTelemetryText:   isNaN(_missionMaxTelemetry) ?   "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_missionMaxTelemetry).toFixed(0) + " " + QGroundControl.appSettingsDistanceUnitsString
64 65
    property string _batteryChangePointText:    _batteryChangePoint < 0 ?       "N/A" : _batteryChangePoint
    property string _batteriesRequiredText:     _batteriesRequired < 0 ?        "N/A" : _batteriesRequired
66

Donald Gagne's avatar
Donald Gagne committed
67
    readonly property real _margins: ScreenTools.defaultFontPixelWidth
68 69 70

    QGCPalette { id: qgcPal }

71 72 73 74 75 76 77 78
    function getMissionTime() {
        if(isNaN(_missionTime)) {
            return "00:00:00"
        }
        var t = new Date(0, 0, 0, 0, 0, Number(_missionTime))
        return Qt.formatTime(t, 'hh:mm:ss')
    }

Gus Grubba's avatar
Gus Grubba committed
79 80 81 82 83 84 85 86
    //-- Eat mouse events, preventing them from reaching toolbar, which is underneath us.
    MouseArea {
        anchors.fill:   parent
        onWheel:        { wheel.accepted = true; }
        onPressed:      { mouse.accepted = true; }
        onReleased:     { mouse.accepted = true; }
    }

87 88
    //-- The reason for this Row to be here is so the Logo (Home) button is in the same
    //   location as the one in the main toolbar.
89
    Row {
90
        id:                     logoRow
91 92 93 94
        anchors.bottomMargin:   1
        anchors.left:           parent.left
        anchors.top:            parent.top
        anchors.bottom:         parent.bottom
95 96 97 98 99 100 101 102 103
        QGCToolBarButton {
            id:                 settingsButton
            anchors.top:        parent.top
            anchors.bottom:     parent.bottom
            source:             "/qmlimages/PaperPlane.svg"
            logo:               true
            checked:            false
            onClicked: {
                checked = false
104
                if (missionController.uploadOnSwitch()) {
105 106
                    showFlyView()
                }
107 108
            }
        }
109 110 111
    }


112 113 114 115 116 117 118 119
    RowLayout {
        anchors.top:            parent.top
        anchors.bottom:         parent.bottom
        spacing:                _margins * 2
        anchors.left:           logoRow.right
        anchors.leftMargin:     _margins * 4
        anchors.right:          uploadButton.visible ? uploadButton.left : parent.right
        anchors.rightMargin:    _margins
120 121

        GridLayout {
122 123
            anchors.verticalCenter: parent.verticalCenter
            columns:                5
124
            rowSpacing:             _rowSpacing
125
            columnSpacing:          _labelToValueSpacing
126 127

            QGCLabel {
128
                text:               qsTr("Selected Waypoint")
Donald Gagne's avatar
Donald Gagne committed
129 130
                Layout.columnSpan:  5
                font.pointSize:     ScreenTools.smallFontPointSize
131 132
            }

133
            QGCLabel { text: qsTr("Distance:"); font.pointSize: _dataFontSize; }
134 135
            QGCLabel {
                text:                   _distanceText
136
                font.pointSize:         _dataFontSize
137 138 139
                Layout.minimumWidth:    _largeValueWidth
                horizontalAlignment:    Text.AlignRight
            }
140

Donald Gagne's avatar
Donald Gagne committed
141 142
            Item { width: 1; height: 1 }

143
            QGCLabel { text: qsTr("Gradient:"); font.pointSize: _dataFontSize; }
144 145
            QGCLabel {
                text:                   _gradientText
146
                font.pointSize:         _dataFontSize
147 148 149
                Layout.minimumWidth:    _smallValueWidth
                horizontalAlignment:    Text.AlignRight
            }
150

151
            QGCLabel { text: qsTr("Alt diff:"); font.pointSize: _dataFontSize; }
152 153
            QGCLabel {
                text:                   _altDifferenceText
154
                font.pointSize:         _dataFontSize
155 156 157
                Layout.minimumWidth:    _largeValueWidth
                horizontalAlignment:    Text.AlignRight
            }
158

Donald Gagne's avatar
Donald Gagne committed
159 160
            Item { width: 1; height: 1 }

161
            QGCLabel { text: qsTr("Azimuth:"); font.pointSize: _dataFontSize; }
162 163
            QGCLabel {
                text:                   _azimuthText
164
                font.pointSize:         _dataFontSize
165 166 167
                Layout.minimumWidth:    _smallValueWidth
                horizontalAlignment:    Text.AlignRight
            }
168 169 170
        }

        GridLayout {
171 172
            anchors.verticalCenter: parent.verticalCenter
            columns:                5
173
            rowSpacing:             _rowSpacing
174
            columnSpacing:          _labelToValueSpacing
175 176

            QGCLabel {
177
                text:               qsTr("Total Mission")
Donald Gagne's avatar
Donald Gagne committed
178 179
                Layout.columnSpan:  5
                font.pointSize:     ScreenTools.smallFontPointSize
180 181
            }

182
            QGCLabel { text: qsTr("Distance:"); font.pointSize: _dataFontSize; }
183 184
            QGCLabel {
                text:                   _missionDistanceText
185
                font.pointSize:         _dataFontSize
186 187 188
                Layout.minimumWidth:    _largeValueWidth
                horizontalAlignment:    Text.AlignRight
            }
189

Donald Gagne's avatar
Donald Gagne committed
190 191
            Item { width: 1; height: 1 }

192
            QGCLabel { text: qsTr("Max telem dist:"); font.pointSize: _dataFontSize; }
193 194
            QGCLabel {
                text:                   _missionMaxTelemetryText
195
                font.pointSize:         _dataFontSize
196 197 198
                Layout.minimumWidth:    _largeValueWidth
                horizontalAlignment:    Text.AlignRight
            }
199

200
            QGCLabel { text: qsTr("Time:"); font.pointSize: _dataFontSize; }
201
            QGCLabel {
202 203
                text:                   getMissionTime()
                font.pointSize:         _dataFontSize
204 205 206
                Layout.minimumWidth:    _largeValueWidth
                horizontalAlignment:    Text.AlignRight
            }
207
        }
Donald Gagne's avatar
Donald Gagne committed
208 209

        GridLayout {
210 211
            anchors.verticalCenter: parent.verticalCenter
            columns:                3
212
            rowSpacing:             _rowSpacing
213
            columnSpacing:          _labelToValueSpacing
Donald Gagne's avatar
Donald Gagne committed
214 215 216 217 218 219 220

            QGCLabel {
                text:               qsTr("Battery")
                Layout.columnSpan:  3
                font.pointSize:     ScreenTools.smallFontPointSize
            }

221
            QGCLabel { text: qsTr("Batteries required:"); font.pointSize: _dataFontSize; }
222 223
            QGCLabel {
                text:                   _batteriesRequiredText
224
                font.pointSize:         _dataFontSize
225 226 227
                horizontalAlignment:    Text.AlignRight
                Layout.minimumWidth:    _smallValueWidth
            }
Donald Gagne's avatar
Donald Gagne committed
228 229 230

            Item { width: 1; height: 1 }

231
            QGCLabel { text: qsTr("Swap waypoint:"); font.pointSize: _dataFontSize; }
232 233
            QGCLabel {
                text:                   _batteryChangePointText
234
                font.pointSize:         _dataFontSize
235 236 237
                horizontalAlignment:    Text.AlignRight
                Layout.minimumWidth:    _smallValueWidth
            }
Donald Gagne's avatar
Donald Gagne committed
238
        }
239
    }
240 241 242 243 244 245

    QGCButton {
        id:                     uploadButton
        anchors.rightMargin:    _margins
        anchors.right:          parent.right
        anchors.verticalCenter: parent.verticalCenter
246
        text:                   missionController ? (missionController.dirty ? qsTr("Upload Required") : qsTr("Upload")) : ""
247 248 249
        enabled:                _activeVehicle
        visible:                _manualUpload
        onClicked:              missionController.upload()
250 251 252 253 254 255 256 257 258 259

        PropertyAnimation on opacity {
            easing.type:    Easing.OutQuart
            from:           0.5
            to:             1
            loops:          Animation.Infinite
            running:        missionController ? missionController.dirty : false
            alwaysRunToEnd: true
            duration:       2000
        }
260
    }
261 262
}