Skip to content
CustomCommandWidget.qml 4.71 KiB
Newer Older
/****************************************************************************
 *
 *   (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

import QtQuick                  2.3
import QtQuick.Controls         1.2
import QtQuick.Controls.Styles  1.4
dogmaphobic's avatar
dogmaphobic committed
import QtQuick.Dialogs          1.2

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

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

    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
        "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>"

    QGCPalette { id: qgcPal; colorGroupEnabled: enabled }

    CustomCommandWidgetController {
        id:         controller
        factPanel:  panel

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

    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

    QGCViewPanel {
        id:             panel
        anchors.fill:   parent
dogmaphobic's avatar
dogmaphobic committed
        Rectangle {
            anchors.fill:   parent
            color:          qgcPal.window
dogmaphobic's avatar
dogmaphobic committed
            Loader {
                id:                 loader
                anchors.margins:    _margins
                anchors.left:       parent.left
                anchors.right:      parent.right
                anchors.top:        parent.top
                anchors.bottom:     buttonRow.top
                visible:            false
dogmaphobic's avatar
dogmaphobic committed
                onStatusChanged: {
                    if (loader.status == Loader.Error) {
                        textOutput.text = sourceComponent.errorString()
                    } else if (loader.status == Loader.Ready) {
                        loader.visible = true
            ScrollView {
                id: scrollContainer
                anchors.fill:       loader
                contentItem: QGCLabel {
                    id:                 textOutput
                    width:              scrollContainer.width - _margins*2
                    wrapMode:           Text.WordWrap
                    textFormat:         Text.RichText
                    visible:            !loader.visible
                    onLinkActivated:    Qt.openUrlExternally(link)
                }
Don Gagne's avatar
Don Gagne committed
            Row {
dogmaphobic's avatar
dogmaphobic committed
                id:                 buttonRow
                spacing:            ScreenTools.defaultFontPixelWidth
                anchors.margins:    _margins
                anchors.bottom:     parent.bottom
                anchors.horizontalCenter: parent.horizontalCenter
Don Gagne's avatar
Don Gagne committed
                QGCButton {
                    text:       qsTr("Load Custom Qml file...")
dogmaphobic's avatar
dogmaphobic committed
                    width:      ScreenTools.defaultFontPixelWidth * 22
Don Gagne's avatar
Don Gagne committed
                    onClicked:  controller.selectQmlFile()
                }
Don Gagne's avatar
Don Gagne committed
                QGCButton {
                    text:       qsTr("Reset")
dogmaphobic's avatar
dogmaphobic committed
                    width:      ScreenTools.defaultFontPixelWidth * 22
                    onClicked:  controller.clearQmlFile()
Don Gagne's avatar
Don Gagne committed
        }
Don Gagne's avatar
Don Gagne committed
}