CustomCommandWidget.qml 4.44 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.3
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.4
import QtQuick.Dialogs 1.2
Don Gagne's avatar
Don Gagne committed
13

14 15 16 17 18
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
19 20

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

24 25
    property var _activeVehicle: QGroundControl.multiVehicleManager.parameterReadyVehicleAvailable ? QGroundControl.multiVehicleManager.activeVehicle : null
    property real _margins: ScreenTools.defaultFontPixelHeight
26
    property string _noVehicleText: qsTr("No vehicle connected")
27
    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>" + "<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>"
28

29 30 31 32
    QGCPalette {
        id: qgcPal
        colorGroupEnabled: enabled
    }
33 34

    CustomCommandWidgetController {
35 36
        id: controller
        factPanel: panel
37 38 39

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

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
    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
57 58

    QGCViewPanel {
59 60
        id: panel
        anchors.fill: parent
61

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

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

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

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

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