MavlinkConsolePage.qml 4.47 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 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

import QtQuick          2.3
import QtQuick.Controls 1.2
import QtQuick.Dialogs  1.2
import QtQuick.Layouts      1.2

import QGroundControl               1.0
import QGroundControl.Palette       1.0
import QGroundControl.FactSystem    1.0
import QGroundControl.FactControls  1.0
import QGroundControl.Controls      1.0
import QGroundControl.ScreenTools   1.0
import QGroundControl.Controllers   1.0

AnalyzePage {
24 25 26 27 28
    id:              mavlinkConsolePage
    pageComponent:   pageComponent
    pageName:        qsTr("Mavlink Console")
    pageDescription: qsTr("Mavlink Console provides a connection to the vehicle's system shell.")

29
    property bool isLoaded: false
30

Stefan Dunca's avatar
Stefan Dunca committed
31 32 33 34
    MavlinkConsoleController {
        id: conController
    }

35 36 37 38 39 40 41 42
    Component {
        id: pageComponent

        ColumnLayout {
            id:     consoleColumn
            height: availableHeight
            width:  availableWidth

43 44 45 46 47
            Connections {
                target: conController

                onDataChanged: {
                    // Keep the view in sync if the button is checked
48
                    if (isLoaded) {
49 50 51 52 53 54 55 56 57 58 59
                        if (followTail.checked) {
                            listview.positionViewAtEnd();
                        }
                    }
                }
            }

            Component {
                id: delegateItem
                Rectangle {
                    color:  qgcPal.windowShade
60
                    height: Math.round(ScreenTools.defaultFontPixelHeight * 0.1 + field.height)
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
                    width:  listview.width

                    QGCLabel {
                        id:          field
                        text:        display
                        width:       parent.width
                        wrapMode:    Text.NoWrap
                        font.family: ScreenTools.fixedFontFamily
                        anchors.verticalCenter: parent.verticalCenter
                    }
                }
            }

            QGCListView {
                Component.onCompleted: {
76
                    isLoaded = true
77
                }
78
                Layout.fillHeight: true
79
                Layout.fillWidth:  true
80 81 82 83
                clip:              true
                id:                listview
                model:             conController
                delegate:          delegateItem
84

85 86 87 88
                // Unsync the view if the user interacts
                onMovementStarted: {
                    followTail.checked = false
                }
89 90
            }

91
            RowLayout {
92
                Layout.fillWidth:   true
93 94 95 96
                QGCTextField {
                    id:               command
                    Layout.fillWidth: true
                    placeholderText:  "Enter Commands here..."
Stefan Dunca's avatar
Stefan Dunca committed
97
                    inputMethodHints: Qt.ImhNoAutoUppercase
98 99

                    function sendCommand() {
100 101 102
                        conController.sendCommand(text)
                        text = ""
                    }
103 104
                    onAccepted: sendCommand()

105
                    Keys.onPressed: {
Stefan Dunca's avatar
Stefan Dunca committed
106
                        if (event.key === Qt.Key_Up) {
107 108
                            text = conController.historyUp(text);
                            event.accepted = true;
Stefan Dunca's avatar
Stefan Dunca committed
109
                        } else if (event.key === Qt.Key_Down) {
110 111 112 113
                            text = conController.historyDown(text);
                            event.accepted = true;
                        }
                    }
114 115
                }

116 117 118 119 120 121 122 123
                QGCButton {
                    id:        sendButton
                    text:      qsTr("Send")
                    visible:   ScreenTools.isMobile

                    onClicked: command.sendCommand()
                }

124 125 126 127 128
                QGCButton {
                    id:        followTail
                    text:      qsTr("Show Latest")
                    checkable: true
                    checked:   true
129

130
                    onCheckedChanged: {
131
                        if (checked && isLoaded) {
132 133 134
                            listview.positionViewAtEnd();
                        }
                    }
135 136 137 138 139
                }
            }
        }
    } // Component
} // AnalyzePage