Warning, /plasma/plasma-systemmonitor/src/faces/processtable/contents/ui/ProcessTableView.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.Layouts
0009 import QtQuick.Controls
0010 
0011 import Qt.labs.qmlmodels
0012 
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     property alias nameFilterString: rowFilter.filterString
0024     property alias processModel: processModel
0025     property alias viewMode: rowFilter.viewMode
0026     property bool flatList
0027 
0028     readonly property bool treeModeSupported: processModel.hasOwnProperty("flatList")
0029 
0030     property alias columnDisplay: displayModel.columnDisplay
0031     property var enabledColumns
0032     onEnabledColumnsChanged: processModel.updateEnabledAttributes()
0033 
0034     readonly property var selectedProcesses: {
0035         var result = []
0036         var rows = {}
0037 
0038         for (var i of selection.selectedIndexes) {
0039             if (rows[i.row] != undefined) {
0040                 continue
0041             }
0042 
0043             rows[i.row] = true
0044 
0045             var index = rowFilter.mapToSource(i)
0046 
0047             var item = {}
0048 
0049             item.name = processModel.data(processModel.index(index.row, processModel.nameColumn, index.parent), Process.ProcessDataModel.ValueRole)
0050             item.pid = processModel.data(processModel.index(index.row, processModel.pidColumn, index.parent), Process.ProcessDataModel.ValueRole)
0051             item.username = processModel.data(processModel.index(index.row, processModel.usernameColumn, index.parent), Process.ProcessDataModel.ValueRole)
0052 
0053             result.push(item)
0054         }
0055 
0056         return result
0057     }
0058 
0059     idRole: "Attribute"
0060 
0061     onSort: (column, order) => rowFilter.sort(column, order)
0062 
0063     model: Table.ProcessSortFilterModel {
0064         id: rowFilter
0065         sourceModel: cacheModel
0066         hiddenAttributes: processModel.hiddenSensors
0067     }
0068 
0069     Table.ComponentCacheProxyModel {
0070         id: cacheModel
0071         sourceModel: displayModel
0072 
0073         component: Charts.HistoryProxySource {
0074             id: history
0075             source: Charts.ModelSource {
0076                 model: history.Table.ComponentCacheProxyModel.model
0077                 column: history.Table.ComponentCacheProxyModel.column
0078                 roleName: "Value"
0079             }
0080             item: Table.ComponentCacheProxyModel.row
0081             maximumHistory: 10
0082             interval: 2000
0083             fillMode: Charts.HistoryProxySource.FillFromEnd
0084         }
0085     }
0086 
0087     Table.ColumnDisplayModel {
0088         id: displayModel
0089         sourceModel: processModel
0090         idRole: "Attribute"
0091     }
0092 
0093     // Temporary workaround to be able to run against Plasma 5.20,
0094     // which lacks the "flatList" property on ProcessDataModel. If
0095     // we assign it directly, the face will fail to load because
0096     // the property is missing. However, when using a Binding here
0097     // it will only produce a runtime warning.
0098     Binding {
0099         target: processModel
0100         property: "flatList"
0101         value: view.flatList
0102     }
0103 
0104     Process.ProcessDataModel {
0105         id: processModel
0106         onFlatListChanged:  Qt.callLater(view.view.expandRecursively, -1, -1)
0107 
0108         property int nameColumn
0109         property int pidColumn
0110         property int uidColumn
0111         property int usernameColumn
0112 
0113         property var requiredSensors: [
0114             "name",
0115             "pid",
0116             "uid",
0117             "username"
0118         ]
0119         property var hiddenSensors: []
0120 
0121         enabled: view.visible
0122 
0123         function updateEnabledAttributes() {
0124             var result = []
0125             for (let i of view.enabledColumns) {
0126                 if (processModel.availableAttributes.includes(i)) {
0127                     result.push(i)
0128                 }
0129             }
0130 
0131             var hidden = []
0132             for (let i of requiredSensors) {
0133                 if (result.indexOf(i) == -1 && processModel.availableAttributes.includes(i)) {
0134                     result.push(i)
0135                     hidden.push(i)
0136                 }
0137             }
0138 
0139             processModel.nameColumn = result.indexOf("name")
0140             processModel.pidColumn = result.indexOf("pid")
0141             processModel.uidColumn = result.indexOf("uid")
0142             processModel.usernameColumn = result.indexOf("username")
0143             processModel.hiddenSensors = hidden
0144             processModel.enabledAttributes = result
0145         }
0146     }
0147 
0148     delegate: DelegateChooser {
0149         role: "displayStyle"
0150         DelegateChoice {
0151             column: view.LayoutMirroring.enabled ? view.model.columnCount() - 1 : 0
0152             Table.FirstCellDelegate {
0153                 id: delegate
0154                 treeDecorationVisible: !view.flatList
0155                 iconName: {
0156                     var index = treeView.index(model.row, 0);
0157                     index = rowFilter.mapToSource(index)
0158                     index = cacheModel.mapToSource(index);
0159                     index = displayModel.mapToSource(index);
0160                     index = processModel.index(index.row, processModel.nameColumn, index.parent);
0161                     return processModel.data(index).split(" ")[0].toLowerCase();
0162                 }
0163             }
0164         }
0165         DelegateChoice {
0166             roleValue: "line"
0167             Table.LineChartCellDelegate {
0168                 valueSources: model.cachedComponent != undefined ? model.cachedComponent : []
0169                 maximum: rowFilter.data(treeView.index(model.row, model.column), Process.ProcessDataModel.Maximum)
0170             }
0171 
0172         }
0173         DelegateChoice {
0174             roleValue: "lineScaled"
0175             Table.LineChartCellDelegate {
0176                 valueSources: model.cachedComponent != undefined ? model.cachedComponent : []
0177                 maximum: rowFilter.data(treeView.index(model.row, model.column), Process.ProcessDataModel.Maximum)
0178                 text: Formatter.Formatter.formatValue(parseInt(model.Value) / model.Maximum * 100, model.Unit)
0179             }
0180 
0181         }
0182         DelegateChoice {
0183             roleValue: "textScaled"
0184             Table.TextCellDelegate {
0185                 text: Formatter.Formatter.formatValue(parseInt(model.Value) / model.Maximum * 100, model.Unit)
0186             }
0187         }
0188         DelegateChoice { Table.TextCellDelegate{} }
0189     }
0190 }