CustomCommandWidget.qml 4.73 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.
 *
 ****************************************************************************/
Don Gagne's avatar
Don Gagne committed
9

10 11
import QtQuick                  2.3
import QtQuick.Controls         1.2
12
import QtQuick.Controls.Styles  1.4
dogmaphobic's avatar
dogmaphobic committed
13 14
import QtQuick.Dialogs          1.2

15
import QGroundControl               1.0
dogmaphobic's avatar
dogmaphobic committed
16 17 18 19 20 21
import QGroundControl.Palette       1.0
import QGroundControl.Controls      1.0
import QGroundControl.Controllers   1.0
import QGroundControl.ScreenTools   1.0

QGCView {
22
    id:         qgcView
dogmaphobic's avatar
dogmaphobic committed
23 24
    viewPanel:  panel

25 26 27 28
    property var    _activeVehicle: QGroundControl.multiVehicleManager.parameterReadyVehicleAvailable ? QGroundControl.multiVehicleManager.activeVehicle : null
    property real   _margins:       ScreenTools.defaultFontPixelHeight
    property string _noVehicleText: qsTr("No vehicle connected")
    property string _assignQmlFile: "<p>" +
dogmaphobic's avatar
dogmaphobic committed
29 30 31 32 33 34 35 36
        "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>" +
37
        "<p>Example usage: <a href='https://dev.qgroundcontrol.com/en/tools/custom_command_widget.html'>https://dev.qgroundcontrol.com/en/tools/custom_command_widget.html</a></p>"
38 39 40 41 42 43 44 45 46

    QGCPalette { id: qgcPal; colorGroupEnabled: enabled }

    CustomCommandWidgetController {
        id:         controller
        factPanel:  panel

        onCustomQmlFileChanged: _updateLoader()
    }
dogmaphobic's avatar
dogmaphobic committed
47

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    Component.onCompleted: _updateLoader()

    on_ActiveVehicleChanged: _updateLoader()

    function _updateLoader() {
        loader.sourceComponent = undefined
        loader.visible = false
        textOutput.text = _noVehicleText
        if (_activeVehicle) {
            if (controller.customQmlFile == "") {
                textOutput.text = _assignQmlFile
            } else {
                loader.source = controller.customQmlFile
            }
        }
    }
dogmaphobic's avatar
dogmaphobic committed
64 65 66 67

    QGCViewPanel {
        id:             panel
        anchors.fill:   parent
68

dogmaphobic's avatar
dogmaphobic committed
69 70 71
        Rectangle {
            anchors.fill:   parent
            color:          qgcPal.window
72

dogmaphobic's avatar
dogmaphobic committed
73 74 75 76 77 78 79 80
            Loader {
                id:                 loader
                anchors.margins:    _margins
                anchors.left:       parent.left
                anchors.right:      parent.right
                anchors.top:        parent.top
                anchors.bottom:     buttonRow.top
                visible:            false
81

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

Don Gagne's avatar
Don Gagne committed
110
                QGCButton {
111
                    text:       qsTr("Load Custom Qml file...")
dogmaphobic's avatar
dogmaphobic committed
112
                    width:      ScreenTools.defaultFontPixelWidth * 22
Don Gagne's avatar
Don Gagne committed
113 114
                    onClicked:  controller.selectQmlFile()
                }
115

Don Gagne's avatar
Don Gagne committed
116
                QGCButton {
117
                    text:       qsTr("Reset")
dogmaphobic's avatar
dogmaphobic committed
118
                    width:      ScreenTools.defaultFontPixelWidth * 22
119
                    onClicked:  controller.clearQmlFile()
Don Gagne's avatar
Don Gagne committed
120 121
                }
            }
122

Don Gagne's avatar
Don Gagne committed
123
        }
124
    }
Don Gagne's avatar
Don Gagne committed
125
}