punktdateien/kde/plasma/plasmoids/com.softtechok.processmonitor/contents/ui/FullRepresentation.qml
2024-02-14 21:14:16 +01:00

444 lines
15 KiB
QML

/*
* Copyright 2023 Barry Strong <bstrong@softtechok.com>
*
* This file is part of Process Monitor Plasmoid
*
* Process Monitor Plasmoid is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Process Monitor Plasmoid is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with System Monitor Plasmoid. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick 2.5
import QtQuick.Layouts 1.0
import org.kde.plasma.components 2.0 as PlasmaComponents
import Processes 1.0
Rectangle {
id: viewPort
color: "transparent"
radius: 3;
property var numClkTicks
property var rowWidth
property var rowHeight
property var hdrHeight
property var disHeight
property font listFont
property font hdrFont
property var colSpacing: 5
property var rowSpacing: 0
property var numColumns
property font sysFont: pinfo.getSystemFont()
border {
property color borderColor: theme.textColor
color: Qt.hsla(borderColor.hslHue,
borderColor.hslSaturation,
borderColor.hslLightness, .5)
width: plasmoid.configuration.showBorders ? 1 : 0
}
TextMetrics {
id: listSize
font: listFont
text: ""
}
TextMetrics {
id: hdrSize
font: hdrFont
text: ""
}
Component {
id: listHeader;
Row {
spacing: colSpacing
property font hdrFont: listFont
Component {
id: hdrText
PlasmaComponents.Label {
font: hdrFont
height: text.paintedHeight
text: hdrValue
}
}
Loader {
property var hdrValue: "Name "
sourceComponent: plasmoid.configuration.showName ? hdrText : undefined
}
Loader {
property var hdrValue: " PID"
sourceComponent: plasmoid.configuration.showPID ? hdrText : undefined
}
Loader {
property var hdrValue: " CPU"
sourceComponent: plasmoid.configuration.showCPU ||
plasmoid.configuration.sortbyCPU ? hdrText : undefined
}
Loader {
property var hdrValue: " Memory"
sourceComponent: plasmoid.configuration.showMem ||
plasmoid.configuration.sortbyMem ? hdrText : undefined
}
Loader {
property var hdrValue: " Read"
sourceComponent: plasmoid.configuration.showIOReads ||
plasmoid.configuration.sortbyIOReads ? hdrText : undefined
}
Loader {
property var hdrValue: " Write"
sourceComponent: plasmoid.configuration.showIOWrites ||
plasmoid.configuration.sortbyIOWrites ? hdrText : undefined
}
}
}
Component {
id: listItem
Row {
spacing: colSpacing
property font itemFont: listFont
Component {
id: colItem
PlasmaComponents.Label {
font: itemFont
height: text.paintedHeight
text: itmValue
}
}
Loader {
property var itmValue: name
sourceComponent: plasmoid.configuration.showName ? colItem : undefined
}
Loader {
property var itmValue: pid
sourceComponent: plasmoid.configuration.showPID ? colItem : undefined
}
Loader {
property var itmValue: cpu
sourceComponent: plasmoid.configuration.showCPU ||
plasmoid.configuration.sortbyCPU? colItem : undefined
}
Loader {
property var itmValue: mem
sourceComponent: plasmoid.configuration.showMem ||
plasmoid.configuration.sortbyMem? colItem : undefined
}
Loader {
property var itmValue: ior
sourceComponent: plasmoid.configuration.showIOReads ||
plasmoid.configuration.sortbyIOReads? colItem : undefined
}
Loader {
property var itmValue: iow
sourceComponent: plasmoid.configuration.showIOWrites ||
plasmoid.configuration.sortbyIOWrites? colItem : undefined
}
}
}
ListView {
id: procView
anchors.fill: parent
width: parent.width
height: parent.height
anchors.leftMargin: viewPort.border.width * 4
anchors.topMargin: viewPort.border.width
interactive: false
clip: true
spacing: rowSpacing
model: procModel
}
ListModel {
id: procModel
}
PInfo {
id: pinfo
}
Timer {
id: updTimer
interval: plasmoid.configuration.updateInterval * 100
running: true
repeat: true
onTriggered: {
pinfo.updateProcesses();
}
}
function checkWidth() {
var spacingWrk
if (numColumns > 0) {
spacingWrk = (width - rowWidth) / numColumns;
colSpacing = spacingWrk + 5;
} else {
colSpacing = 5;
}
procView.anchors.leftMargin = viewPort.border.width * 4;
}
function checkHeight() {
var spacingWrk
if (plasmoid.configuration.numProcesses > 1) {
spacingWrk = (height - disHeight) / (plasmoid.configuration.numProcesses - 1);
rowSpacing = spacingWrk;
if (spacingWrk < 0)
rowSpacing = 0;
} else {
rowSpacing = 0;
}
procView.anchors.topMargin = viewPort.border.width;
}
onWidthChanged: {
checkWidth();
}
onHeightChanged: {
checkHeight();
}
function setWidth() {
numColumns = 0;
listSize.text = "";
if (plasmoid.configuration.showName) {
listSize.text += "Name ";
numColumns += 1
}
if (plasmoid.configuration.showPID) {
listSize.text += " PID";
numColumns += 1
}
if (plasmoid.configuration.showCPU || plasmoid.configuration.sortbyCPU) {
listSize.text += " CPU";
numColumns += 1
}
if (plasmoid.configuration.showMem || plasmoid.configuration.sortbyMem) {
listSize.text += " Memory";
numColumns += 1
}
if (plasmoid.configuration.showIOReads || plasmoid.configuration.sortbyIOReads) {
listSize.text += " Read";
numColumns += 1
}
if (plasmoid.configuration.showIOWrites || plasmoid.configuration.sortbyIOWrites) {
listSize.text += " Write";
numColumns += 1
}
numColumns -= 1;
rowHeight = Math.ceil(listSize.height);
if (plasmoid.configuration.boldHeaders) {
hdrFont = listFont;
hdrFont.bold = true;
hdrSize.font = hdrFont;
hdrSize.text = listSize.text;
hdrHeight = Math.ceil(hdrSize.height);
rowWidth = Math.ceil(hdrSize.advanceWidth);
} else {
hdrHeight = rowHeight;
rowWidth = Math.ceil(listSize.advanceWidth);
}
rowWidth += (numColumns * 5) + (viewPort.border.width * 8);
if (rowWidth <= width)
checkWidth();
viewPort.Layout.minimumWidth = rowWidth;
viewPort.Layout.preferredWidth = rowWidth;
}
function setHeight() {
disHeight = rowHeight * plasmoid.configuration.numProcesses;
disHeight += (viewPort.border.width * 2);
if (plasmoid.configuration.showHeaders) {
disHeight += hdrHeight;
}
if (disHeight <= height)
checkHeight();
viewPort.Layout.minimumHeight = disHeight;
viewPort.Layout.preferredHeight = disHeight;
}
function setHdr() {
if (procView.header != null)
procView.header = null;
setWidth();
if (plasmoid.configuration.showHeaders) {
procView.header = listHeader;
procView.headerItem.hdrFont.bold = plasmoid.configuration.boldHeaders;
}
}
function setList() {
if (procView.delegate != null)
procView.delegate = null;
procView.delegate = listItem;
setHdr();
}
function getSortField() {
if (plasmoid.configuration.sortbyCPU) return 1;
if (plasmoid.configuration.sortbyMem) return 2;
if (plasmoid.configuration.sortbyIOReads) return 3;
if (plasmoid.configuration.sortbyIOWrites) return 4;
}
function getWitchProcs() {
if (plasmoid.configuration.ownProcs) return 0;
if (plasmoid.configuration.userProcs) return 1;
if (plasmoid.configuration.systemProcs) return 2;
if (plasmoid.configuration.allProcs) return 3;
}
function setFastMem() {
pinfo.setFastMem(!(plasmoid.configuration.sortbyMem || plasmoid.configuration.showMem));
}
Connections {
target: plasmoid.configuration
function onNumProcessesChanged() {
procModel.clear();
pinfo.setNumProcesses(plasmoid.configuration.numProcesses);
setHeight();
}
function onShowNameChanged() {
setList();
}
function onShowPIDChanged() {
setList();
}
function onShowCPUChanged() {
if (!plasmoid.configuration.sortbyCPU)
setList();
}
function onShowMemChanged() {
if (!plasmoid.configuration.sortbyMem) {
setFastMem();
setList();
}
}
function onShowIOReadsChanged() {
if (!plasmoid.configuration.sortbyIOReads)
setList();
}
function onShowIOWritesChanged() {
if (!plasmoid.configuration.sortbyIOWrites)
setList();
}
function onSortbyCPUChanged() {
if (plasmoid.configuration.sortbyCPU)
pinfo.setSortField(getSortField());
if (!plasmoid.configuration.showCPU)
setList();
}
function onSortbyMemChanged() {
if (plasmoid.configuration.sortbyMem)
pinfo.setSortField(getSortField());
if (!plasmoid.configuration.showMem) {
setFastMem();
setList();
}
}
function onSortbyIOReadsChanged() {
if (plasmoid.configuration.sortbyIOReads)
pinfo.setSortField(getSortField());
if (!plasmoid.configuration.showIOReads)
setList();
}
function onSortbyIOWritesChanged() {
if (plasmoid.configuration.sortbyIOWrites)
pinfo.setSortField(getSortField());
if (!plasmoid.configuration.showIOWrites)
setList();
}
function onShowBordersChanged() {
setHdr();
setHeight();
}
function onShowHeadersChanged() {
setHdr();
setHeight();
}
function onBoldHeadersChanged() {
if (plasmoid.configuration.showHeaders)
procView.headerItem.hdrFont.bold = plasmoid.configuration.boldHeaders;
setHdr();
setHeight();
}
function onOwnProcsChanged() {
if (plasmoid.configuration.ownProcs) pinfo.setProcUids(getWitchProcs());
}
function onUserProcsChanged() {
if (plasmoid.configuration.userProcs) pinfo.setProcUids(getWitchProcs());
}
function onSystemProcsChanged() {
if (plasmoid.configuration.systemProcs) pinfo.setProcUids(getWitchProcs());
}
function onAllProcsChanged() {
if (plasmoid.configuration.allProcs) pinfo.setProcUids(getWitchProcs());
}
function onFontFamilyChanged() {
if (!plasmoid.configuration.systemFont) {
listFont.family = plasmoid.configuration.fontFamily;
listFont.bold = false;
setList();
setHeight();
}
}
function onFontSizeChanged() {
if (!plasmoid.configuration.systemFont) {
listFont.pointSize = plasmoid.configuration.fontSize;
listFont.bold = false;
setList();
setHeight();
}
}
function onSystemFontChanged() {
if (plasmoid.configuration.systemFont) {
listFont.family = sysFont.family;
listFont.pointSize = sysFont.pointSize;
listFont.bold = false;
} else {
listFont.family = plasmoid.configuration.fontFamily;
listFont.pointSize = plasmoid.configuration.fontSize;
listFont.bold = false;
}
setList();
setHeight();
}
}
Connections {
target: pinfo
function onResult(totalCPU, procIDs, procNames, procCPU, procMem, procDRead, procDWrite) {
var numSecs;
function fmtData (value, len, suffix) {
value = value.toFixed(1).substring(0, len);
if (value != "0.0") {
value = value.padStart(len) + suffix;
} else {
value = "".padStart(len + suffix.length);
}
return value;
}
numSecs = totalCPU / numClkTicks
for (var idx = 0; idx < plasmoid.configuration.numProcesses; idx++) {
procModel.set(idx, {
name: procNames[idx].substring(0, 15).padEnd(15),
pid: procIDs[idx].substring(0, 8).padStart(8),
cpu: fmtData((procCPU[idx] / totalCPU) * 100, 5, "%"),
mem: fmtData(procMem[idx] / 1024, 7, "M"),
ior: fmtData(procDRead[idx] / 1048576 / numSecs, 7, "Ms"),
iow: fmtData(procDWrite[idx] / 1048576 / numSecs, 7, "Ms")
});
}
}
}
Component.onCompleted: {
numClkTicks = pinfo.getClkTicks() * pinfo.getNumProcs();
if (plasmoid.configuration.systemFont) {
listFont.family = sysFont.family;
listFont.pointSize = sysFont.pointSize;
} else {
listFont.family = plasmoid.configuration.fontFamily;
listFont.pointSize = plasmoid.configuration.fontSize;
}
listFont.bold = false;
setList();
setHeight();
pinfo.configProcesses(getWitchProcs(), plasmoid.configuration.numProcesses, getSortField(),
!(plasmoid.configuration.sortbyMem || plasmoid.configuration.showMem));
}
}