AppMessages.qml 7.8 KB
Newer Older
1 2
/****************************************************************************
 *
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.
 *
 ****************************************************************************/
9

10 11
import QtQuick                  2.3
import QtQuick.Controls         1.2
12
import QtQuick.Controls.Styles  1.4
13
import QtQuick.Dialogs          1.2
14
import QtQuick.Layouts          1.12
15

16
import QGroundControl               1.0
17 18
import QGroundControl.Palette       1.0
import QGroundControl.Controls      1.0
19 20
import QGroundControl.FactSystem    1.0
import QGroundControl.FactControls  1.0
21 22 23
import QGroundControl.Controllers   1.0
import QGroundControl.ScreenTools   1.0

24 25
Item {
    id:         _root
Nate Weibley's avatar
Nate Weibley committed
26

27 28
    property bool loaded: false

29 30
    Component {
        id: filtersPopupDialog
DonLakeFlyer's avatar
DonLakeFlyer committed
31

32 33 34
        QGCPopupDialog {
            title:      qsTr("Turn on logging categories")
            buttons:    StandardButton.Close
35

36 37 38 39
            ColumnLayout {
                RowLayout {
                    spacing:            ScreenTools.defaultFontPixelHeight / 2
                    Layout.fillWidth:   true
40

41
                    QGCLabel { text: qsTr("Search:") }
42

43 44 45 46 47 48
                    QGCTextField {
                        id: searchText
                        text: ""
                        Layout.fillWidth: true
                        enabled: true
                    }
49

DonLakeFlyer's avatar
DonLakeFlyer committed
50
                    QGCButton {
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
                        text: qsTr("Clear")
                        onClicked: searchText.text = ""
                    }
                }

                QGCButton {
                    text: qsTr("Clear All")
                    onClicked: categoryRepeater.setAllLogs(false)
                }

                Repeater {
                    id:     categoryRepeater
                    model:  QGroundControl.loggingCategories()

                    function setAllLogs(value) {
                        var logCategories = QGroundControl.loggingCategories()
                        for (var category of logCategories) {
                            QGroundControl.setCategoryLoggingOn(category, value)
DonLakeFlyer's avatar
DonLakeFlyer committed
69
                        }
70 71 72 73
                        QGroundControl.updateLoggingFilterRules()
                        // Update model for repeater
                        categoryRepeater.model = undefined
                        categoryRepeater.model = QGroundControl.loggingCategories()
DonLakeFlyer's avatar
DonLakeFlyer committed
74 75
                    }

76 77 78 79 80 81 82
                    QGCCheckBox {
                        text:       modelData
                        visible:    searchText.text ? text.match(`(${searchText.text})`, "i") : true
                        checked:    QGroundControl.categoryLoggingOn(modelData)
                        onClicked:  {
                            QGroundControl.setCategoryLoggingOn(modelData, checked)
                            QGroundControl.updateLoggingFilterRules()
83 84
                        }
                    }
85 86
                }
            }
87 88
        }
    }
89

90
    Item {
91 92
        id:             panel
        anchors.fill:   parent
93 94

        Rectangle {
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
            id:              logwindow
            anchors.fill:    parent
            anchors.margins: ScreenTools.defaultFontPixelWidth
            color:           qgcPal.window

            Connections {
                target: debugMessageModel

                onDataChanged: {
                    // Keep the view in sync if the button is checked
                    if (loaded) {
                        if (followTail.checked) {
                            listview.positionViewAtEnd();
                        }
                    }
                }
111 112
            }

113 114 115 116 117 118 119
            Component {
                id: delegateItem
                Rectangle {
                    color:  index % 2 == 0 ? qgcPal.window : qgcPal.windowShade
                    height: Math.round(ScreenTools.defaultFontPixelHeight * 0.5 + field.height)
                    width:  listview.width

Don Gagne's avatar
Don Gagne committed
120 121 122 123 124
                    QGCLabel {
                        id:         field
                        text:       display
                        width:      parent.width
                        wrapMode:   Text.Wrap
125 126 127 128 129
                        anchors.verticalCenter: parent.verticalCenter
                    }
                }
            }

Don Gagne's avatar
Don Gagne committed
130
            QGCListView {
131 132 133 134 135 136 137 138 139 140 141 142 143 144
                Component.onCompleted: {
                    loaded = true
                }
                anchors.top:     parent.top
                anchors.left:    parent.left
                anchors.right:   parent.right
                anchors.bottom:  followTail.top
                anchors.bottomMargin: ScreenTools.defaultFontPixelWidth
                clip:            true
                id:              listview
                model:           debugMessageModel
                delegate:        delegateItem
            }

145
            QGCFileDialog {
146
                id:             writeDialog
147
                folder:         QGroundControl.settingsManager.appSettings.logSavePath
148 149 150
                nameFilters:    [qsTr("Log files (*.txt)"), qsTr("All Files (*)")]
                selectExisting: false
                title:          qsTr("Select log save file")
151
                onAcceptedForSave: {
DonLakeFlyer's avatar
DonLakeFlyer committed
152
                    debugMessageModel.writeMessages(file);
153 154 155 156 157 158 159 160 161 162 163 164 165 166
                    visible = false;
                }
            }

            Connections {
                target:          debugMessageModel
                onWriteStarted:  writeButton.enabled = false;
                onWriteFinished: writeButton.enabled = true;
            }

            QGCButton {
                id:              writeButton
                anchors.bottom:  parent.bottom
                anchors.left:    parent.left
167
                onClicked:       writeDialog.openForSave()
168 169 170
                text:            qsTr("Save App Log")
            }

171
            QGCLabel {
172 173 174 175 176 177
                id:                 gstLabel
                anchors.left:       writeButton.right
                anchors.leftMargin: ScreenTools.defaultFontPixelWidth
                anchors.baseline:   gstCombo.baseline
                text:               qsTr("GStreamer Debug")
                visible:            QGroundControl.settingsManager.appSettings.gstDebugLevel.visible
178 179 180
            }

            FactComboBox {
181 182 183 184 185 186 187 188
                id:                 gstCombo
                anchors.left:       gstLabel.right
                anchors.leftMargin: ScreenTools.defaultFontPixelWidth / 2
                anchors.bottom:     parent.bottom
                width:              ScreenTools.defaultFontPixelWidth * 10
                model:              ["Disabled", "1", "2", "3", "4", "5", "6", "7", "8"]
                fact:               QGroundControl.settingsManager.appSettings.gstDebugLevel
                visible:            QGroundControl.settingsManager.appSettings.gstDebugLevel.visible
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
            }

            QGCButton {
                id:                     followTail
                anchors.right:          filterButton.left
                anchors.rightMargin:    ScreenTools.defaultFontPixelWidth
                anchors.bottom:         parent.bottom
                text:                   qsTr("Show Latest")
                checkable:              true
                checked:                true

                onCheckedChanged: {
                    if (checked && loaded) {
                        listview.positionViewAtEnd();
                    }
                }
            }

            QGCButton {
                id:             filterButton
                anchors.bottom: parent.bottom
                anchors.right:  parent.right
211
                text:           qsTr("Set Logging")
212
                onClicked:      mainWindow.showPopupDialogFromComponent(filtersPopupDialog)
213 214
            }
        }
215 216
    }
}
217