Warning, /plasma/plasma-systemmonitor/src/faces/applicationstable/contents/ui/ApplicationsTableView.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl>
0003 *
0004 * SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006
0007 import QtQuick
0008 import QtQuick.Controls
0009
0010 import Qt.labs.qmlmodels
0011
0012 import org.kde.kirigami as Kirigami
0013 import org.kde.kitemmodels as KItemModels
0014 import org.kde.quickcharts as Charts
0015
0016 import org.kde.ksysguard.formatter as Formatter
0017 import org.kde.ksysguard.process as Process
0018 import org.kde.ksysguard.table as Table
0019
0020 Table.BaseTableView {
0021 id: view
0022
0023 Kirigami.PlaceholderMessage {
0024 visible: !appModel.available
0025 anchors.fill: parent
0026 anchors.margins: Kirigami.Units.largeSpacing
0027 icon.name: "action-unavailable-symbolic"
0028 text: i18nc("Warning message shown on runtime error", "Applications view is unsupported on your system");
0029 }
0030
0031 property var enabledColumns: []
0032 property alias columnDisplay: displayModel.columnDisplay
0033 property alias sourceModel: appModel
0034
0035 property alias filterString: sortColumnFilter.filterString
0036
0037 property var selectedApplications: {
0038 var result = []
0039 var rows = {}
0040
0041 for (var i of selection.selectedIndexes) {
0042 if (rows[i.row] != undefined) {
0043 continue
0044 }
0045 rows[i.row] = true
0046
0047 var index = sortColumnFilter.mapToSource(i)
0048 var item = applicationInformation.createObject()
0049 item.index = index
0050 result.push(item)
0051 }
0052 return result
0053 }
0054
0055 property Component applicationInformation: ApplicationInformation {
0056 model: appModel
0057 sensorColumns: {
0058 "name": appModel.enabledAttributes.indexOf("appName"),
0059 "cpu": appModel.enabledAttributes.indexOf("usage"),
0060 "memory": appModel.enabledAttributes.indexOf("vmPSS"),
0061 "netInbound": appModel.enabledAttributes.indexOf("netInbound"),
0062 "netOutbound": appModel.enabledAttributes.indexOf("netOutbound"),
0063 "diskRead": appModel.enabledAttributes.indexOf("ioCharactersActuallyReadRate"),
0064 "diskWrite": appModel.enabledAttributes.indexOf("ioCharactersActuallyWrittenRate"),
0065 "iconName": appModel.enabledAttributes.indexOf("iconName")
0066 }
0067 role: Process.ProcessDataModel.Value
0068 pidsRole: Process.ProcessDataModel.PIDs
0069 cpuMode: displayModel.data(displayModel.index(0, appModel.enabledAttributes.indexOf("usage")), Table.ColumnDisplayModel.DisplayStyleRole)
0070 }
0071
0072 idRole: "Attribute"
0073
0074 columnWidths: [200, 100, 100, 100, 100]
0075
0076 onSort: (column, order) => {
0077 sortColumnFilter.sortColumn = column
0078 sortColumnFilter.sortOrder = order
0079 }
0080
0081 model: KItemModels.KSortFilterProxyModel {
0082 id: sortColumnFilter
0083
0084 sourceModel: cacheModel
0085 filterKeyColumn: appModel.nameColumn
0086 filterCaseSensitivity: Qt.CaseInsensitive
0087 filterColumnCallback: function(column, parent) {
0088 // Note: This assumes displayModel column == appModel column
0089 // This may not always hold, but we get incorrect results if we try to
0090 // map to source indices when the model is empty.
0091 var sensorId = appModel.enabledAttributes[column]
0092 if (appModel.hiddenAttributes.indexOf(sensorId) != -1) {
0093 return false
0094 }
0095 return true
0096 }
0097 filterRowCallback: function(row, parent) {
0098 if (filterString.length == 0) {
0099 return true
0100 }
0101 const name = sourceModel.data(sourceModel.index(row, filterKeyColumn, parent), filterRole).toLowerCase()
0102 const parts = filterString.toLowerCase().split(",").map(s => s.trim()).filter(s => s.length > 0)
0103 return parts.some(part => name.includes(part))
0104 }
0105
0106 sortRoleName: "Value"
0107
0108 }
0109
0110 Table.ComponentCacheProxyModel {
0111 id: cacheModel
0112 sourceModel: displayModel
0113
0114 component: Charts.HistoryProxySource {
0115 id: history
0116 source: Charts.ModelSource {
0117 model: history.Table.ComponentCacheProxyModel.model
0118 column: history.Table.ComponentCacheProxyModel.column
0119 roleName: "Value"
0120 }
0121 item: Table.ComponentCacheProxyModel.row
0122 maximumHistory: 10
0123 interval: 2000
0124 fillMode: Charts.HistoryProxySource.FillFromEnd
0125 }
0126 }
0127
0128 Table.ColumnDisplayModel {
0129 id: displayModel
0130 sourceModel: appModel
0131 idRole: "Attribute"
0132 }
0133
0134 Process.ApplicationDataModel {
0135 id: appModel
0136
0137 property int nameColumn: enabledAttributes.indexOf("appName")
0138 property int iconColumn: enabledAttributes.indexOf("iconName")
0139
0140 property var requiredAttributes: [
0141 "iconName",
0142 "appName",
0143 "usage",
0144 "vmPSS",
0145 "netInbound",
0146 "netOutbound",
0147 "ioCharactersActuallyReadRate",
0148 "ioCharactersActuallyWrittenRate",
0149 ]
0150 property var hiddenAttributes: []
0151
0152 enabled: view.visible
0153
0154 enabledAttributes: {
0155 var result = []
0156 for (let i of view.enabledColumns) {
0157 if (appModel.availableAttributes.includes(i)) {
0158 result.push(i)
0159 }
0160 }
0161
0162 var hidden = []
0163 for (let i of requiredAttributes) {
0164 if (result.indexOf(i) == -1) {
0165 result.push(i)
0166 hidden.push(i)
0167 }
0168 }
0169
0170 hiddenAttributes = hidden
0171 return result;
0172 }
0173
0174 Component.onCompleted: {
0175 if (!available) {
0176 console.error("Implementation matching https://systemd.io/DESKTOP_ENVIRONMENTS/ was not found. ApplicationsView will not be available")
0177 }
0178 }
0179 }
0180
0181 delegate: DelegateChooser {
0182 role: "displayStyle"
0183 DelegateChoice {
0184 column: view.LayoutMirroring.enabled ? view.model.columnCount() - 1 : 0
0185 Table.FirstCellDelegate {
0186 iconName: {
0187 var index = sortColumnFilter.mapToSource(sortColumnFilter.index(model.row, 0));
0188 index = appModel.index(index.row, appModel.iconColumn)
0189 return appModel.data(index)
0190 return ""
0191 }
0192 }
0193 }
0194 DelegateChoice {
0195 roleValue: "line"
0196 Table.LineChartCellDelegate {
0197 valueSources: model.cachedComponent != undefined ? model.cachedComponent : []
0198 maximum: sortColumnFilter.data(sortColumnFilter.index(model.row, model.column), Process.ProcessDataModel.Maximum)
0199 }
0200 }
0201 DelegateChoice {
0202 roleValue: "lineScaled"
0203 Table.LineChartCellDelegate {
0204 valueSources: model.cachedComponent != undefined ? model.cachedComponent : []
0205 maximum: sortColumnFilter.data(sortColumnFilter.index(model.row, model.column), Process.ProcessDataModel.Maximum)
0206 text: Formatter.Formatter.formatValue(parseInt(model.Value) / model.Maximum * 100, model.Unit)
0207 }
0208
0209 }
0210 DelegateChoice {
0211 roleValue: "textScaled"
0212 Table.TextCellDelegate {
0213 text: Formatter.Formatter.formatValue(parseInt(model.Value) / model.Maximum * 100, model.Unit)
0214 }
0215 }
0216 DelegateChoice { Table.TextCellDelegate { } }
0217 }
0218 }