PreFlightCheckButton.qml 6.23 KB
Newer Older
DonLakeFlyer's avatar
DonLakeFlyer committed
1 2
/****************************************************************************
 *
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
DonLakeFlyer's avatar
DonLakeFlyer committed
4 5 6 7 8
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/
9

DonLakeFlyer's avatar
DonLakeFlyer committed
10 11 12 13 14 15 16
import QtQuick                  2.3
import QtQuick.Controls         1.2
import QtQuick.Controls.Styles  1.4

import QGroundControl               1.0
import QGroundControl.Palette       1.0
import QGroundControl.ScreenTools   1.0
17

18 19 20
/// The PreFlightCheckButton supports creating a button which the user then has to verify/click to confirm a check.
/// It also supports failing the check based on values from within the system: telemetry or QGC app values. These
/// controls are normally placed within a PreFlightCheckGroup.
21 22 23 24 25
///
/// Two types of checks may be included on the button:
///     Manual - This is simply a check which the user must verify and confirm. It is not based on any system state.
///     Telemetry - This type of check can fail due to some state within the system. A telemetry check failure can be
///                 a hard stop in that there is no way to pass the checklist until the system state resolves itself.
26
///                 Or it can also optionally be override by the user.
27
/// If a button uses both manual and telemetry checks, the telemetry check takes precendence and must be passed first.
28
QGCButton {
29 30 31 32 33 34
    property string name:                           ""
    property string manualText:                     ""      ///< text to show for a manual check, "" signals no manual check
    property string telemetryTextFailure                    ///< text to show if telemetry check failed (override not allowed)
    property bool   telemetryFailure:               false   ///< true: telemetry check failing, false: telemetry check passing
    property bool   allowTelemetryFailureOverride:  false   ///< true: user can click past telemetry failure
    property bool   passed:                         _manualState === _statePassed && _telemetryState === _statePassed
35
    property bool   failed:                         _manualState === _stateFailed || _telemetryState === _stateFailed
36 37 38 39 40 41 42

    property int _manualState:          manualText === "" ? _statePassed : _statePending
    property int _telemetryState:       _statePassed
    property int _horizontalPadding:    ScreenTools.defaultFontPixelWidth
    property int _verticalPadding:      Math.round(ScreenTools.defaultFontPixelHeight / 2)
    property real _stateFlagWidth:      ScreenTools.defaultFontPixelWidth * 4

43 44
    readonly property int _statePending:    0   ///< Telemetry check is failing or manual check not yet verified, user can click to make it pass
    readonly property int _stateFailed:     1   ///< Telemetry check is failing, user cannot click to make it pass
45 46
    readonly property int _statePassed:     2   ///< Check has passed

47 48 49
    readonly property color _passedColor:   "#86cc6a"
    readonly property color _pendingColor:  "#f7a81f"
    readonly property color _failedColor:   "#c31818"
50 51 52

    property string _text: "<b>" + name +"</b>: " +
                           ((_telemetryState !== _statePassed) ?
53 54
                               telemetryTextFailure :
                               (_manualState !== _statePassed ? manualText : qsTr("Passed")))
55 56 57 58 59 60 61 62
    property color  _color: _telemetryState === _statePassed && _manualState === _statePassed ?
                                _passedColor :
                                (_telemetryState == _stateFailed ?
                                     _failedColor :
                                     (_telemetryState === _statePending || _manualState === _statePending ?
                                          _pendingColor :
                                          _failedColor))

DonLakeFlyer's avatar
DonLakeFlyer committed
63
    width:      40 * ScreenTools.defaultFontPixelWidth
64 65

    style: ButtonStyle {
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
        padding {
            top:    _verticalPadding
            bottom: _verticalPadding
            left:   (_horizontalPadding * 2) + _stateFlagWidth
            right:  _horizontalPadding
        }

        background: Rectangle {
            color:          qgcPal.button
            border.color:   qgcPal.button;

            Rectangle {
                color:          _color
                anchors.left:   parent.left
                anchors.top:    parent.top
                anchors.bottom: parent.bottom
                width:          _stateFlagWidth
            }
        }

86
        label: Label {
DonLakeFlyer's avatar
DonLakeFlyer committed
87 88 89
            text:                   _text
            wrapMode:               Text.WordWrap
            horizontalAlignment:    Text.AlignHCenter
90
            color:                  qgcPal.buttonText
91 92 93
        }
    }

94
    function _updateTelemetryState() {
95 96
        if (telemetryFailure) {
            // We have a new telemetry failure, reset user pass
97
            _telemetryState = allowTelemetryFailureOverride ? _statePending : _stateFailed
DonLakeFlyer's avatar
DonLakeFlyer committed
98
        } else {
99
            _telemetryState = _statePassed
DonLakeFlyer's avatar
DonLakeFlyer committed
100
        }
101
    }
DonLakeFlyer's avatar
DonLakeFlyer committed
102

103 104 105
    onTelemetryFailureChanged:              _updateTelemetryState()
    onAllowTelemetryFailureOverrideChanged: _updateTelemetryState()

106
    onClicked: {
107
        if (telemetryFailure && !allowTelemetryFailureOverride) {
108 109 110
            // No way to proceed past this failure
            return
        }
111
        if (telemetryFailure && allowTelemetryFailureOverride && _telemetryState !== _statePassed) {
112 113 114 115 116 117 118
            // User is allowed to proceed past this failure
            _telemetryState = _statePassed
            return
        }
        if (manualText !== "" && _manualState !== _statePassed) {
            // User is confirming a manual check
            _manualState = _statePassed
DonLakeFlyer's avatar
DonLakeFlyer committed
119
        }
120
    }
DonLakeFlyer's avatar
DonLakeFlyer committed
121

122 123 124 125 126 127 128 129 130
    onPassedChanged: callButtonPassedChanged()
    onParentChanged: callButtonPassedChanged()

    function callButtonPassedChanged() {
        if (typeof parent.buttonPassedChanged === "function") {
            parent.buttonPassedChanged()
        }
    }

131
    function reset() {
132
        _manualState = manualText === "" ? _statePassed : _statePending
133
        if (telemetryFailure) {
134
            _telemetryState = allowTelemetryFailureOverride ? _statePending : _stateFailed
DonLakeFlyer's avatar
DonLakeFlyer committed
135
        } else {
136
            _telemetryState = _statePassed
DonLakeFlyer's avatar
DonLakeFlyer committed
137
        }
138
    }
DonLakeFlyer's avatar
DonLakeFlyer committed
139

140
}