2import QGroundControl.Controls
3import QGroundControl.Logging
10 readonly property var _logLevelNames: LogManager.categoryLogLevelNames()
11 readonly property var _logLevelValues: LogManager.categoryLogLevelValues()
12 readonly property var _flatModel: QGCLoggingCategoryManager.flatModel
13 readonly property var _filteredModel: QGCLoggingCategoryManager.filteredFlatModel
16 title: qsTr("Logging Categories")
21 colorGroupEnabled: enabled
25 width: maxContentAvailableWidth
28 Layout.fillWidth: true
29 heading: qsTr("Search")
32 Layout.fillWidth: true
33 spacing: ScreenTools.defaultFontPixelHeight / 2
38 Layout.fillWidth: true
39 placeholderText: qsTr("Filter categories…")
41 onTextChanged: QGCLoggingCategoryManager.setFilterText(text)
47 onClicked: searchText.text = ""
53 Layout.fillWidth: true
54 heading: qsTr("Active Categories")
60 required property bool enabled
61 required property string fullName
62 required property int logLevel
64 Layout.fillWidth: true
65 text: fullName + " (" + (_logLevelNames[_logLevelValues.indexOf(logLevel)] ?? qsTr("Warning")) + ")"
71 text: qsTr("Reset All")
73 onClicked: QGCLoggingCategoryManager.disableAllCategories()
77 // Tree view (no search)
79 Layout.fillWidth: true
80 heading: qsTr("Categories")
81 visible: searchText.text === ""
86 readonly property real _rowHeight: ScreenTools.defaultFontPixelHeight * 2.2
88 Layout.fillWidth: true
89 Layout.maximumHeight: ScreenTools.defaultFontPixelHeight * 40
90 Layout.preferredHeight: contentHeight > 0 ? Math.min(contentHeight, ScreenTools.defaultFontPixelHeight * 40)
91 : ScreenTools.defaultFontPixelHeight * 30
93 model: QGCLoggingCategoryManager.treeModel
98 readonly property real _indent: ScreenTools.defaultFontPixelWidth * 1.5
100 implicitHeight: treeView._rowHeight
101 implicitWidth: treeView.width
103 required property int depth
104 required property bool expanded
105 required property string fullName
106 required property bool hasChildren
107 required property int logLevel
108 required property int row
109 required property string shortName
110 required property TreeView treeView
114 anchors.leftMargin: treeDelegate.depth * treeDelegate._indent
115 spacing: ScreenTools.defaultFontPixelWidth * 0.5
118 text: treeDelegate.expanded ? "\u25BE" : "\u25B8"
119 visible: treeDelegate.hasChildren
123 anchors.margins: -ScreenTools.defaultFontPixelWidth
125 onClicked: treeView.toggleExpanded(treeDelegate.row)
129 // Spacer when no expand arrow
131 implicitWidth: ScreenTools.defaultFontPixelWidth
132 visible: !treeDelegate.hasChildren
136 Layout.fillWidth: true
137 elide: Text.ElideRight
138 text: treeDelegate.shortName
142 currentIndex: _logLevelValues.indexOf(treeDelegate.logLevel)
143 model: _logLevelNames
146 onActivated: idx => {
147 const modelIndex = treeView.index(treeDelegate.row, 0);
148 treeView.model.setData(modelIndex, _logLevelValues[idx], LoggingCategoryTreeModel.LogLevelRole);
154 Component.onCompleted: _delayedExpand.start()
159 onTriggered: treeView.expandRecursively(-1, -1)
164 color: qgcPal.colorGrey
165 text: qsTr("No categories registered")
166 visible: treeView.rows === 0
170 // Flat filtered view (with search)
171 SettingsGroupLayout {
172 Layout.fillWidth: true
173 heading: qsTr("Search Results")
174 visible: searchText.text !== ""
179 model: _filteredModel
182 required property string fullName
183 required property int index
184 required property int logLevel
186 Layout.fillWidth: true
189 Layout.fillWidth: true
194 currentIndex: _logLevelValues.indexOf(logLevel)
195 model: _logLevelNames
198 onActivated: idx => {
199 const sourceIndex = _filteredModel.mapToSource(_filteredModel.index(parent.index, 0));
200 _flatModel.setData(sourceIndex, _logLevelValues[idx], LoggingCategoryFlatModel.LogLevelRole);
207 color: qgcPal.colorGrey
208 text: qsTr("No matching categories")
209 visible: searchRepeater.count === 0 && searchText.text !== ""