CustomCommandWidget.qml 4.68 KB
Newer Older
1 2
/****************************************************************************
 *
Gus Grubba's avatar
Gus Grubba committed
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
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.
 *
 ****************************************************************************/
Don Gagne's avatar
Don Gagne committed
9

10 11 12 13 14 15 16 17 18 19
import QtQuick                  2.3
import QtQuick.Controls         1.2
import QtQuick.Controls.Styles  1.4
import QtQuick.Dialogs          1.2

import QGroundControl               1.0
import QGroundControl.Palette       1.0
import QGroundControl.Controls      1.0
import QGroundControl.Controllers   1.0
import QGroundControl.ScreenTools   1.0
dogmaphobic's avatar
dogmaphobic committed
20

21
Item {
dogmaphobic's avatar
dogmaphobic committed
22

23 24
    property var    _activeVehicle: QGroundControl.multiVehicleManager.parameterReadyVehicleAvailable ? QGroundControl.multiVehicleManager.activeVehicle : null
    property real   _margins:       ScreenTools.defaultFontPixelHeight
25
    property string _noVehicleText: qsTr("No vehicle connected")
26 27 28 29 30 31 32 33 34
    property string _assignQmlFile: "<p>" +
        "You can create your own commands and parameter editing user interface in this widget. " +
        "You do this by providing your own Qml file. " +
        "This support is a work in progress and the details may change somewhat in the future. " +
        "By using this feature you are connecting directly to the internals of QGroundControl. " +
        "Doing so incorrectly may cause instability both in QGroundControl and/or your vehicle. " +
        "So make sure to test your changes thoroughly before using them in flight.</p>" +
        "<p>Click 'Load Custom Qml file' to provide your custom qml file.</p>" +
        "<p>Click 'Reset' to reset to none.</p>" +
35
        "<p>Example usage: <a href='https://docs.qgroundcontrol.com/en/app_menu/custom_command_widget.html'>https://docs.qgroundcontrol.com/en/app_menu/custom_command_widget.html</a></p>"
36

37
    QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
38 39

    CustomCommandWidgetController {
40
        id:         controller
41 42
        onCustomQmlFileChanged: _updateLoader()
    }
dogmaphobic's avatar
dogmaphobic committed
43

44 45 46 47 48 49 50 51 52
    Component.onCompleted: _updateLoader()

    on_ActiveVehicleChanged: _updateLoader()

    function _updateLoader() {
        loader.sourceComponent = undefined
        loader.visible = false
        textOutput.text = _noVehicleText
        if (_activeVehicle) {
Gus Grubba's avatar
Gus Grubba committed
53
            if (controller.customQmlFile === "") {
54 55 56 57 58 59
                textOutput.text = _assignQmlFile
            } else {
                loader.source = controller.customQmlFile
            }
        }
    }
dogmaphobic's avatar
dogmaphobic committed
60

61
    Item {
62
        anchors.fill:   parent
63

dogmaphobic's avatar
dogmaphobic committed
64
        Rectangle {
65 66
            anchors.fill:   parent
            color:          qgcPal.window
67

dogmaphobic's avatar
dogmaphobic committed
68
            Loader {
69 70 71 72 73 74 75
                id:                 loader
                anchors.margins:    _margins
                anchors.left:       parent.left
                anchors.right:      parent.right
                anchors.top:        parent.top
                anchors.bottom:     buttonRow.top
                visible:            false
76

dogmaphobic's avatar
dogmaphobic committed
77 78
                onStatusChanged: {
                    if (loader.status == Loader.Error) {
79 80 81
                        textOutput.text = sourceComponent.errorString()
                    } else if (loader.status == Loader.Ready) {
                        loader.visible = true
Don Gagne's avatar
Don Gagne committed
82 83 84
                    }
                }
            }
mak's avatar
mak committed
85 86
            QGCFlickable {
                id: container
87 88
                anchors.fill:       loader
                contentHeight:      textOutput.height
89
                flickableDirection: QGCFlickable.VerticalFlick
90
                visible:            !loader.visible
mak's avatar
mak committed
91
                QGCLabel {
92 93 94 95 96
                    id:                 textOutput
                    width:              container.width
                    wrapMode:           Text.WordWrap
                    textFormat:         Text.RichText
                    onLinkActivated:    Qt.openUrlExternally(link)
97
                }
98
            }
Don Gagne's avatar
Don Gagne committed
99
            Row {
100 101 102 103
                id:                 buttonRow
                spacing:            ScreenTools.defaultFontPixelWidth
                anchors.margins:    _margins
                anchors.bottom:     parent.bottom
dogmaphobic's avatar
dogmaphobic committed
104
                anchors.horizontalCenter: parent.horizontalCenter
105

Don Gagne's avatar
Don Gagne committed
106
                QGCButton {
107 108 109
                    text:       qsTr("Load Custom Qml file...")
                    width:      ScreenTools.defaultFontPixelWidth * 22
                    onClicked:  controller.selectQmlFile()
Don Gagne's avatar
Don Gagne committed
110
                }
111

Don Gagne's avatar
Don Gagne committed
112
                QGCButton {
113 114 115
                    text:       qsTr("Reset")
                    width:      ScreenTools.defaultFontPixelWidth * 22
                    onClicked:  controller.clearQmlFile()
Don Gagne's avatar
Don Gagne committed
116 117
                }
            }
118

Don Gagne's avatar
Don Gagne committed
119
        }
120
    }
Don Gagne's avatar
Don Gagne committed
121
}