Warning, /plasma/plasma-systemmonitor/src/faces/applicationstable/contents/ui/ApplicationDetails.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 import QtQuick.Layouts
0010 
0011 import Qt.labs.qmlmodels
0012 
0013 import org.kde.kirigami as Kirigami
0014 
0015 import org.kde.quickcharts as Charts
0016 
0017 import org.kde.ksysguard.formatter as Formatter
0018 import org.kde.ksysguard.process as Process
0019 import org.kde.ksysguard.sensors as Sensors
0020 import org.kde.ksysguard.table as Table
0021 
0022 Page {
0023     id: root
0024 
0025     property var applications: []
0026 
0027     readonly property var firstApplication: applications.length > 0 ? applications[0] : null
0028 
0029     property real headerHeight: Kirigami.Units.gridUnit
0030 
0031     signal close()
0032 
0033     Kirigami.Theme.colorSet: Kirigami.Theme.View
0034 
0035     background: Rectangle {
0036         Kirigami.Theme.inherit: false
0037         Kirigami.Theme.colorSet: Kirigami.Theme.View
0038         color: Kirigami.Theme.backgroundColor
0039     }
0040 
0041     header: ToolBar {
0042         implicitHeight: root.headerHeight
0043         Kirigami.Theme.inherit: false
0044         Kirigami.Theme.colorSet: Kirigami.Theme.Window
0045 
0046         Label {
0047             anchors.left: parent.left
0048             text: i18nc("@title:window", "Details")
0049         }
0050 
0051         ToolButton {
0052             anchors.right: parent.right
0053             anchors.verticalCenter: parent.verticalCenter
0054             height: Math.min(root.headerHeight, implicitHeight)
0055             width: height
0056             icon.name: "dialog-close"
0057             onClicked: root.close()
0058         }
0059     }
0060 
0061     ColumnLayout {
0062         visible: root.firstApplication != null
0063 
0064         anchors {
0065             fill: parent
0066             leftMargin: Kirigami.Units.largeSpacing
0067             rightMargin: Kirigami.Units.largeSpacing
0068             topMargin: Kirigami.Units.smallSpacing
0069         }
0070 
0071         Label {
0072             text: i18nc("@title:group", "CPU")
0073         }
0074 
0075         LineChartCard {
0076             Layout.fillHeight: false
0077             Layout.preferredHeight: Kirigami.Units.gridUnit * 3
0078 
0079             yRange {
0080                 from: 0;
0081                 to: {
0082                     if (!root.firstApplication) {
0083                         return 100
0084                     }
0085 
0086                     let mode = root.firstApplication.cpuMode
0087                     if (mode === "lineScaled" || mode === "textScaled") {
0088                         return 100
0089                     } else {
0090                         return 100 * cpuCountSensor.value
0091                     }
0092                 }
0093                 automatic: false
0094             }
0095             xRange { from: 0; to: 50 }
0096             unit: Formatter.Units.UnitPercent
0097 
0098             colorSource: Charts.SingleValueSource { value: Kirigami.Theme.negativeTextColor }
0099             valueSources: [
0100                 Charts.HistoryProxySource {
0101                     id: cpuHistory
0102                     source: Charts.SingleValueSource {
0103                         value: {
0104                             if (!root.firstApplication) {
0105                                 return
0106                             }
0107 
0108                             let mode = root.firstApplication.cpuMode
0109                             if (mode === "lineScaled" || mode === "textScaled") {
0110                                 return root.firstApplication.cpu / cpuCountSensor.value
0111                             } else {
0112                                 return root.firstApplication.cpu
0113                             }
0114                         }
0115                     }
0116                     maximumHistory: 50
0117                     interval: 2000
0118                 }
0119             ]
0120 
0121             Sensors.Sensor { id: cpuCountSensor; sensorId: "cpu/all/coreCount" }
0122         }
0123         Label {
0124             text: i18nc("@title:group", "Memory")
0125         }
0126         LineChartCard {
0127             Layout.fillHeight: false
0128             Layout.preferredHeight: Kirigami.Units.gridUnit * 3
0129 
0130             yRange { from: 0; to: totalMemorySensor.value ? totalMemorySensor.value : 0; automatic: false }
0131             xRange { from: 0; to: 50 }
0132             unit: totalMemorySensor.unit
0133 
0134             colorSource: Charts.SingleValueSource { value: Kirigami.Theme.positiveTextColor }
0135             valueSources: [
0136                 Charts.HistoryProxySource {
0137                     id: memoryHistory
0138                     source: Charts.SingleValueSource {
0139                         // ProcessDataModel memory is in KiB but our y range is in B so convert memory correctly.
0140                         value: root.firstApplication ? root.firstApplication.memory * 1024 : 0
0141                     }
0142                     maximumHistory: 50
0143                     interval: 2000
0144                 }
0145             ]
0146 
0147             Sensors.Sensor { id: totalMemorySensor; sensorId: "memory/physical/total" }
0148         }
0149         Label {
0150             text: i18nc("@title:group", "Network")
0151         }
0152         LineChartCard {
0153             Layout.fillHeight: false
0154             Layout.preferredHeight: Kirigami.Units.gridUnit * 3
0155 
0156             xRange { from: 0; to: 50 }
0157             unit: Formatter.Units.UnitByteRate
0158 
0159             valueSources: [
0160                 Charts.HistoryProxySource {
0161                     id: netInboundHistory
0162                     source: Charts.SingleValueSource { value: root.firstApplication ? root.firstApplication.netInbound : 0; }
0163                     maximumHistory: 50
0164                     interval: 2000
0165                 },
0166                 Charts.HistoryProxySource {
0167                     id: netOutboundHistory
0168                     source: Charts.SingleValueSource { value: root.firstApplication ? root.firstApplication.netOutbound : 0; }
0169                     maximumHistory: 50
0170                     interval: 2000
0171                 }
0172             ]
0173         }
0174         Label {
0175             text: i18nc("@title:group", "Disk")
0176         }
0177         LineChartCard {
0178             Layout.fillHeight: false
0179             Layout.preferredHeight: Kirigami.Units.gridUnit * 3
0180 
0181             xRange { from: 0; to: 50 }
0182             unit: Formatter.Units.UnitByteRate
0183 
0184             valueSources: [
0185                 Charts.HistoryProxySource {
0186                     id: diskReadHistory
0187                     source: Charts.SingleValueSource { value: root.firstApplication ? root.firstApplication.diskRead : 0; }
0188                     maximumHistory: 50
0189                     interval: 2000
0190                 },
0191                 Charts.HistoryProxySource {
0192                     id: diskWriteHistory
0193                     source: Charts.SingleValueSource { value: root.firstApplication ? root.firstApplication.diskWrite : 0; }
0194                     maximumHistory: 50
0195                     interval: 2000
0196                 }
0197             ]
0198         }
0199 
0200         Label {
0201             text: i18nc("@title:group", "Processes: %1", processTable.rows || " ")
0202         }
0203 
0204         Rectangle {
0205             Layout.fillWidth: true
0206             Layout.fillHeight: true
0207             Layout.leftMargin: -Kirigami.Units.largeSpacing;
0208             Layout.rightMargin: -Kirigami.Units.largeSpacing;
0209 
0210             color: Kirigami.Theme.backgroundColor
0211             Kirigami.Theme.colorSet: Kirigami.Theme.View
0212 
0213             Table.BaseTableView {
0214                 id: processTable
0215 
0216                 anchors.fill: parent
0217 
0218                 columnWidths: [0.5, 0.25, 0.25]
0219                 sortName: processModel.enabledAttributes.includes(controller.faceConfiguration.sortColumn) ? controller.faceConfiguration.sortColumn : "vmPSS"
0220                 sortOrder: controller.faceConfiguration.sortDirection
0221                 onSort: (column, order) => sortFilter.sort(column, order)
0222 
0223                 model: Table.ProcessSortFilterModel {
0224                     id: sortFilter
0225                     sourceModel: processModel
0226                     hiddenAttributes: ["pid"]
0227                     filterPids: root.firstApplication ? root.firstApplication.pids : []
0228                 }
0229 
0230                 Process.ProcessDataModel {
0231                     id: processModel
0232 
0233                     enabled: root.visible && root.firstApplication != null
0234 
0235                     enabledAttributes: [
0236                         "name",
0237                         "usage",
0238                         "vmPSS",
0239                         "pid",
0240                     ]
0241                 }
0242 
0243                 delegate: DelegateChooser {
0244                     role: "Attribute"
0245                     DelegateChoice {
0246                         roleValue: "usage"
0247                         Table.TextCellDelegate {
0248                             text: Formatter.Formatter.formatValue(parseInt(model.Value) / model.Maximum * 100, model.Unit)
0249                         }
0250                     }
0251                     DelegateChoice { Table.TextCellDelegate { } }
0252                 }
0253             }
0254 
0255             Kirigami.Separator { anchors.bottom: processTable.top; width: parent.width }
0256         }
0257     }
0258 
0259     Kirigami.PlaceholderMessage {
0260         anchors.fill: parent
0261         anchors.margins: Kirigami.Units.largeSpacing * 2
0262         text: i18nc("@info:placeholder", "Select an application to see its details")
0263         visible: root.firstApplication == null
0264     }
0265 
0266     onApplicationsChanged: {
0267         cpuHistory.clear()
0268         memoryHistory.clear()
0269         netInboundHistory.clear()
0270         netOutboundHistory.clear()
0271         diskReadHistory.clear()
0272         diskWriteHistory.clear()
0273     }
0274     onFirstApplicationChanged: {
0275         sortFilter.invalidate()
0276     }
0277 }