diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/config/config.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/config/config.qml new file mode 100644 index 0000000..b6e65fe --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/config/config.qml @@ -0,0 +1,20 @@ +import QtQuick 2.2 +import org.kde.plasma.configuration 2.0 + +ConfigModel { + ConfigCategory { + name: i18nc("Config header", "General") + icon: 'preferences-desktop-plasma' + source: 'config/ConfigGeneral.qml' + } + ConfigCategory { + name: i18nc("Config header", "Data") + icon: 'preferences-desktop' + source: 'config/ConfigData.qml' + } + ConfigCategory { + name: i18nc("Config header", "Appearance") + icon: 'preferences-desktop-color' + source: 'config/ConfigAppearance.qml' + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/config/main.xml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/config/main.xml new file mode 100644 index 0000000..fa37e09 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/config/main.xml @@ -0,0 +1,220 @@ + + + + + + + 1.0 + + + + org.kde.plasma-systemmonitor + + + + true + + + usage + + + true + + + average + + + false + + + + true + + + physical + + + true + + + + false + + + kibibyte + + + + false + + + false + + + true + + + false + + + + false + + + + + + + + 100000.0 + + + 100000.0 + + + + 200000.0 + + + 200000.0 + + + + gpu0 + + + + 85.0 + + + 105.0 + + + 70 + + + 90 + + + 75 + + + 85 + + + + + + false + + + 10 + + + true + + + 26 + + + false + + + + + false + + + + + 10 + + + 25 + + + hover-hints + + + top-right + + + + cpu,memory,gpu,disks,network + + + + false + + + + + false + + + + + + false + + + + + false + + + + + + false + + + + + false + + + + + + false + + + + + false + + + + + false + + + + + + false + + + + + false + + + + + + false + + + + + false + + + + + + diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/locale/fr/LC_MESSAGES/plasma_applet_org.kde.resourcesMonitor-fork.mo b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/locale/fr/LC_MESSAGES/plasma_applet_org.kde.resourcesMonitor-fork.mo new file mode 100644 index 0000000..2dca607 Binary files /dev/null and b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/locale/fr/LC_MESSAGES/plasma_applet_org.kde.resourcesMonitor-fork.mo differ diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/locale/nl/LC_MESSAGES/plasma_applet_org.kde.resourcesMonitor-fork.mo b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/locale/nl/LC_MESSAGES/plasma_applet_org.kde.resourcesMonitor-fork.mo new file mode 100644 index 0000000..c7183be Binary files /dev/null and b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/locale/nl/LC_MESSAGES/plasma_applet_org.kde.resourcesMonitor-fork.mo differ diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/ApplicationDelegateItem.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/ApplicationDelegateItem.qml new file mode 100644 index 0000000..48f8687 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/ApplicationDelegateItem.qml @@ -0,0 +1,38 @@ +import QtQuick 2.0 +import QtQuick.Controls 2.12 as QtControls +import QtQuick.Layouts 1.1 as QtLayouts +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents +import org.kde.kirigami 2.6 as Kirigami + +MouseArea { + id: root + height: childrenRect.height + + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + + property string serviceName: "" + property string name: "" + property string comment: "" + property string iconName: "" + property bool selected: false + + QtLayouts.RowLayout { + spacing: Kirigami.Units.smallSpacing + + QtControls.ToolTip.text: (comment !== "" ? comment + "\n\n" : "") + "ID: " + serviceName + ".desktop" + QtControls.ToolTip.visible: root.containsMouse + + PlasmaCore.IconItem { + id: icon + + source: iconName + implicitHeight: 16 + implicitWidth: 16 + } + PlasmaComponents.Label { + text: selected ? "" + name + "" : name + } + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/AppsDetector.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/AppsDetector.qml new file mode 100644 index 0000000..c52fca9 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/AppsDetector.qml @@ -0,0 +1,31 @@ +import QtQuick 2.0 +import org.kde.plasma.core 2.1 as PlasmaCore + +PlasmaCore.SortFilterModel { + id: appsDetector + + sourceModel: PlasmaCore.DataModel { + dataSource: source + } + + filterRole: "name" + sortColumn: 0 + sortRole: "name" + sortOrder: Qt.AscendingOrder + + property var _dataSource: PlasmaCore.DataSource { + id: source + engine: "apps" + connectedSources: { + // Explude folder + var result = []; + for (var i = 0; i < sources.length; i++) { + if (sources[i].indexOf(".desktop") !== -1) { + result.push(sources[i]); + } + } + return result; + } + interval: 0 + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/GpuDetector.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/GpuDetector.qml new file mode 100644 index 0000000..5158f8a --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/GpuDetector.qml @@ -0,0 +1,73 @@ +import QtQuick 2.0 +import org.kde.kitemmodels 1.0 as KItemModels +import org.kde.ksysguard.sensors 1.0 as Sensors + +KItemModels.KSortFilterProxyModel { + id: detector + + property var model: [] + property var _privateModel: ListModel { + } + + signal ready + + // Find all gpus + sourceModel: KItemModels.KDescendantsProxyModel { + model: Sensors.SensorTreeModel { + } + } + + property var _regex: /gpu\/(gpu\d)\/name/ + property var _tmpSensors: [] + filterRowCallback: function (row, parent) { + const sensorId = sourceModel.data(sourceModel.index(row, 0), Sensors.SensorTreeModel.SensorId); + const found = sensorId.match(_regex); + if (found && _tmpSensors.findIndex(item => item === sensorId) === -1) { + _tmpSensors.push(sensorId); + _privateModel.append({ + "index": found[1], + "name": "" + }); + } + } + + // Find name of GPU + property var _nameRegex: /.*\[(.*)\]/ + property var _sensors: Sensors.SensorDataModel { + updateRateLimit: -1 + property var retrievedData: 0 + + onDataChanged: { + let name = data(topLeft, Sensors.SensorDataModel.Value); + + // Special case for non NVIDIA graphic card (eg. in AMD the name look like "Navi 21 [Radeon RX 6950 XT]") + const found = name.match(_nameRegex); + if (found) { + if (found[1].startsWith("Radeon")) { + name = "AMD "; + } else { + name = "Intel "; + } + name += found[1]; + } + _privateModel.setProperty(topLeft.column, "name", name); + + // Stop sensors and update model + if (++retrievedData === sensors.length) { + enabled = false; + detector.model = _privateModel; + detector.ready(); + } + } + } + + property var _timer: Timer { + running: true + triggeredOnStart: true + + onTriggered: { + running = false; + _sensors.sensors = _tmpSensors; + } + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/NetworkInterfaceDetector.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/NetworkInterfaceDetector.qml new file mode 100644 index 0000000..747721a --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/NetworkInterfaceDetector.qml @@ -0,0 +1,35 @@ +import QtQuick 2.0 +import org.kde.plasma.core 2.0 as PlasmaCore + +QtObject { + id: detector + + property var model: [] + + property var _dataSource: PlasmaCore.DataSource { + id: dataSource + engine: "executable" + connectedSources: [] + + property var excludedInterface: /^(?!lo|bridge|usbus|bond)(.*)$/ + + onNewData: { + var interfaces = data["stdout"].trim().split('\n'); + for (var i = 0; i < interfaces.length; i++) { + if (excludedInterface.test(interfaces[i])) { + _privateModel.append({ + "name": interfaces[i] + }); + } + } + detector.model = _privateModel; + disconnectSource(sourceName); // cmd finished + } + + Component.onCompleted: { + connectSource("ip -o link show | awk -F': ' '{print $2}'"); + } + } + + property var _privateModel: ListModel {} +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/functions.js b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/functions.js new file mode 100644 index 0000000..9aabbc5 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/functions.js @@ -0,0 +1,78 @@ +/** + * @typedef {object} BinaryUnit + * @property {string} name The name + * @property {string} suffix The suffix + * @property {string} kiloChar The char for "kilo" + * @property {number} KiBDiff The difference with `kibibyte` + * @property {number} multiplier The multiplier amount (`1000` for metric and `1024` for binary) + */ + +/** + * Get the binary unit from they name + * @param {string} dialect The binary unit name + * @returns {BinaryUnit} The binary unit + */ +function getNetworkDialectInfo(dialect) { + switch (dialect) { + case "kilobyte": + return { + name: "kilobyte", + suffix: i18nc("kilobyte suffix", "Bps"), + kiloChar: "k", + KiBDiff: 1.024, + multiplier: 1024, + }; + case "kilobit": + return { + name: "kilobit", + suffix: i18nc("kilobit suffix", "bps"), + kiloChar: "k", + KiBDiff: 8, + multiplier: 1024, + }; + default: + return { + name: "kibibyte", + suffix: i18nc("kibibyte suffix", "iB/s"), + kiloChar: "K", + KiBDiff: 1, + multiplier: 1024, + }; + } +} + +/** + * Convert value from bytes to the appropriate string representation using the binary unit dialect. + * + * @param {number} value The value in byte/bit + * @param {BinaryUnit} dialect The binary unit standard to use + * @param {number} [precision=1] Number of places after the decimal point to use. + * @returns Converted value as a translated string including the units. + */ +function formatByteValue(value, dialect, precision = 1) { + if (value === 0 || isNaN(parseInt(value))) { + return "0 " + dialect.suffix.replace("i", ""); + } else if (dialect.name === "kibibyte" && value <= dialect.multiplier) { + return "0 " + dialect.suffix.replace("i", ""); + } + + var sizes = ["", dialect.kiloChar, "M", "G", "T", "P", "Z", "Y"]; + + // Search unit conversion + var unit = Math.floor(Math.log(value) / Math.log(dialect.multiplier)); + + // Bytes/Bits, no rounding + precision = precision < 0 ? 0 : precision; + if (unit === 0) { + precision = 0; + } + + return ( + parseFloat( + (value / Math.pow(dialect.multiplier, unit)).toFixed(precision) + ) + + " " + + sizes[unit] + + dialect.suffix + ); +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/CpuGraph.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/CpuGraph.qml new file mode 100644 index 0000000..d71380d --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/CpuGraph.qml @@ -0,0 +1,70 @@ +import QtQuick 2.9 +import org.kde.plasma.plasmoid 2.0 +import "./base" as RMBaseGraph +import "../sensors" as RMSensors + +RMBaseGraph.SensorGraph { + id: root + objectName: "CpuGraph" + + Connections { + target: plasmoid.configuration + function onCpuUnitChanged() { + _updateSensors(); + } + function onClockAgregatorChanged() { + if (!manualFrequency.needManual) { + _updateSensors(); + } + } + } + + // Config options + property color temperatureColor: plasmoid.configuration.customCpuTemperatureColor ? plasmoid.configuration.cpuTemperatureColor : theme.textColor + + // Graph options + // NOTE: "sensorsModel.sensors" is set by "_updateSensors" + chartColor: plasmoid.configuration.customCpuColor ? plasmoid.configuration.cpuColor : theme.highlightColor + + chart.yRange { + from: 0 + to: 100 + } + + // Labels options + thresholds: [undefined, undefined, [plasmoid.configuration.thresholdWarningCpuTemp, plasmoid.configuration.thresholdCriticalCpuTemp]] + + textContainer { + labelColors: [root.chartColor, undefined, temperatureColor] + valueColors: [undefined, undefined, temperatureColor] + + labels: ["CPU", (plasmoid.configuration.showClock ? i18nc("Graph label", "Clock") : ""), (plasmoid.configuration.showCpuTemperature ? i18nc("Graph label", "Temp.") : "")] + } + + function _updateSensors() { + // Manual cpu frequency handle + // TODO (3.0): remove this + let frequencySensorId = "cpu/all/" + plasmoid.configuration.clockAgregator + "Frequency"; + if (manualFrequency.needManual) { + frequencySensorId = "cpu/cpu0/frequency"; + } + // END Manual cpu frequency handle + sensorsModel.sensors = ["cpu/all/" + plasmoid.configuration.cpuUnit, frequencySensorId, "cpu/cpu0/temperature"]; + } + + // Manual cpu frequency handle + // TODO (3.0): remove this + _formatValue: (index, data) => { + if (index === 1 && manualFrequency.needManual) { + return manualFrequency.getFormattedValue(); + } + return _defaultFormatValue(index, data); + } + + RMSensors.CpuFrequency { + id: manualFrequency + agregator: plasmoid.configuration.clockAgregator + + onReady: _updateSensors() + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/DisksGraph.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/DisksGraph.qml new file mode 100644 index 0000000..647cbcf --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/DisksGraph.qml @@ -0,0 +1,38 @@ +import QtQuick 2.9 +import org.kde.plasma.plasmoid 2.0 +import "./base" as RMBaseGraph +import "../functions.js" as Functions + +RMBaseGraph.TwoSensorsGraph { + id: root + objectName: "DisksGraph" + + readonly property var diskIoDialect: Functions.getNetworkDialectInfo("kibibyte") + + Connections { + target: plasmoid.configuration + function onDiskReadTotalChanged() { + _updateUplimits(); + } + function onDiskWriteTotalChanged() { + _updateUplimits(); + } + } + Component.onCompleted: { + _updateUplimits(); + } + + // Labels + textContainer { + labelColors: root.colors + labels: [i18nc("Graph label", "Read"), i18nc("Graph label", "Write"), ""] + } + + // Graph options + sensorsModel.sensors: ["disk/all/read", "disk/all/write"] + colors: [(plasmoid.configuration.customDiskReadColor ? plasmoid.configuration.diskReadColor : theme.highlightColor), (plasmoid.configuration.customDiskWriteColor ? plasmoid.configuration.diskWriteColor : theme.positiveTextColor)] + + function _updateUplimits() { + uplimits = [plasmoid.configuration.diskReadTotal * diskIoDialect.multiplier, plasmoid.configuration.diskWriteTotal * diskIoDialect.multiplier]; + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/GpuGraph.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/GpuGraph.qml new file mode 100644 index 0000000..61d4b7c --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/GpuGraph.qml @@ -0,0 +1,85 @@ +import QtQuick 2.9 +import org.kde.plasma.plasmoid 2.0 +import org.kde.ksysguard.sensors 1.0 as Sensors +import "./base" as RMBaseGraph + +RMBaseGraph.TwoSensorsGraph { + id: root + objectName: "GpuGraph" + + // Config options + property color temperatureColor: plasmoid.configuration.customGpuTemperatureColor ? plasmoid.configuration.gpuTemperatureColor : theme.textColor + + // Bind config changes + Connections { + target: plasmoid.configuration + function onGpuMemoryInPercentChanged() { + uplimits = [100, plasmoid.configuration.gpuMemoryInPercent ? 100 : maxQueryModel.maxMemory]; + _clear(); + } + function onGpuIndexChanged() { + maxQueryModel.enabled = true + } + } + + // Labels + thresholds: [undefined, undefined, [plasmoid.configuration.thresholdWarningGpuTemp, plasmoid.configuration.thresholdCriticalGpuTemp]] + + textContainer { + labelColors: [root.colors[0], root.colors[1], temperatureColor] + valueColors: [undefined, undefined, temperatureColor] + + labels: ["GPU", (plasmoid.configuration.gpuMemoryGraph ? "VRAM" : ""), (plasmoid.configuration.showGpuTemperature ? i18nc("Graph label", "Temp.") : "")] + } + + // Graph options + // NOTE: "sensorsModel.sensors" set from "maxQueryModel" + colors: [(plasmoid.configuration.customGpuColor ? plasmoid.configuration.gpuColor : theme.highlightColor), (plasmoid.configuration.customGpuMemoryColor ? plasmoid.configuration.gpuMemoryColor : theme.positiveTextColor)] + + // Override methods, for handle memeory in percent + _update: () => { + for (let i = 0; i < sensorsModel.sensors.length; i++) { + let value = sensorsModel.getInfo(i); + if (i === 1 && plasmoid.configuration.gpuMemoryInPercent) { + value = (value / maxQueryModel.maxMemory) * 100; + } + root._insertChartData(i, value); + + // Update label + if (textContainer.valueVisible) { + _updateData(i); + } + } + } + _formatValue: (index, data) => { + if (index === 1 && plasmoid.configuration.gpuMemoryInPercent) { + return i18nc("Percent unit", "%1%", Math.round((data.value / maxQueryModel.maxMemory) * 1000) / 10); // This is for round to 1 decimal + } + return _defaultFormatValue(index, data); + } + + // Initialize limits and threshold + Sensors.SensorDataModel { + id: maxQueryModel + sensors: ["gpu/" + plasmoid.configuration.gpuIndex + "/totalVram"] + enabled: true + property int maxMemory: -1 + + onDataChanged: { + // Update values + const valueVar = parseInt(data(topLeft, Sensors.SensorDataModel.Value)); + if (isNaN(valueVar) || valueVar <= 0) { + return; + } + enabled = false; + maxMemory = valueVar; + + // Update graph Y range + root.uplimits = [100, plasmoid.configuration.gpuMemoryInPercent ? 100 : maxMemory]; + + // Update sensors + const gpu = plasmoid.configuration.gpuIndex + root.sensorsModel.sensors = ["gpu/" + gpu + "/usage", "gpu/" + gpu + "/usedVram", "gpu/" + gpu + "/temperature"]; + } + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/MemoryGraph.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/MemoryGraph.qml new file mode 100644 index 0000000..6f467fc --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/MemoryGraph.qml @@ -0,0 +1,101 @@ +import QtQuick 2.9 +import org.kde.plasma.plasmoid 2.0 +import org.kde.ksysguard.sensors 1.0 as Sensors +import "./base" as RMBaseGraph + +RMBaseGraph.TwoSensorsGraph { + id: root + objectName: "MemoryGraph" + + Connections { + target: plasmoid.configuration + function onMemoryUnitChanged() { // Values: usage, system, user + const oldLimit1 = uplimits[0]; + if (plasmoid.configuration.memoryUnit.endsWith("-percent")) { + uplimits = [100, 100]; + } else { + uplimits = maxQueryModel.maxMemory; + } + _updateThresholds(); + _updateSensors(); + if (oldLimit1 != uplimits[0]) { + _clear(); + } + } + + function onMemorySwapGraphChanged() { + _updateSensors(); + } + + function onThresholdWarningMemoryChanged() { + _updateThresholds(); + } + function onThresholdCriticalMemoryChanged() { + _updateThresholds(); + } + } + Component.onCompleted: { + _updateThresholds(); + _updateSensors(); + } + + // Labels + textContainer { + labelColors: root.colors + valueColors: [undefined, root.colors[1]] + labelsVisibleWhenZero: [true, false, true] + + labels: ["RAM", (plasmoid.configuration.memorySwapGraph ? "Swap" : ""), ""] + } + + // Graph options + // NOTE: "sensorsModel.sensors" is set by "_updateSensors" + colors: [(plasmoid.configuration.customRamColor ? plasmoid.configuration.ramColor : theme.highlightColor), (plasmoid.configuration.customSwapColor ? plasmoid.configuration.swapColor : theme.negativeTextColor)] + + // Initialize limits and threshold + Sensors.SensorDataModel { + id: maxQueryModel + sensors: ["memory/physical/total", "memory/swap/total"] + enabled: true + property var maxMemory: [-1, -1] + + onDataChanged: { + // Update values + const value = parseInt(data(topLeft, Sensors.SensorDataModel.Value)); + if (isNaN(value) || (topLeft.column === 0 && value <= 0)) { + return; + } + maxMemory[topLeft.column] = value; + + // Update graph Y range and sensors + if (maxMemory[0] > 0 && maxMemory[1] >= 0) { + enabled = false; + if (!plasmoid.configuration.memoryUnit.endsWith("-percent")) { + root.uplimits = maxMemory; + } + root._updateThresholds(); + root._updateSensors(); + } + } + } + + function _updateThresholds() { + const thresholdWarningMemory = plasmoid.configuration.thresholdWarningMemory; + const thresholdCriticalMemory = plasmoid.configuration.thresholdCriticalMemory; + if (!plasmoid.configuration.memoryUnit.endsWith("-percent")) { + thresholds[0] = [maxQueryModel.maxMemory[0] * (thresholdWarningMemory / 100.0), maxQueryModel.maxMemory[0] * (thresholdCriticalMemory / 100.0)]; + } else { + thresholds[0] = [thresholdWarningMemory, thresholdCriticalMemory]; + } + } + function _updateSensors() { + const info = plasmoid.configuration.memoryUnit.split("-"); + const suffix = info[1] === "percent" ? "Percent" : ""; + const memSensor = "memory/physical/" + (info[0] === "physical" ? "used" : "application") + suffix; + if (plasmoid.configuration.memorySwapGraph) { + sensorsModel.sensors = [memSensor, "memory/swap/used" + suffix]; + } else { + sensorsModel.sensors = [memSensor]; + } + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/NetworkGraph.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/NetworkGraph.qml new file mode 100644 index 0000000..433fa31 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/NetworkGraph.qml @@ -0,0 +1,113 @@ +import QtQuick 2.9 +import org.kde.plasma.plasmoid 2.0 +import "./base" as RMBaseGraph +import "../" as RMComponents +import "../functions.js" as Functions + +RMBaseGraph.TwoSensorsGraph { + id: root + objectName: "NetworkGraph" + + property var dialect: Functions.getNetworkDialectInfo(plasmoid.configuration.networkUnit) + + Connections { + target: plasmoid.configuration + function onIgnoredNetworkInterfacesChanged() { + _updateSensors(); + } + + function onNetworkReceivingTotalChanged() { + _updateUplimits(); + } + function onNetworkSendingTotalChanged() { + _updateUplimits(); + } + } + Component.onCompleted: _updateUplimits() + + // Labels + textContainer { + labelColors: root.colors + labels: [i18nc("Graph label", "Receiving"), i18nc("Graph label", "Sending"), ""] + } + + // Graph options + colors: [(plasmoid.configuration.customNetDownColor ? plasmoid.configuration.netDownColor : theme.highlightColor), (plasmoid.configuration.customNetUpColor ? plasmoid.configuration.netUpColor : theme.positiveTextColor)] + + // Initialized sensors + RMComponents.NetworkInterfaceDetector { + id: networkInterfaces + onModelChanged: _updateSensors() + } + + // Override methods, for commulate sensors and support custom dialect + property var _downloadValue + property var _uploadValue + + _update: () => { + // Cummulate sensors by group + let data; + let downloadValue = 0, uploadValue = 0; + for (let i = 0; i < sensorsModel.sensors.length; i++) { + data = sensorsModel.getData(i); + if (typeof data === "undefined") { + continue; + } else if (data.sensorId.indexOf('/download') !== -1) { + downloadValue += data.value; + } else { + uploadValue += data.value; + } + } + + // Fix dialect AND store it for update label + _downloadValue = downloadValue *= dialect.KiBDiff; + _uploadValue = uploadValue *= dialect.KiBDiff; + + // Insert datas + root._insertChartData(0, downloadValue); + root._insertChartData(1, uploadValue); + + // Update label + if (textContainer.valueVisible) { + _updateData(0); + _updateData(1); + } + } + + function _updateData(index) { + // Cancel update if first data is not here + if (!sensorsModel.hasIndex(0, 0)) { + return; + } + + // Retrieve label need to update + const label = _getLabel(index); + if (typeof label === "undefined" || !label.enabled) { + return; + } + const value = index === 0 ? _downloadValue : _uploadValue; + + // Show value on label + label.text = Functions.formatByteValue(value, dialect); + label.visible = true; + } + + function _updateSensors() { + if (typeof networkInterfaces.model.count === "undefined") { + return; + } + const sensors = []; + for (let i = 0; i < networkInterfaces.model.count; i++) { + const name = networkInterfaces.model.get(i).name; + if (plasmoid.configuration.ignoredNetworkInterfaces.indexOf(name) === -1) { + sensors.push("network/" + name + "/download", "network/" + name + "/upload"); + } + } + sensorsModel.sensors = sensors; + _clear(); + } + + function _updateUplimits() { + uplimits = [plasmoid.configuration.networkReceivingTotal * dialect.multiplier, plasmoid.configuration.networkSendingTotal * dialect.multiplier]; + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/ArrayDataSource.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/ArrayDataSource.qml new file mode 100644 index 0000000..5c99c93 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/ArrayDataSource.qml @@ -0,0 +1,39 @@ +import QtQuick 2.9 +import org.kde.quickcharts 1.0 as Charts + +Charts.ArraySource { + property int maximumHistory: -1 + + onMaximumHistoryChanged: { + if (maximumHistory != -1) { + if (array.length === 0) { + array = Array(maximumHistory).fill(0); + } + _update(false); + } + } + + function clear() { + array = maximumHistory === -1 ? [] : Array(maximumHistory).fill(0); + // Emit update + dataChanged(); + } + function insertValue(value) { + array = [value, ...array]; + _update(); + } + + function _update() { + // Reorder array + while (array.length > 0 && array.length > maximumHistory) { + array = array.slice(0, -1); + } + + // Emit update + dataChanged(); + } + + Component.onCompleted: { + array = maximumHistory === -1 ? [] : Array(maximumHistory).fill(0); + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/BaseSensorGraph.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/BaseSensorGraph.qml new file mode 100644 index 0000000..d6f8dcf --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/BaseSensorGraph.qml @@ -0,0 +1,164 @@ +import QtQuick 2.9 +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.components 2.0 as PlasmaComponents +import org.kde.ksysguard.sensors 1.0 as Sensors +import org.kde.ksysguard.formatter 1.0 as Formatter +import "./" as RMBaseGraph + +Item { + id: root + + signal chartDataChanged(int index) + signal showValueInLabel + signal labelChanged(PlasmaComponents.Label label, var value) + + // Aliases + readonly property alias textContainer: textContainer + readonly property alias sensorsModel: sensorsModel + + // Thresholds properties + property var thresholds: [undefined, undefined, undefined] + property color thresholdWarningColor: plasmoid.configuration.customWarningColor ? plasmoid.configuration.warningColor : theme.neutralTextColor + property color thresholdCriticalColor: plasmoid.configuration.customCriticalColor ? plasmoid.configuration.criticalColor : theme.negativeTextColor + + // Labels + RMBaseGraph.GraphText { + id: textContainer + anchors.fill: parent + z: 1 + + onShowValueInLabel: { + // Update labels + for (let i = 0; i < sensorsModel.sensors.length; i++) { + _updateData(i); + } + + // Emit signal + root.showValueInLabel(); + } + } + + // Retrieve data from sensors, and update labels + Sensors.SensorDataModel { + id: sensorsModel + updateRateLimit: -1 + enabled: root.visible + + /** + * Get the data from sensor + * @param {number} column The sensors index + * @returns The data value, formatted value and sensor id + */ + function getData(column) { + if (!hasIndex(0, column)) { + return undefined; + } + const indexVar = index(0, column); + const value = data(indexVar, Sensors.SensorDataModel.Value); + const res = { + "sensorId": data(indexVar, Sensors.SensorDataModel.SensorId), + "value": value + }; + return res; + } + + /** + * Get info from sensor + * @param {number} column The sensor index + * @param {number} role The role id + * @returns The sensor info + */ + function getInfo(column, role = Sensors.SensorDataModel.Value) { + if (!hasIndex(0, column)) { + return 0; + } + return data(index(0, column), role); + } + } + + Connections { + target: root + + /** + * Re assign sensorsModel.sensors when enable visibility for right initialize it. + * This is due to an issue when set sensors and model is disabled, the sensors is never initialized + * Bug reported at : https://bugs.kde.org/show_bug.cgi?id=469234 + */ + function onVisibleChanged() { + if (!root.visible) { + return; + } + const sensors = sensorsModel.sensors; + sensorsModel.sensors = []; + sensorsModel.sensors = sensors; + } + } + + // Process functions + property var _insertChartData: (column, value) => {} // NOTE: this is implemented by children + property var _clear: () => { + for (let i = 0; i < sensorsModel.sensors.length; i++) { + _updateData(i); + } + } + property var _update: () => { + for (let i = 0; i < sensorsModel.sensors.length; i++) { + root._insertChartData(i, sensorsModel.getInfo(i)); + + // Update label + if (textContainer.valueVisible) { + _updateData(i); + } + } + } + + function _getLabel(index) { + if (index === 0) { + return textContainer.firstLineLabel; + } else if (index === 1) { + return textContainer.secondLineLabel; + } else if (index === 2) { + return textContainer.thirdLineLabel; + } + return undefined; + } + + function _updateData(index) { + // Retrieve label need to update + const label = _getLabel(index); + if (typeof label === "undefined" || !label.enabled) { + return; + } + const data = sensorsModel.getData(index); + if (typeof data === 'undefined') { + return; + } + + // Hide can't be zero label + if (!textContainer.labelsVisibleWhenZero[index] && data.value === 0) { + label.text = ''; + label.visible = false; + } else { + // Handle threshold value + if (typeof thresholds[index] !== 'undefined') { + if (data.value >= thresholds[index][1]) { + label.color = thresholdCriticalColor; + } else if (data.value >= thresholds[index][0]) { + label.color = thresholdWarningColor; + } else { + label.color = textContainer.getTextColor(index); + } + } + + // Show value on label + label.text = _formatValue(index, data); + label.visible = label.enabled; + } + labelChanged(label, data); + } + + property var _formatValue: _defaultFormatValue + function _defaultFormatValue(index, data) { + return Formatter.Formatter.formatValueShowNull(data.value, sensorsModel.getInfo(index, Sensors.SensorDataModel.Unit)); + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/GraphText.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/GraphText.qml new file mode 100644 index 0000000..64f6e1f --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/GraphText.qml @@ -0,0 +1,257 @@ +import QtQuick 2.9 +import QtGraphicalEffects 1.0 +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.components 2.0 as PlasmaComponents + +Item { + id: graphText + + signal showValueInLabel + + property bool valueVisible: false + + // Aliases + readonly property alias firstLineLabel: firstLineLabel + readonly property alias secondLineLabel: secondLineLabel + readonly property alias thirdLineLabel: thirdLineLabel + + // Text properties + property var labels: ["", "", ""] + property var valueColors: [theme.textColor, theme.textColor, theme.textColor] + property var labelColors: [theme.highlightColor, theme.textColor, theme.textColor] + + property var labelsVisibleWhenZero: [true, true, true] + + // Config aliases + property string displayment: plasmoid.configuration.displayment // Values: always, hover, hover-hints + + // Bind config changes + onDisplaymentChanged: { + if (displayment === 'hover') { + valueVisible = mouseArea.containsMouse; + _setLabelsState(valueVisible); + if (mouseArea.containsMouse) { + showValueInLabel(); + } + } else { + _setLabelsState(true); + showValueInLabel(); + valueVisible = true; + } + } + + // Bind properties changes + onLabelsChanged: { + firstLineLabel.enabled = firstLineLabel.visible = labels[0] != ""; + secondLineLabel.enabled = secondLineLabel.visible = labels[1] != ""; + thirdLineLabel.enabled = thirdLineLabel.visible = labels[2] != ""; + } + + // Labels + Flow { + id: textContainer + width: parent.width + state: plasmoid.configuration.placement // Values: top-right, top-left, bottom-right, bottom-left + spacing: -2 + flow: Flow.TopToBottom + + // First line + PlasmaComponents.Label { + id: firstLineLabel + width: parent.width + height: contentHeight + readonly property int index: 0 + + text: "..." + color: getTextColor(index) + font.pointSize: -1 + } + PlasmaComponents.Label { + id: secondLineLabel + width: parent.width + height: contentHeight + readonly property int index: 1 + + text: "..." + color: getTextColor(index) + font.pointSize: -1 + } + PlasmaComponents.Label { + id: thirdLineLabel + width: parent.width + height: contentHeight + readonly property int index: 2 + + text: "..." + color: getTextColor(index) + font.pointSize: -1 + } + + // States + states: [ + State { + name: 'top-left' + AnchorChanges { + target: textContainer + anchors.top: parent.top + } + + PropertyChanges { + target: firstLineLabel + horizontalAlignment: Text.AlignLeft + } + PropertyChanges { + target: secondLineLabel + horizontalAlignment: Text.AlignLeft + } + PropertyChanges { + target: thirdLineLabel + horizontalAlignment: Text.AlignLeft + } + }, + State { + name: 'top-right' + AnchorChanges { + target: textContainer + anchors.top: parent.top + } + + PropertyChanges { + target: firstLineLabel + horizontalAlignment: Text.AlignRight + } + PropertyChanges { + target: secondLineLabel + horizontalAlignment: Text.AlignRight + } + PropertyChanges { + target: thirdLineLabel + horizontalAlignment: Text.AlignRight + } + }, + State { + name: 'bottom-left' + AnchorChanges { + target: textContainer + anchors.bottom: parent.bottom + } + + PropertyChanges { + target: firstLineLabel + horizontalAlignment: Text.AlignLeft + } + PropertyChanges { + target: secondLineLabel + horizontalAlignment: Text.AlignLeft + } + PropertyChanges { + target: thirdLineLabel + horizontalAlignment: Text.AlignLeft + } + }, + State { + name: 'bottom-right' + AnchorChanges { + target: textContainer + anchors.bottom: parent.bottom + } + + PropertyChanges { + target: firstLineLabel + horizontalAlignment: Text.AlignRight + } + PropertyChanges { + target: secondLineLabel + horizontalAlignment: Text.AlignRight + } + PropertyChanges { + target: thirdLineLabel + horizontalAlignment: Text.AlignRight + } + } + ] + } + + DropShadow { + visible: plasmoid.configuration.enableShadows + anchors.fill: textContainer + radius: 1 + spread: 1 + fast: true + color: theme.backgroundColor + source: textContainer + } + + // Action + MouseArea { + id: mouseArea + anchors.fill: parent + acceptedButtons: Qt.NoButton + hoverEnabled: displayment !== 'always' + + property bool _firstHover: true + property var _oldLabelsState: [] + function _saveOldLabelsState() { + _oldLabelsState = [[firstLineLabel.text + "", !!firstLineLabel.visible], [secondLineLabel.text + "", !!secondLineLabel.visible], [thirdLineLabel.text + "", !!thirdLineLabel.visible]]; + } + + onEntered: { + if (displayment === 'hover-hints') { + valueVisible = false; + _saveOldLabelsState(); + _setLabelsState(true); + + // Show label hints + _setTextAndColor(firstLineLabel, labels[firstLineLabel.index], true); + _setTextAndColor(secondLineLabel, labels[secondLineLabel.index], true); + _setTextAndColor(thirdLineLabel, labels[thirdLineLabel.index], true); + } else if (displayment === 'hover') { + _setLabelsState(true); + showValueInLabel(); + valueVisible = true; + } + } + + onExited: { + if (displayment === 'hover-hints') { + // Recover old state + _setTextAndColor(firstLineLabel, _oldLabelsState[firstLineLabel.index][0]); + firstLineLabel.visible = _oldLabelsState[firstLineLabel.index][1]; + _setTextAndColor(secondLineLabel, _oldLabelsState[secondLineLabel.index][0]); + secondLineLabel.visible = _oldLabelsState[secondLineLabel.index][1]; + _setTextAndColor(thirdLineLabel, _oldLabelsState[thirdLineLabel.index][0]); + thirdLineLabel.visible = _oldLabelsState[thirdLineLabel.index][1]; + + // Update value + showValueInLabel(); + valueVisible = true; + } else if (displayment === 'hover') { + valueVisible = false; + _setLabelsState(false); + } + } + } + + function getTextColor(index, isLabel = false) { + if (isLabel) { + return labelColors[index] || theme.textColor; + } + return valueColors[index] || theme.textColor; + } + function _setLabelsState(state) { + if (state) { + firstLineLabel.visible = firstLineLabel.enabled; + secondLineLabel.visible = secondLineLabel.enabled; + thirdLineLabel.visible = thirdLineLabel.enabled; + } else { + firstLineLabel.visible = secondLineLabel.visible = thirdLineLabel.visible = false; + } + } + function _setTextAndColor(label, value, isLabel = false) { + if (!label.enabled) { + return; + } + label.text = value; + label.color = getTextColor(label.index, isLabel); + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/SensorGraph.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/SensorGraph.qml new file mode 100644 index 0000000..abeff97 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/SensorGraph.qml @@ -0,0 +1,47 @@ +import org.kde.plasma.plasmoid 2.0 +import org.kde.quickcharts 1.0 as Charts +import "./" as RMBaseGraph + +RMBaseGraph.BaseSensorGraph { + id: root + + // Aliases + property alias chart: chart + + // Graph properties + property color chartColor: theme.highlightColor + + // Graph + Charts.LineChart { + id: chart + anchors.fill: parent + + direction: Charts.XYChart.ZeroAtEnd + fillOpacity: plasmoid.configuration.graphFillOpacity / 100 + smooth: true + yRange.automatic: false + + colorSource: Charts.SingleValueSource { + value: chartColor + } + valueSources: [ + RMBaseGraph.ArrayDataSource { + id: chartData + maximumHistory: plasmoid.configuration.historyAmount + } + ] + } + + _clear: () => { + chartData.clear(); + for (let i = 0; i < sensorsModel.sensors.length; i++) { + _updateData(i); + } + } + _insertChartData: (column, value) => { + if (column == 0) { + chartData.insertValue(value); + root.chartDataChanged(0); + } + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/TwoSensorsGraph.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/TwoSensorsGraph.qml new file mode 100644 index 0000000..a5acec6 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/graph/base/TwoSensorsGraph.qml @@ -0,0 +1,75 @@ +import org.kde.plasma.plasmoid 2.0 +import org.kde.quickcharts 1.0 as Charts +import "./" as RMBaseGraph + +RMBaseGraph.BaseSensorGraph { + id: root + + property var uplimits: [100, 100] + + // Graph properties + property var colors: [theme.highlightColor, theme.textColor] + + // Bind properties changes + onUplimitsChanged: { + firstChart.yRange.to = uplimits[0]; + secondChart.yRange.to = uplimits[1]; + } + + // Graphs + Charts.LineChart { + id: secondChart + anchors.fill: parent + + direction: Charts.XYChart.ZeroAtEnd + fillOpacity: plasmoid.configuration.graphFillOpacity / 100 + smooth: true + yRange.automatic: false + + colorSource: Charts.SingleValueSource { + value: colors[1] + } + valueSources: [ + RMBaseGraph.ArrayDataSource { + id: secondChartData + maximumHistory: plasmoid.configuration.historyAmount + } + ] + } + Charts.LineChart { + id: firstChart + anchors.fill: parent + + direction: Charts.XYChart.ZeroAtEnd + fillOpacity: plasmoid.configuration.graphFillOpacity / 100 + smooth: true + yRange.automatic: false + + colorSource: Charts.SingleValueSource { + value: colors[0] + } + valueSources: [ + RMBaseGraph.ArrayDataSource { + id: firstChartData + maximumHistory: plasmoid.configuration.historyAmount + } + ] + } + + _clear: () => { + firstChartData.clear() + secondChartData.clear() + for (let i = 0; i < sensorsModel.sensors.length; i++) { + _updateData(i); + } + } + _insertChartData: (column, value) => { + if (column == 0) { + firstChartData.insertValue(value); + root.chartDataChanged(0); + } else if (column == 1) { + secondChartData.insertValue(value); + root.chartDataChanged(1); + } + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/sensors/CpuFrequency.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/sensors/CpuFrequency.qml new file mode 100644 index 0000000..ea66e69 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/components/sensors/CpuFrequency.qml @@ -0,0 +1,72 @@ +import QtQuick 2.0 +import org.kde.ksysguard.sensors 1.0 as Sensors +import org.kde.ksysguard.formatter 1.0 as Formatter + +// TODO (3.0): remove this +Sensors.SensorDataModel { + id: root + property int _coreCount + + property string agregator: "average" // Possible value: average, minimum, maximum + property bool needManual + + signal ready + + function getFormattedValue() { + return Formatter.Formatter.formatValueShowNull(getValue(), 302 /* Formatter.Unit.UnitMegaHertz */); + } + + function getValue() { + let values = []; + for (let i = 0; i < _coreCount; i++) { + values[i] = data(index(0, i), Sensors.SensorDataModel.Value); + } + + // Agregate values + if (agregator === "average") { + return values.reduce((a, b) => a + b, 0) / _coreCount; + } else if (agregator === "minimum") { + return Math.min(...values); + } else if (agregator === "maximum") { + return Math.max(...values); + } else { + return undefined; + } + } + + updateRateLimit: -1 + Component.onCompleted: { + sensors = ["cpu/all/coreCount", "cpu/all/" + agregator + "Frequency"]; + } + + property bool _initialized + property Timer _timer: Timer { + running: enabled + interval: 100 // Wait to be sure all sensors metadata has retrieved + + onTriggered: { + /// Prevent running multiple times + if (_initialized) { + return; + } + _initialized = true; + + // Do nothing if all frequency is already exist + if (hasIndex(0, 1)) { + root.enabled = false; + root.ready(); + return; + } + + // Fill sensors with all cores + _coreCount = data(index(0, 0)); + const sensors = []; + for (let i = 0; i < _coreCount; i++) { + sensors[i] = "cpu/cpu" + i + "/frequency"; + } + root.sensors = sensors; + root.needManual = true; + root.ready(); + } + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/config/ConfigAppearance.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/config/ConfigAppearance.qml new file mode 100644 index 0000000..07fa6b3 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/config/ConfigAppearance.qml @@ -0,0 +1,510 @@ +import QtQuick 2.2 +import QtQuick.Controls 2.12 as QtControls +import QtQuick.Layouts 1.15 as QtLayouts +import org.kde.kirigami 2.6 as Kirigami +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.extras 2.0 as PlasmaExtras +import "../controls" as RMControls +import "../components" as RMComponents + +PlasmaExtras.Representation { + id: page + anchors.fill: parent + + // Chart + property alias cfg_verticalLayout: verticalLayout.checked + property alias cfg_historyAmount: historyAmount.value + property alias cfg_customGraphWidth: graphWidth.customized + property alias cfg_graphWidth: graphWidth.value + property alias cfg_customGraphHeight: graphHeight.customized + property alias cfg_graphHeight: graphHeight.value + property alias cfg_graphMargin: graphMargin.value + property alias cfg_graphFillOpacity: graphFillOpacity.value + property var cfg_graphOrders + + // Text + property alias cfg_enableShadows: enableShadows.checked + property alias cfg_fontScale: fontScale.value + property string cfg_placement + property string cfg_displayment + + // Colors + // > CPU + property alias cfg_customCpuColor: cpuColor.customized + property alias cfg_cpuColor: cpuColor.value + property alias cfg_customCpuTemperatureColor: cpuTemperatureColor.customized + property alias cfg_cpuTemperatureColor: cpuTemperatureColor.value + // > Memory + property alias cfg_customRamColor: ramColor.customized + property alias cfg_ramColor: ramColor.value + property alias cfg_customSwapColor: swapColor.customized + property alias cfg_swapColor: swapColor.value + // > Network + property alias cfg_customNetDownColor: netDownColor.customized + property alias cfg_netDownColor: netDownColor.value + property alias cfg_customNetUpColor: netUpColor.customized + property alias cfg_netUpColor: netUpColor.value + // > GPU + property alias cfg_customGpuColor: gpuColor.customized + property alias cfg_gpuColor: gpuColor.value + property alias cfg_customGpuMemoryColor: gpuMemoryColor.customized + property alias cfg_gpuMemoryColor: gpuMemoryColor.value + property alias cfg_customGpuTemperatureColor: gpuTemperatureColor.customized + property alias cfg_gpuTemperatureColor: gpuTemperatureColor.value + // > Disk + property alias cfg_customDiskReadColor: diskReadColor.customized + property alias cfg_diskReadColor: diskReadColor.value + property alias cfg_customDiskWriteColor: diskWriteColor.customized + property alias cfg_diskWriteColor: diskWriteColor.value + // > Threshold + property alias cfg_customWarningColor: warningColor.customized + property alias cfg_warningColor: warningColor.value + property alias cfg_customCriticalColor: criticalColor.customized + property alias cfg_criticalColor: criticalColor.value + + property color textColor: theme.textColor + property color primaryColor: theme.highlightColor + property color positiveColor: theme.positiveTextColor + property color neutralColor: theme.neutralTextColor + property color negativeColor: theme.negativeTextColor + + property var monitors: { + "cpu": { + "id": "cpu", + "name": i18nc("Chart name", "CPU"), + "icon": "cpu-symbolic" + }, + "memory": { + "id": "memory", + "name": i18nc("Chart name", "Memory"), + "icon": "memory-symbolic" + }, + "gpu": { + "id": "gpu", + "name": i18nc("Chart name", "GPU"), + "icon": "freon-gpu-temperature-symbolic" + }, + "disks": { + "id": "disks", + "name": i18nc("Chart name", "Disks I/O"), + "icon": "drive-harddisk-symbolic" + }, + "network": { + "id": "network", + "name": i18nc("Chart name", "Network"), + "icon": "network-wired-symbolic" + } + } + + // Tab bar + header: PlasmaExtras.PlasmoidHeading { + location: PlasmaExtras.PlasmoidHeading.Location.Header + + PlasmaComponents.TabBar { + id: bar + + position: PlasmaComponents.TabBar.Header + anchors.fill: parent + implicitHeight: contentHeight + + PlasmaComponents.TabButton { + icon.name: "office-chart-line-stacked" + icon.height: PlasmaCore.Units.iconSizes.smallMedium + text: i18nc("Config header", "Charts") + } + PlasmaComponents.TabButton { + icon.name: "dialog-text-and-font" + icon.height: PlasmaCore.Units.iconSizes.smallMedium + text: i18nc("Config header", "Text") + } + PlasmaComponents.TabButton { + icon.name: "color-select" + icon.height: PlasmaCore.Units.iconSizes.smallMedium + text: i18nc("Config header", "Colors") + } + } + } + + QtLayouts.StackLayout { + id: pageContent + anchors.fill: parent + currentIndex: bar.currentIndex + + // Charts + Kirigami.ScrollablePage { + Kirigami.FormLayout { + id: graphPage + wideMode: true + + QtControls.CheckBox { + id: verticalLayout + text: i18n("Vertical layout") + } + + RMControls.SpinBox { + id: historyAmount + Kirigami.FormData.label: i18n("History amount:") + QtLayouts.Layout.fillWidth: true + from: 2 + } + + RMControls.CustomizableSize { + id: graphWidth + Kirigami.FormData.label: i18n("Width:") + QtLayouts.Layout.fillWidth: true + from: 1 + to: 1000 + } + RMControls.CustomizableSize { + id: graphHeight + Kirigami.FormData.label: i18n("Height:") + QtLayouts.Layout.fillWidth: true + from: 1 + to: 1000 + } + RMControls.SpinBox { + id: graphMargin + Kirigami.FormData.label: i18n("Margin:") + QtLayouts.Layout.fillWidth: true + from: 1 + to: 1000 + + textFromValue: function (value, locale) { + return valueToText(value, locale) + " px"; + } + } + RMControls.SpinBox { + id: graphFillOpacity + Kirigami.FormData.label: i18n("Fill opacity:") + QtLayouts.Layout.fillWidth: true + from: 1 + to: 100 + + textFromValue: function (value, locale) { + return valueToText(value, locale) + "%"; + } + } + + // order + Item { + Kirigami.FormData.label: i18n("Charts order") + Kirigami.FormData.isSection: true + } + + ListView { + id: graphsList + anchors.left: parent.left + anchors.right: parent.right + + clip: true + interactive: false + + property int listViewHeight: 0 + implicitHeight: listViewHeight + + model: ListModel { + Component.onCompleted: cfg_graphOrders.map(id => monitors[id]).forEach(item => append(item)) + + function toJS() { + const result = []; + for (let i = 0; i < count; i++) { + result.push(get(i)); + } + return result; + } + } + + delegate: Kirigami.DelegateRecycler { + width: graphsList.width + sourceComponent: delegateComponent + + Component.onCompleted: { + graphsList.listViewHeight += height + 1; + } + } + + moveDisplaced: Transition { + YAnimator { + duration: Kirigami.Units.longDuration + easing.type: Easing.InOutQuad + } + } + + Component { + id: delegateComponent + Kirigami.AbstractListItem { + id: listItem + + backgroundColor: theme.headerBackgroundColor + separatorVisible: true + + contentItem: QtLayouts.RowLayout { + spacing: Kirigami.Units.largeSpacing + + Kirigami.ListItemDragHandle { + listView: graphsList + listItem: listItem + onMoveRequested: graphsList.model.move(oldIndex, newIndex, 1) + + onDropped: { + cfg_graphOrders = graphsList.model.toJS().map(item => item.id); + } + } + + PlasmaCore.IconItem { + source: model.icon + width: PlasmaCore.Units.iconSizes.smallMedium + height: width + } + PlasmaComponents.Label { + text: model.name + QtLayouts.Layout.fillWidth: true + } + } + } + } + } + } + } + + // Text + Kirigami.ScrollablePage { + Kirigami.FormLayout { + id: textPage + wideMode: true + + QtControls.CheckBox { + id: enableShadows + text: i18n("Drop shadows") + } + + RMControls.SpinBox { + id: fontScale + Kirigami.FormData.label: i18n("Font scale:") + QtLayouts.Layout.fillWidth: true + from: 1 + to: 100 + + textFromValue: function (value, locale) { + return valueToText(value, locale) + "%"; + } + } + + QtControls.ComboBox { + id: displayment + Kirigami.FormData.label: i18n("Text displayment:") + + currentIndex: -1 + textRole: "label" + valueRole: "name" + model: [{ + "label": i18nc("Text displayment", "Always"), + "name": "always" + }, { + "label": i18nc("Text displayment", "On hover"), + "name": "hover" + }, { + "label": i18nc("Text displayment", "Hints when hover"), + "name": "hover-hints" + }] + + onActivated: cfg_displayment = currentValue + Component.onCompleted: currentIndex = indexOfValue(cfg_displayment) + } + + QtControls.ComboBox { + id: placement + Kirigami.FormData.label: i18n("Placement:") + + currentIndex: -1 + textRole: "label" + valueRole: "name" + model: [{ + "label": i18nc("Text placement", "Top left"), + "name": "top-left" + }, { + "label": i18nc("Text placement", "Top right"), + "name": "top-right" + }, { + "label": i18nc("Text placement", "Bottom left"), + "name": "bottom-left" + }, { + "label": i18nc("Text placement", "Bottom right"), + "name": "bottom-right" + }] + + onActivated: cfg_placement = currentValue + Component.onCompleted: currentIndex = indexOfValue(cfg_placement) + } + } + } + + // Colors + Kirigami.ScrollablePage { + Kirigami.FormLayout { + id: colorsPage + + // Charts + Kirigami.Separator { + Kirigami.FormData.label: i18n("Charts colors") + Kirigami.FormData.isSection: true + } + + // > CPU + Rectangle { + height: Kirigami.Units.largeSpacing + color: "transparent" + } + Item { + Kirigami.FormData.label: i18nc("Chart name", "CPU") + Kirigami.FormData.isSection: true + } + + RMControls.ColorSelector { + id: cpuColor + Kirigami.FormData.label: i18nc("Chart config", "Usage:") + + dialogTitle: i18nc("Chart color", "Choose series color") + defaultColor: primaryColor + } + RMControls.ColorSelector { + id: cpuTemperatureColor + Kirigami.FormData.label: i18nc("Chart config", "Temperature:") + + dialogTitle: i18nc("Chart color", "Choose text color") + defaultColor: textColor + } + + // > Memory + Rectangle { + height: Kirigami.Units.largeSpacing + color: "transparent" + } + Item { + Kirigami.FormData.label: i18nc("Chart name", "Memory") + Kirigami.FormData.isSection: true + } + + RMControls.ColorSelector { + id: ramColor + Kirigami.FormData.label: i18nc("Chart config", "Physical:") + + dialogTitle: i18nc("Chart color", "Choose series color") + defaultColor: primaryColor + } + RMControls.ColorSelector { + id: swapColor + Kirigami.FormData.label: i18nc("Chart config", "Swap:") + + dialogTitle: i18nc("Chart color", "Choose color of series and text") + defaultColor: negativeColor + } + + // > Network + Rectangle { + height: Kirigami.Units.largeSpacing + color: "transparent" + } + Item { + Kirigami.FormData.label: i18nc("Chart name", "Network") + Kirigami.FormData.isSection: true + } + + RMControls.ColorSelector { + id: netDownColor + Kirigami.FormData.label: i18nc("Chart config", "Receiving:") + + dialogTitle: i18nc("Chart color", "Choose series color") + defaultColor: primaryColor + } + RMControls.ColorSelector { + id: netUpColor + Kirigami.FormData.label: i18nc("Chart config", "Sending:") + + dialogTitle: i18nc("Chart color", "Choose series color") + defaultColor: positiveColor + } + + // > GPU + Rectangle { + height: Kirigami.Units.largeSpacing + color: "transparent" + } + Item { + Kirigami.FormData.label: i18nc("Chart name", "GPU") + Kirigami.FormData.isSection: true + } + + RMControls.ColorSelector { + id: gpuColor + Kirigami.FormData.label: i18nc("Chart config", "Usage:") + + dialogTitle: i18nc("Chart color", "Choose series color") + defaultColor: primaryColor + } + RMControls.ColorSelector { + id: gpuMemoryColor + Kirigami.FormData.label: i18nc("Chart config", "Memory:") + + dialogTitle: i18nc("Chart color", "Choose series color") + defaultColor: positiveColor + } + RMControls.ColorSelector { + id: gpuTemperatureColor + Kirigami.FormData.label: i18nc("Chart config", "Temperature:") + + dialogTitle: i18nc("Chart color", "Choose text color") + defaultColor: textColor + } + + // > Disk I/O + Rectangle { + height: Kirigami.Units.largeSpacing + color: "transparent" + } + Item { + Kirigami.FormData.label: i18nc("Chart name", "Disks I/O") + Kirigami.FormData.isSection: true + } + + RMControls.ColorSelector { + id: diskReadColor + Kirigami.FormData.label: i18nc("Chart config", "Read:") + + dialogTitle: i18nc("Chart color", "Choose series color") + defaultColor: primaryColor + } + RMControls.ColorSelector { + id: diskWriteColor + Kirigami.FormData.label: i18nc("Chart config", "Write:") + + dialogTitle: i18nc("Chart color", "Choose series color") + defaultColor: positiveColor + } + + // Thresholds + Kirigami.Separator { + Kirigami.FormData.label: i18n("Threshold text colors") + Kirigami.FormData.isSection: true + } + + RMControls.ColorSelector { + id: warningColor + Kirigami.FormData.label: i18n("Warning status:") + + dialogTitle: i18n("Choose text color when the value is in warning status") + defaultColor: neutralColor + } + RMControls.ColorSelector { + id: criticalColor + Kirigami.FormData.label: i18n("Critical status:") + + dialogTitle: i18n("Choose text color when the value is in critical status") + defaultColor: negativeColor + } + } + } + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/config/ConfigData.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/config/ConfigData.qml new file mode 100644 index 0000000..bbf4c5e --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/config/ConfigData.qml @@ -0,0 +1,451 @@ +import QtQuick 2.2 +import QtQuick.Controls 2.12 as QtControls +import QtQuick.Layouts 1.15 as QtLayouts +import org.kde.kirigami 2.6 as Kirigami +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.extras 2.0 as PlasmaExtras +import "../components" as RMComponents +import "../controls" as RMControls +import "../components/functions.js" as Functions + +PlasmaExtras.Representation { + id: dataPage + anchors.fill: parent + + // Network + readonly property var networkDialect: Functions.getNetworkDialectInfo(plasmoid.configuration.networkUnit) + property var cfg_ignoredNetworkInterfaces + property alias cfg_networkReceivingTotal: networkReceiving.realValue + property alias cfg_networkSendingTotal: networkSending.realValue + + // Disks I/O + property alias cfg_diskReadTotal: diskRead.realValue + property alias cfg_diskWriteTotal: diskWrite.realValue + + // GPU + property string cfg_gpuIndex + + // Thresholds + property alias cfg_thresholdWarningCpuTemp: thresholdWarningCpuTemp.realValue + property alias cfg_thresholdCriticalCpuTemp: thresholdCriticalCpuTemp.realValue + property alias cfg_thresholdWarningMemory: thresholdWarningMemory.value + property alias cfg_thresholdCriticalMemory: thresholdCriticalMemory.value + property alias cfg_thresholdWarningGpuTemp: thresholdWarningGpuTemp.realValue + property alias cfg_thresholdCriticalGpuTemp: thresholdCriticalGpuTemp.realValue + + readonly property var networkSpeedOptions: [{ + "label": i18n("Custom"), + "value": -1 + }, { + "label": "100 " + networkDialect.kiloChar + networkDialect.suffix, + "value": 100.0 + }, { + "label": "1 M" + networkDialect.suffix, + "value": 1000.0 + }, { + "label": "10 M" + networkDialect.suffix, + "value": 10000.0 + }, { + "label": "100 M" + networkDialect.suffix, + "value": 100000.0 + }, { + "label": "1 G" + networkDialect.suffix, + "value": 1000000.0 + }, { + "label": "2.5 G" + networkDialect.suffix, + "value": 2500000.0 + }, { + "label": "5 G" + networkDialect.suffix, + "value": 5000000.0 + }, { + "label": "10 G" + networkDialect.suffix, + "value": 10000000.0 + }] + readonly property var diskSpeedOptions: [{ + "label": i18n("Custom"), + "value": -1 + }, { + "label": "10 MiB/s", + "value": 10000.0 + }, { + "label": "100 MiB/s", + "value": 100000.0 + }, { + "label": "200 MiB/s", + "value": 200000.0 + }, { + "label": "500 MiB/s", + "value": 500000.0 + }, { + "label": "1 GiB/s", + "value": 1000000.0 + }, { + "label": "2 GiB/s", + "value": 2000000.0 + }, { + "label": "5 GiB/s", + "value": 5000000.0 + }, { + "label": "10 GiB/s", + "value": 10000000.0 + }] + + // Detect network interfaces + RMComponents.NetworkInterfaceDetector { + id: networkInterfaces + } + // Detect GPU cards + RMComponents.GpuDetector { + id: gpuCards + + onReady: gpuCardSelector.select() + } + + // Tab bar + header: PlasmaExtras.PlasmoidHeading { + location: PlasmaExtras.PlasmoidHeading.Location.Header + + PlasmaComponents.TabBar { + id: bar + + position: PlasmaComponents.TabBar.Header + anchors.fill: parent + implicitHeight: contentHeight + + PlasmaComponents.TabButton { + icon.name: "settings" + icon.height: PlasmaCore.Units.iconSizes.smallMedium + text: i18nc("Config header", "General") + } + PlasmaComponents.TabButton { + icon.name: "dialog-warning" + icon.height: PlasmaCore.Units.iconSizes.smallMedium + text: i18nc("Config header", "Thresholds") + } + } + } + + QtLayouts.StackLayout { + id: pageContent + anchors.fill: parent + currentIndex: bar.currentIndex + + // General + Kirigami.ScrollablePage { + Kirigami.FormLayout { + wideMode: true + + // Network + Kirigami.Separator { + Kirigami.FormData.label: i18nc("Chart name", "Network") + Kirigami.FormData.isSection: true + } + + // Interfaces + QtLayouts.GridLayout { + Kirigami.FormData.label: i18n("Network interfaces:") + QtLayouts.Layout.fillWidth: true + + columns: 2 + rowSpacing: Kirigami.Units.smallSpacing + columnSpacing: Kirigami.Units.largeSpacing + + Repeater { + model: networkInterfaces.model + QtControls.CheckBox { + readonly property string interfaceName: modelData + readonly property bool ignoredByDefault: { + return /^(docker|tun|tap)(\d+)/.test(interfaceName); // Ignore docker and tun/tap networks + } + + text: interfaceName + checked: cfg_ignoredNetworkInterfaces.indexOf(interfaceName) == -1 && !ignoredByDefault + enabled: !ignoredByDefault + + onClicked: { + var ignoredNetworkInterfaces = cfg_ignoredNetworkInterfaces.slice(0); // copy() + if (checked) { + // Checking, and thus removing from the ignoredNetworkInterfaces + var i = ignoredNetworkInterfaces.indexOf(interfaceName); + ignoredNetworkInterfaces.splice(i, 1); + } else { + // Unchecking, and thus adding to the ignoredNetworkInterfaces + ignoredNetworkInterfaces.push(interfaceName); + } + cfg_ignoredNetworkInterfaces = ignoredNetworkInterfaces; + } + } + } + } + + // Transfer speed + Item { + Kirigami.FormData.label: i18n("Maximum transfer speed") + Kirigami.FormData.isSection: true + } + + RMControls.PredefinedSpinBox { + id: networkReceiving + Kirigami.FormData.label: i18nc("Chart config", "Receiving:") + QtLayouts.Layout.fillWidth: true + QtLayouts.Layout.minimumWidth: predefinedChoices.currentIndex == 0 ? 300 : 0 + factor: 1000 + + predefinedChoices { + textRole: "label" + valueRole: "value" + model: networkSpeedOptions + } + + spinBox { + decimals: 3 + stepSize: 1 + minimumValue: 0.001 + + textFromValue: function (value, locale) { + return spinBox.valueToText(value, locale) + " M" + networkDialect.suffix; + } + } + } + + RMControls.PredefinedSpinBox { + id: networkSending + Kirigami.FormData.label: i18nc("Chart config", "Sending:") + QtLayouts.Layout.fillWidth: true + QtLayouts.Layout.minimumWidth: predefinedChoices.currentIndex == 0 ? 300 : 0 + factor: 1000 + + predefinedChoices { + textRole: "label" + valueRole: "value" + model: networkSpeedOptions + } + + spinBox { + decimals: 3 + stepSize: 1 + minimumValue: 0.001 + + textFromValue: function (value, locale) { + return spinBox.valueToText(value, locale) + " M" + networkDialect.suffix; + } + } + } + + // Disk I/O + Kirigami.Separator { + Kirigami.FormData.label: i18nc("Chart name", "Disks I/O") + Kirigami.FormData.isSection: true + } + + Item { + Kirigami.FormData.label: i18n("Maximum transfer speed") + Kirigami.FormData.isSection: true + } + + RMControls.PredefinedSpinBox { + id: diskRead + Kirigami.FormData.label: i18nc("Chart config", "Read:") + QtLayouts.Layout.fillWidth: true + QtLayouts.Layout.minimumWidth: predefinedChoices.currentIndex == 0 ? 300 : 0 + factor: 1000 + + predefinedChoices { + textRole: "label" + valueRole: "value" + model: diskSpeedOptions + } + + spinBox { + decimals: 3 + stepSize: 1 + minimumValue: 0.001 + + textFromValue: function (value, locale) { + return spinBox.valueToText(value, locale) + " M" + networkDialect.suffix; + } + } + } + + RMControls.PredefinedSpinBox { + id: diskWrite + Kirigami.FormData.label: i18nc("Chart config", "Write:") + QtLayouts.Layout.fillWidth: true + QtLayouts.Layout.minimumWidth: predefinedChoices.currentIndex == 0 ? 300 : 0 + factor: 1000 + + predefinedChoices { + textRole: "label" + valueRole: "value" + model: diskSpeedOptions + } + + spinBox { + decimals: 3 + stepSize: 1 + minimumValue: 0.001 + + textFromValue: function (value, locale) { + return spinBox.valueToText(value, locale) + " M" + networkDialect.suffix; + } + } + } + + // GPU + Kirigami.Separator { + Kirigami.FormData.label: i18nc("Config header", "Graphic card") + Kirigami.FormData.isSection: true + } + + QtControls.ComboBox { + id: gpuCardSelector + QtLayouts.Layout.fillWidth: true + Kirigami.FormData.label: i18n("Graphic card:") + + currentIndex: -1 + textRole: "name" + valueRole: "index" + model: gpuCards.model + + onActivated: cfg_gpuIndex = currentValue + function select() { + currentIndex = indexOfValue(cfg_gpuIndex); + } + } + } + } + + // Thresholds + Kirigami.ScrollablePage { + Kirigami.FormLayout { + id: thresholdsPage + wideMode: true + + property double kirigamiWidth: preferredWidth * 2 + Kirigami.Units.largeSpacing + property double preferredWidth: { + const minimumWidth = Math.max(80, warningHeader.contentWidth, criticalHeader.contentWidth); + return Math.max(minimumWidth, + // CPU + thresholdWarningCpuTemp.implicitWidth, thresholdCriticalCpuTemp.implicitWidth, + // Memory + thresholdWarningMemory.implicitWidth, thresholdCriticalMemory.implicitWidth, + // Memory + thresholdWarningMemory.implicitWidth, thresholdCriticalMemory.implicitWidth, + // GPU + thresholdWarningGpuTemp.implicitWidth, thresholdCriticalGpuTemp.implicitWidth); + } + + // Header + QtLayouts.RowLayout { + QtLayouts.Layout.fillWidth: true + spacing: Kirigami.Units.largeSpacing + + PlasmaComponents.Label { + id: warningHeader + text: i18n("Warning") + font.pointSize: PlasmaCore.Theme.defaultFont.pointSize * 1.2 + QtLayouts.Layout.preferredWidth: thresholdsPage.preferredWidth + } + + PlasmaComponents.Label { + id: criticalHeader + text: i18n("Critical") + font.pointSize: PlasmaCore.Theme.defaultFont.pointSize * 1.2 + } + } + + // CPU Temperature + QtLayouts.RowLayout { + Kirigami.FormData.label: i18n("CPU Temperature:") + QtLayouts.Layout.preferredWidth: thresholdsPage.kirigamiWidth + spacing: Kirigami.Units.largeSpacing + + RMControls.SpinBox { + id: thresholdWarningCpuTemp + QtLayouts.Layout.preferredWidth: thresholdsPage.preferredWidth + decimals: 1 + stepSize: 1 + minimumValue: 0.1 + maximumValue: 120 + + textFromValue: function (value, locale) { + return valueToText(value, locale) + " °C"; + } + } + RMControls.SpinBox { + id: thresholdCriticalCpuTemp + QtLayouts.Layout.preferredWidth: thresholdsPage.preferredWidth + decimals: 1 + stepSize: 1 + minimumValue: 0.1 + maximumValue: 120 + + textFromValue: function (value, locale) { + return valueToText(value, locale) + " °C"; + } + } + } + + // Memory usage + QtLayouts.RowLayout { + Kirigami.FormData.label: i18n("Physical Memory Usage:") + QtLayouts.Layout.preferredWidth: thresholdsPage.kirigamiWidth + spacing: Kirigami.Units.largeSpacing + + RMControls.SpinBox { + id: thresholdWarningMemory + QtLayouts.Layout.preferredWidth: thresholdsPage.preferredWidth + + textFromValue: function (value, locale) { + return value + " %"; + } + } + RMControls.SpinBox { + id: thresholdCriticalMemory + QtLayouts.Layout.preferredWidth: thresholdsPage.preferredWidth + + textFromValue: function (value, locale) { + return value + " %"; + } + } + } + + // GPU Temperature + QtLayouts.RowLayout { + Kirigami.FormData.label: i18n("GPU Temperature:") + QtLayouts.Layout.preferredWidth: thresholdsPage.kirigamiWidth + spacing: Kirigami.Units.largeSpacing + + RMControls.SpinBox { + id: thresholdWarningGpuTemp + QtLayouts.Layout.preferredWidth: thresholdsPage.preferredWidth + + decimals: 1 + stepSize: 1 + minimumValue: 0.1 + maximumValue: 120 + + textFromValue: function (value, locale) { + return valueToText(value, locale) + " °C"; + } + } + RMControls.SpinBox { + id: thresholdCriticalGpuTemp + QtLayouts.Layout.preferredWidth: thresholdsPage.preferredWidth + + decimals: 1 + stepSize: 1 + minimumValue: 0.1 + maximumValue: 120 + + textFromValue: function (value, locale) { + return valueToText(value, locale) + " °C"; + } + } + } + } + } + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/config/ConfigGeneral.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/config/ConfigGeneral.qml new file mode 100644 index 0000000..3eb0392 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/config/ConfigGeneral.qml @@ -0,0 +1,453 @@ +import QtQuick 2.2 +import QtQuick.Controls 2.12 as QtControls +import QtQuick.Layouts 1.15 as QtLayouts +import org.kde.kirigami 2.6 as Kirigami +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.components 2.0 as PC2 +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.extras 2.0 as PlasmaExtras +import "../components" as RMComponents +import "../controls" as RMControls + +PlasmaExtras.Representation { + id: page + anchors.fill: parent + + // Charts + property alias cfg_updateInterval: updateInterval.realValue + // > CPU + property bool cfg_showCpuMonitor + property string cfg_cpuUnit + property bool cfg_showClock + property string cfg_clockAgregator + property alias cfg_showCpuTemperature: showCpuTemperature.checked + // > Memory + property bool cfg_showRamMonitor + property string cfg_memoryUnit + property alias cfg_memorySwapGraph: memorySwapGraph.checked + // > Network + property bool cfg_showNetMonitor + property string cfg_networkUnit + // > GPU + property alias cfg_showGpuMonitor: showGpuMonitor.checked + property alias cfg_gpuMemoryInPercent: gpuMemoryInPercent.checked + property alias cfg_gpuMemoryGraph: gpuMemoryGraph.checked + property alias cfg_showGpuTemperature: showGpuTemperature.checked + // > Disks I/O + property alias cfg_showDiskMonitor: showDiskMonitor.checked + + // Click action + property string cfg_actionService + + // Apps model + RMComponents.AppsDetector { + id: appsModel + + filterString: appsFilter.text + filterCallback: function (index, value) { + var search = filterString.toLowerCase(); + if (search.length === 0) { + return true; + } + if (value.toLowerCase().indexOf(search) !== -1) { + return true; + } + if (sourceModel.get(index).menuId.replace(".desktop", "").toLowerCase().indexOf(search) !== -1) { + return true; + } + return false; + } + + onFilterStringChanged: appsList.updateCurrentIndex() + } + + // Tab bar + header: PlasmaExtras.PlasmoidHeading { + location: PlasmaExtras.PlasmoidHeading.Location.Header + + PlasmaComponents.TabBar { + id: bar + + position: PlasmaComponents.TabBar.Header + anchors.fill: parent + implicitHeight: contentHeight + + PlasmaComponents.TabButton { + icon.name: "settings" + icon.height: PlasmaCore.Units.iconSizes.smallMedium + text: i18nc("Config header", "General") + } + PlasmaComponents.TabButton { + icon.name: "input-mouse-symbolic" + icon.height: PlasmaCore.Units.iconSizes.smallMedium + text: i18nc("Config header", "Click action") + } + } + } + + QtLayouts.StackLayout { + id: pageContent + anchors.fill: parent + currentIndex: bar.currentIndex + + // General + Kirigami.ScrollablePage { + Kirigami.FormLayout { + wideMode: true + + RMControls.SpinBox { + id: updateInterval + Kirigami.FormData.label: i18n("Update interval:") + QtLayouts.Layout.fillWidth: true + + decimals: 1 + minimumValue: 0.1 + maximumValue: 3600.0 + stepSize: Math.round(0.1 * factor) + + textFromValue: function (value, locale) { + return i18n("%1 seconds", valueToText(value, locale)); + } + } + + // Charts + Kirigami.Separator { + Kirigami.FormData.label: i18nc("Config header", "Charts") + Kirigami.FormData.isSection: true + } + + // CPU + Item { + Kirigami.FormData.label: i18nc("Chart name", "CPU") + Kirigami.FormData.isSection: true + } + + QtControls.ComboBox { + QtLayouts.Layout.fillWidth: true + Kirigami.FormData.label: i18n("Visibility:") + + currentIndex: -1 + textRole: "label" + valueRole: "value" + model: [{ + "label": i18n("Disabled"), + "value": "none" + }, { + "label": i18n("Total usage"), + "value": "usage" + }, { + "label": i18n("System usage"), + "value": "system" + }, { + "label": i18n("User usage"), + "value": "user" + }] + + onActivated: { + if (currentValue === "none") { + cfg_showCpuMonitor = false; + } else { + cfg_showCpuMonitor = true; + cfg_cpuUnit = currentValue; + } + } + Component.onCompleted: { + // TODO (3.0): Merge "cfg_showCpuMonitor" and "cfg_cpuUnit" + currentIndex = cfg_showCpuMonitor ? indexOfValue(cfg_cpuUnit) : 0; + } + } + + QtControls.ComboBox { + QtLayouts.Layout.fillWidth: true + Kirigami.FormData.label: i18n("Clock visibility:") + enabled: cfg_showCpuMonitor + + currentIndex: -1 + textRole: "label" + valueRole: "value" + model: [{ + "label": i18n("Disabled"), + "value": "none" + }, { + "label": i18nc("Agregator", "Average"), + "value": "average" + }, { + "label": i18nc("Agregator", "Minimum"), + "value": "minimum" + }, { + "label": i18nc("Agregator", "Maximum"), + "value": "maximum" + }] + + onActivated: { + if (currentValue === "none") { + cfg_showClock = false; + } else { + cfg_showClock = true; + cfg_clockAgregator = currentValue; + } + } + Component.onCompleted: { + // TODO (3.0): Merge "cfg_showClock" and "cfg_clockAgregator" + currentIndex = cfg_showClock ? indexOfValue(cfg_clockAgregator) : 0; + } + } + + QtControls.CheckBox { + id: showCpuTemperature + text: i18n("Show temperature") + enabled: cfg_showCpuMonitor + } + + // Memory + Rectangle { + height: Kirigami.Units.largeSpacing + color: "transparent" + } + Item { + Kirigami.FormData.label: i18nc("Chart name", "Memory") + Kirigami.FormData.isSection: true + } + + QtControls.ComboBox { + QtLayouts.Layout.fillWidth: true + Kirigami.FormData.label: i18n("Visibility:") + + currentIndex: -1 + textRole: "label" + valueRole: "value" + model: [{ + "label": i18n("Disabled"), + "value": "none" + }, { + "label": i18n("Physical memory (in KiB)"), + "value": "physical" + }, { + "label": i18n("Physical memory (in %)"), + "value": "physical-percent" + }, { + "label": i18n("Application memory (in KiB)"), + "value": "application" + }, { + "label": i18n("Application memory (in %)"), + "value": "application-percent" + }] + + onActivated: { + if (currentValue === "none") { + cfg_showRamMonitor = false; + } else { + cfg_showRamMonitor = true; + cfg_memoryUnit = currentValue; + } + } + Component.onCompleted: { + // TODO (3.0): Merge "cfg_showRamMonitor" and "cfg_memoryUnit" + currentIndex = cfg_showRamMonitor ? indexOfValue(cfg_memoryUnit) : 0; + } + } + + QtLayouts.GridLayout { + QtLayouts.Layout.fillWidth: true + columns: 2 + rowSpacing: Kirigami.Units.smallSpacing + columnSpacing: Kirigami.Units.largeSpacing + + QtControls.CheckBox { + id: memorySwapGraph + text: i18n("Show swap") + enabled: cfg_showRamMonitor + } + } + + // Network + Rectangle { + height: Kirigami.Units.largeSpacing + color: "transparent" + } + Item { + Kirigami.FormData.label: i18nc("Chart name", "Network") + Kirigami.FormData.isSection: true + } + + QtControls.ComboBox { + QtLayouts.Layout.fillWidth: true + Kirigami.FormData.label: i18n("Visibility:") + + currentIndex: -1 + textRole: "label" + valueRole: "value" + model: [{ + "label": i18n("Disabled"), + "value": "none" + }, { + "label": i18n("In kibibyte (KiB/s)"), + "value": "kibibyte" + }, { + "label": i18n("In kilobit (Kbps)"), + "value": "kilobit" + }, { + "label": i18n("In kilobyte (KBps)"), + "value": "kilobyte" + }] + + onActivated: { + if (currentValue === "none") { + cfg_showNetMonitor = false; + } else { + cfg_showNetMonitor = true; + cfg_networkUnit = currentValue; + } + } + Component.onCompleted: { + // TODO (3.0): Merge "cfg_showNetMonitor" and "cfg_networkUnit" + currentIndex = cfg_showNetMonitor ? indexOfValue(cfg_networkUnit) : 0; + } + } + + // GPU + Rectangle { + height: Kirigami.Units.largeSpacing + color: "transparent" + } + Item { + Kirigami.FormData.label: i18nc("Chart name", "GPU") + Kirigami.FormData.isSection: true + } + + QtLayouts.GridLayout { + QtLayouts.Layout.fillWidth: true + columns: 2 + rowSpacing: Kirigami.Units.smallSpacing + columnSpacing: Kirigami.Units.largeSpacing + + QtControls.CheckBox { + id: showGpuMonitor + text: i18n("Enabled?") + } + QtControls.CheckBox { + id: gpuMemoryGraph + text: i18n("Show memory") + enabled: showGpuMonitor.checked + } + QtControls.CheckBox { + id: gpuMemoryInPercent + text: i18n("Memory in percent") + enabled: showGpuMonitor.checked + } + QtControls.CheckBox { + id: showGpuTemperature + text: i18n("Show temperature") + enabled: showGpuMonitor.checked + } + } + + // Disk I/O + Rectangle { + height: Kirigami.Units.largeSpacing + color: "transparent" + } + Item { + Kirigami.FormData.label: i18nc("Chart name", "Disks I/O") + Kirigami.FormData.isSection: true + } + + QtLayouts.GridLayout { + QtLayouts.Layout.fillWidth: true + columns: 2 + rowSpacing: Kirigami.Units.smallSpacing + columnSpacing: Kirigami.Units.largeSpacing + + QtControls.CheckBox { + id: showDiskMonitor + text: i18n("Enabled?") + } + } + } + } + + // Click action + QtLayouts.ColumnLayout { + id: clickPage + spacing: Kirigami.Units.largeSpacing + + Kirigami.FormLayout { + wideMode: true + + QtControls.TextField { + id: appsFilter + Kirigami.FormData.label: i18n("Search an application:") + QtLayouts.Layout.fillWidth: true + placeholderText: i18n("Application name") + inputMethodHints: Qt.ImhNoPredictiveText + } + } + + // Apps list + PlasmaComponents.Label { + text: i18n("Applications") + font.pointSize: PlasmaCore.Theme.defaultFont.pointSize * 1.2 + } + + Item { + QtLayouts.Layout.fillWidth: true + QtLayouts.Layout.fillHeight: true + + Rectangle { + anchors.fill: parent + color: theme.headerBackgroundColor + border.color: theme.complementaryBackgroundColor + border.width: 1 + radius: 4 + } + + PlasmaComponents.ScrollView { + anchors.fill: parent + anchors.margins: 10 + anchors.rightMargin: 5 + + ListView { + id: appsList + + model: appsModel + clip: true + interactive: true + + highlight: PC2.Highlight { + } + highlightMoveDuration: 0 + highlightMoveVelocity: -1 + + delegate: RMComponents.ApplicationDelegateItem { + width: root.width + + serviceName: model.menuId.replace(".desktop", "") + name: model.name + comment: model.comment + iconName: model.iconName + selected: ListView.isCurrentItem + + onClicked: { + appsList.currentIndex = index; + cfg_actionService = serviceName; + } + } + + Component.onCompleted: updateCurrentIndex() + + function updateCurrentIndex() { + for (var i = 0; i < model.count; i++) { + if (model.get(i).menuId === cfg_actionService + ".desktop") { + currentIndex = i; + return; + } + } + currentIndex = -1; + } + } + } + } + } + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/ColorSelector.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/ColorSelector.qml new file mode 100644 index 0000000..061759d --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/ColorSelector.qml @@ -0,0 +1,49 @@ +import QtQuick 2.2 +import QtQuick.Dialogs 1.0 as QtDialog +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.kirigami 2.6 as Kirigami + +PlasmaComponents.Button { + id: colorSelector + + // Aliases + property alias value: colorPicker.currentColor + + // Properties + property string label + property string dialogTitle + property color defaultColor + property bool customized + + // Customized checkbox + enabled: Kirigami.FormData.checked + Kirigami.FormData.checkable: true + Kirigami.FormData.checked: customized + + onEnabledChanged: customized = enabled + onClicked: colorPicker.open() + + // Size + topPadding: 12 + bottomPadding: topPadding + leftPadding: topPadding * 2 + rightPadding: leftPadding + + // Components + QtDialog.ColorDialog { + id: colorPicker + title: dialogTitle + } + MouseArea { + id: mouseArea + anchors.fill: parent + onPressed: mouse.accepted = false + cursorShape: enabled ? Qt.PointingHandCursor : Qt.ArrowCursor + } + + background: Rectangle { + color: customized ? colorPicker.currentColor : defaultColor + opacity: colorPicker.enabled ? 1 : 0.75 + radius: 2 + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/CustomizableSize.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/CustomizableSize.qml new file mode 100644 index 0000000..9ed8919 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/CustomizableSize.qml @@ -0,0 +1,20 @@ +import QtQuick 2.2 +import org.kde.kirigami 2.6 as Kirigami +import "./" as RMControls + +RMControls.SpinBox { + id: customizableSize + + property bool customized + + // Customized checkbox + enabled: Kirigami.FormData.checked + Kirigami.FormData.checkable: true + Kirigami.FormData.checked: customized + onEnabledChanged: customized = enabled + + // Component + textFromValue: function (value, locale) { + return valueToText(value, locale) + " px"; + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/PredefinedSpinBox.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/PredefinedSpinBox.qml new file mode 100644 index 0000000..1c67c33 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/PredefinedSpinBox.qml @@ -0,0 +1,57 @@ +import QtQuick 2.0 +import QtQuick.Layouts 1.15 as QtLayouts +import QtQuick.Controls 2.0 as QQC2 +import org.kde.kirigami 2.6 as Kirigami +import "./" as RMControls + +QtLayouts.RowLayout { + spacing: Kirigami.Units.largeSpacing + + property alias predefinedChoices: predefinedChoices + property alias spinBox: spinBox + + property int customValueIndex: 0 + property real factor: 1 // This is for auto convert from Kilo, Mega, etc + + property real value: Math.round(realValue / factor) + property real realValue + + Component.onCompleted: { + // Initialize spin real value + spinBox.realValue = value; + + // Bind "realValue" to "spinBox.realValue" and "factor" + realValue = Qt.binding(() => spinBox.realValue * factor); + } + + QQC2.ComboBox { + id: predefinedChoices + QtLayouts.Layout.fillWidth: true + currentIndex: -1 + + onActivated: { + // Skip update spin box if user select custom option + if (currentIndex === customValueIndex) { + return; + } + + // Set value from choice in spin box (for have only one place to manage value) + if (currentValue !== -1) { + spinBox.realValue = valueFromPredefinedChoice(currentValue, currentIndex); + } + } + + // Auto select predefined choice + Component.onCompleted: { + const index = indexOfValue(realValue); + currentIndex = index !== -1 ? index : customValueIndex; + } + } + RMControls.SpinBox { + id: spinBox + QtLayouts.Layout.fillWidth: true + visible: predefinedChoices.currentIndex === customValueIndex + } + + property var valueFromPredefinedChoice: (value, index) => value / factor +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/SpinBox.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/SpinBox.qml new file mode 100644 index 0000000..030f027 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/controls/SpinBox.qml @@ -0,0 +1,125 @@ +/** + * Example: +import "./components/controls" as RMControls +// Integer +RMControls.SpinBox { + from: 0 + to: 1000 + stepSize: 5 + + textFromValue: function(value, locale) { + return valueToText(value, locale) + " px" + } +} +// Double +RMControls.SpinBox { + decimals: 3 + minimumValue: 0.0 + maximumValue: 1000.0 + stepSize: Math.round(0.5 * factor) + + textFromValue: function(value, locale) { + return valueToText(value, locale) + " m" + } +} + */ +import QtQuick 2.0 +import QtQuick.Controls 2.0 as QQC2 +import org.kde.plasma.core 2.0 as PlasmaCore + +QQC2.SpinBox { + id: control + editable: true + + readonly property real factor: Math.pow(10, decimals) + readonly property int spinBox_MININT: Math.ceil(-2147483648 / factor) + readonly property int spinBox_MAXINT: Math.floor(2147483647 / factor) + + value: Math.round(realValue * factor) + from: Math.round(minimumValue * factor) + to: Math.round(maximumValue * factor) + + // Copry from https://doc.qt.io/qt-5/qml-qtquick-controls2-spinbox.html#custom-values + property int decimals: 0 + property real realValue + + property real minimumValue: 0 + property real maximumValue: spinBox_MAXINT + + // Bind "realValue" to "value" and "factor" + Component.onCompleted: { + realValue = Qt.binding(() => value / factor); + } + + validator: DoubleValidator { + locale: control.locale.name + bottom: Math.min(control.from, control.to) + top: Math.max(control.from, control.to) + } + + textFromValue: valueToText + valueFromText: (text, locale) => { + text = text.replace(/[^\-\.\d]/g, ""); // Remove non digit characters + if (text === ".") { + text = "0"; + } + return Number.fromLocaleString(locale, text) * factor; + } + + property var valueToText: (value, locale) => { + // "toLocaleString" has no concept of "the minimum amount of + // digits to represent this number", so we need to calculate this + // manually. This ensures that things like "0" and "10" will be + // displayed without any decimals, while things like "2.2" and + // "3.87" will be displayed with the right number of decimals. + const realValue = Number(value / factor); + return realValue.toLocaleString(locale, 'f', countDecimals(realValue)); + } + + contentItem: TextInput { + opacity: enabled ? 1 : 0.5 + text: control.displayText + font: control.font + color: PlasmaCore.Theme.viewTextColor + selectionColor: PlasmaCore.Theme.highlightColor + selectedTextColor: PlasmaCore.Theme.highlightedTextColor + verticalAlignment: Qt.AlignVCenter + readOnly: !control.editable + validator: control.validator + inputMethodHints: control.inputMethodHints + selectByMouse: true + + // Accept return/enter key + Keys.onReturnPressed: returnPressed = true + Keys.onEnterPressed: returnPressed = true + + // Reselect field when validate value with "return" + property bool returnPressed + onTextChanged: { + if (returnPressed) { + returnPressed = false; + selectAll(); + } + } + } + + // Allow cancel editing + Keys.onEscapePressed: { + contentItem.text = textFromValue(value, locale.name); + focus = false; + } + + // Select value on foucs + onActiveFocusChanged: { + if (activeFocus) { + contentItem.selectAll(); + } + } + + function countDecimals(value) { + if (Math.floor(value) === value) { + return 0; + } + return value.toString().split(".")[1].length || 0; + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/main.qml b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/main.qml new file mode 100644 index 0000000..b907442 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/contents/ui/main.qml @@ -0,0 +1,123 @@ +/* + * Copyright 2015 Martin Kotelnik + * + * This program 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 2 of + * the License, or (at your option) any later version. + * + * This program 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 this program. If not, see . + */ +import QtQuick 2.9 +import QtQuick.Layouts 1.1 +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.kio 1.0 as Kio +import "./components/graph" as RMGraph + +MouseArea { + id: root + + readonly property bool vertical: plasmoid.formFactor === PlasmaCore.Types.Vertical + + // Settings properties + property bool verticalLayout: plasmoid.configuration.verticalLayout + property double fontScale: (plasmoid.configuration.fontScale / 100) + + // Component properties + property int itemMargin: plasmoid.configuration.graphMargin + property double parentWidth: parent === null ? 0 : parent.width + property double parentHeight: parent === null ? 0 : parent.height + property double initWidth: vertical ? (verticalLayout ? parentWidth : (parentWidth - itemMargin) / 2) : (verticalLayout ? (parentHeight - itemMargin) / 2 : parentHeight) + property double itemWidth: plasmoid.configuration.customGraphWidth ? plasmoid.configuration.graphWidth : Math.round(initWidth * (verticalLayout ? 1 : 1.5)) + property double itemHeight: plasmoid.configuration.customGraphHeight ? plasmoid.configuration.graphHeight : Math.round(initWidth) + property double fontPixelSize: Math.round(verticalLayout ? (itemHeight / 1.4 * fontScale) : (itemHeight * fontScale)) + + Layout.preferredWidth: !verticalLayout ? (itemWidth * graphView.model.length + itemMargin * (graphView.model.length + 1)) : itemWidth + Layout.preferredHeight: verticalLayout ? (itemHeight * graphView.model.length + itemMargin * (graphView.model.length + 1)) : itemHeight + LayoutMirroring.enabled: !vertical && Qt.application.layoutDirection === Qt.RightToLeft + LayoutMirroring.childrenInherit: true + + Plasmoid.preferredRepresentation: Plasmoid.fullRepresentation + + // Click action + Kio.KRun { + id: kRun + } + + onClicked: { + kRun.openService(plasmoid.configuration.actionService); + } + + // Global update timer + Timer { + id: updateTask + interval: plasmoid.configuration.updateInterval * 1000 + + running: true + triggeredOnStart: true + repeat: true + + onTriggered: { + for (const i in graphView.model) { + const graph = graphView.getGraph(i); + if (graph !== null) { + graph._update(); + } + } + } + } + + // Main Layout + ListView { + id: graphView + anchors.fill: parent + spacing: itemMargin + orientation: verticalLayout ? ListView.Vertical : ListView.Horizontal + interactive: false + + model: plasmoid.configuration.graphOrders.filter(item => { + if (item === "cpu") { + return plasmoid.configuration.showCpuMonitor; + } else if (item === "disks") { + return plasmoid.configuration.showDiskMonitor; + } else if (item === "gpu") { + return plasmoid.configuration.showGpuMonitor; + } else if (item === "memory") { + return plasmoid.configuration.showRamMonitor; + } else if (item === "network") { + return plasmoid.configuration.showNetMonitor; + } + return false; + }) + + delegate: Loader { + source: _graphIdToFilename(modelData) + + width: itemWidth + height: itemHeight + + onLoaded: { + item.textContainer.firstLineLabel.font.pixelSize = Qt.binding(() => root.fontPixelSize); + item.textContainer.secondLineLabel.font.pixelSize = Qt.binding(() => root.fontPixelSize); + item.textContainer.thirdLineLabel.font.pixelSize = Qt.binding(() => root.fontPixelSize); + } + } + + function getGraph(index) { + const loaderItem = graphView.itemAtIndex(index); + return loaderItem !== null ? loaderItem.item : null; + } + } + + function _graphIdToFilename(graphId) { + const filename = (graphId.charAt(0).toUpperCase() + graphId.slice(1)) + "Graph"; + return "./components/graph/" + filename + ".qml"; + } +} diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/metadata.json b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/metadata.json new file mode 100644 index 0000000..669811c --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/metadata.json @@ -0,0 +1,31 @@ +{ + "KPlugin": { + "Authors": [ + { + "Name": "Kotelnik" + }, + { + "Name": "orblazer" + }, + { + "Name": "Starrah" + } + ], + "Category": "System Information", + "Description": "Plasmoid for monitoring CPU, memory, network traffic GPU and disk IO. This is an fork from \"Resources Monitor\" by Kotelnik", + "Description[fr]": "Plasmoid pour surveiller l'utilisation du CPU, de la mémoire, du traffic réseau, de la carte graphique et des disque dur. Ceci est un fork de \"Resources Monitor\" de Kotelnik", + "Description[nl]": "Een Plasmoid voor het monitoren van CPU, geheugen, netwerkverkeer GPU en disk IO. Dit is een vork uit \"Resources Monitor\" van Kotelnik.", + "Icon": "utilities-system-monitor", + "Id": "org.kde.resourcesMonitor-fork", + "License": "GPL-3.0-only", + "Name": "Resources Monitor (fork)", + "Name[fr]": "Moniteur des ressources (fork)", + "Name[nl]": "Systeembronmonitor (afsplitsing)", + "Version": "2.10.2", + "Website": "https://github.com/orblazer/plasma-applet-resources-monitor", + "BugReportUrl": "https://github.com/orblazer/plasma-applet-resources-monitor/issues" + }, + "X-Plasma-API": "declarativeappletscript", + "X-Plasma-MainScript": "ui/main.qml", + "KPackageStructure": "Plasma/Applet" +} \ No newline at end of file diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/README.md b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/README.md new file mode 100644 index 0000000..c14cfd3 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/README.md @@ -0,0 +1,29 @@ +# Translations + +You can found found the list of locale code here : [List of country locale code](https://saimana.com/list-of-country-locale-code/) + +## New Translations + +1. Fill out [`template.pot`](template.pot) with your translations then open a [new issue](https://github.com/orblazer/plasma-applet-resources-monitor/issues/new), name the file `spanish.txt`, attach the txt file to the issue (drag and drop). + +Or if you know how to make a pull request + +1. Copy the `template.pot` file and name it your locale's code (Eg: `en`/`de`/`fr`) with the extension `.po`. Then fill out all the `msgstr ""`. +2. Add `Name` and `Description` translation to `../metadata.json` +3. Build the translation with `npm run i18n:build` +4. Test the translation with `LANGUAGE="country_CODE:locale" LANG="country_CODE.UTF-8" npm run dev` + + **Note** : You need install language pack first. + +## Scripts + +- `npm run i18:merge` will parse the `i18n()` calls in the `*.qml` files and write it to the `template.pot` file. Then it will merge any changes into the `*.po` language files. +- `npm run i18n:build` will convert the `*.po` files to it's binary `*.mo` version and move it to `contents/locale/...` which will bundle the translations in the `*.plasmoid` without needing the user to manually install them. + +## Status + +| Locale | Lines | % Done| +|----------|---------|-------| +| Template | 95 | | +| fr | 95/95 | 100% | +| nl | 95/95 | 100% | diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/fr.po b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/fr.po new file mode 100644 index 0000000..eb9ce66 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/fr.po @@ -0,0 +1,453 @@ +# Translation of resourcesMonitor-fork in french +# Copyright (C) 2021 +# This file is distributed under the same license as the resourcesMonitor-fork package. +# orblazer, 2021. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: resourcesMonitor-fork\n" +"Report-Msgid-Bugs-To: https://github.com/orblazer/plasma-applet-resources-monitor\n" +"POT-Creation-Date: 2023-05-31 18:43+0200\n" +"PO-Revision-Date: 2023-05-31 18:43+0200\n" +"Last-Translator: orblazer\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../contents/config/config.qml:6 ../contents/ui/config/ConfigData.qml:120 ../contents/ui/config/ConfigGeneral.qml:79 +msgctxt "Config header" +msgid "General" +msgstr "Général" + +#: ../contents/config/config.qml:11 +msgctxt "Config header" +msgid "Data" +msgstr "Données" + +#: ../contents/config/config.qml:16 +msgctxt "Config header" +msgid "Appearance" +msgstr "Apparence" + +#: ../contents/ui/components/functions.js:20 +msgctxt "kilobyte suffix" +msgid "Bps" +msgstr "ops" + +#: ../contents/ui/components/functions.js:28 +msgctxt "kilobit suffix" +msgid "bps" +msgstr "bps" + +#: ../contents/ui/components/functions.js:36 +msgctxt "kibibyte suffix" +msgid "iB/s" +msgstr "io/s" + +#: ../contents/ui/components/graph/CpuGraph.qml:41 +msgctxt "Graph label" +msgid "Clock" +msgstr "Horloge" + +#: ../contents/ui/components/graph/CpuGraph.qml:41 ../contents/ui/components/graph/GpuGraph.qml:32 +msgctxt "Graph label" +msgid "Temp." +msgstr "Temp." + +#: ../contents/ui/components/graph/DisksGraph.qml:28 +msgctxt "Graph label" +msgid "Read" +msgstr "Lecture" + +#: ../contents/ui/components/graph/DisksGraph.qml:28 +msgctxt "Graph label" +msgid "Write" +msgstr "Écriture" + +#: ../contents/ui/components/graph/GpuGraph.qml:56 +msgctxt "Percent unit" +msgid "%1%" +msgstr "%1%" + +#: ../contents/ui/components/graph/NetworkGraph.qml:31 +msgctxt "Graph label" +msgid "Receiving" +msgstr "Réception" + +#: ../contents/ui/components/graph/NetworkGraph.qml:31 +msgctxt "Graph label" +msgid "Sending" +msgstr "Envoi" + +#: ../contents/ui/config/ConfigAppearance.qml:76 ../contents/ui/config/ConfigAppearance.qml:361 +#: ../contents/ui/config/ConfigGeneral.qml:122 +msgctxt "Chart name" +msgid "CPU" +msgstr "CPU" + +#: ../contents/ui/config/ConfigAppearance.qml:81 ../contents/ui/config/ConfigAppearance.qml:386 +#: ../contents/ui/config/ConfigGeneral.qml:209 +msgctxt "Chart name" +msgid "Memory" +msgstr "Mémoire" + +#: ../contents/ui/config/ConfigAppearance.qml:86 ../contents/ui/config/ConfigAppearance.qml:436 +#: ../contents/ui/config/ConfigGeneral.qml:315 +msgctxt "Chart name" +msgid "GPU" +msgstr "GPU" + +#: ../contents/ui/config/ConfigAppearance.qml:91 ../contents/ui/config/ConfigAppearance.qml:468 +#: ../contents/ui/config/ConfigData.qml:239 ../contents/ui/config/ConfigGeneral.qml:352 +msgctxt "Chart name" +msgid "Disks I/O" +msgstr "Disques E/S" + +#: ../contents/ui/config/ConfigAppearance.qml:96 ../contents/ui/config/ConfigAppearance.qml:411 +#: ../contents/ui/config/ConfigData.qml:142 ../contents/ui/config/ConfigGeneral.qml:270 +msgctxt "Chart name" +msgid "Network" +msgstr "Réseau" + +#: ../contents/ui/config/ConfigAppearance.qml:115 ../contents/ui/config/ConfigGeneral.qml:116 +msgctxt "Config header" +msgid "Charts" +msgstr "Graphiques" + +#: ../contents/ui/config/ConfigAppearance.qml:120 +msgctxt "Config header" +msgid "Text" +msgstr "Texte" + +#: ../contents/ui/config/ConfigAppearance.qml:125 +msgctxt "Config header" +msgid "Colors" +msgstr "Couleurs" + +#: ../contents/ui/config/ConfigAppearance.qml:143 +msgid "Vertical layout" +msgstr "Disposition verticale" + +#: ../contents/ui/config/ConfigAppearance.qml:148 +msgid "History amount:" +msgstr "Quantité d'histoire :" + +#: ../contents/ui/config/ConfigAppearance.qml:155 +msgid "Width:" +msgstr "Largeur :" + +#: ../contents/ui/config/ConfigAppearance.qml:162 +msgid "Height:" +msgstr "Hauteur :" + +#: ../contents/ui/config/ConfigAppearance.qml:169 +msgid "Margin:" +msgstr "Marge :" + +#: ../contents/ui/config/ConfigAppearance.qml:180 +msgid "Fill opacity:" +msgstr "Opacité du remplissage :" + +#: ../contents/ui/config/ConfigAppearance.qml:192 +msgid "Charts order" +msgstr "Ordre des graphiques" + +#: ../contents/ui/config/ConfigAppearance.qml:280 +msgid "Drop shadows" +msgstr "Ombres portées" + +#: ../contents/ui/config/ConfigAppearance.qml:285 +msgid "Font scale:" +msgstr "Taille de la police :" + +#: ../contents/ui/config/ConfigAppearance.qml:297 +msgid "Text displayment:" +msgstr "Affichage du texte :" + +#: ../contents/ui/config/ConfigAppearance.qml:303 +msgctxt "Text displayment" +msgid "Always" +msgstr "Toujours" + +#: ../contents/ui/config/ConfigAppearance.qml:306 +msgctxt "Text displayment" +msgid "On hover" +msgstr "Au survol" + +#: ../contents/ui/config/ConfigAppearance.qml:309 +msgctxt "Text displayment" +msgid "Hints when hover" +msgstr "Indices au survol" + +#: ../contents/ui/config/ConfigAppearance.qml:319 +msgid "Placement:" +msgstr "Placement :" + +#: ../contents/ui/config/ConfigAppearance.qml:325 +msgctxt "Text placement" +msgid "Top left" +msgstr "En haut à gauche" + +#: ../contents/ui/config/ConfigAppearance.qml:328 +msgctxt "Text placement" +msgid "Top right" +msgstr "En haut à droite" + +#: ../contents/ui/config/ConfigAppearance.qml:331 +msgctxt "Text placement" +msgid "Bottom left" +msgstr "En bas à gauche" + +#: ../contents/ui/config/ConfigAppearance.qml:334 +msgctxt "Text placement" +msgid "Bottom right" +msgstr "En bas à droite" + +#: ../contents/ui/config/ConfigAppearance.qml:351 +msgid "Charts colors" +msgstr "Couleurs des graphiques" + +#: ../contents/ui/config/ConfigAppearance.qml:367 ../contents/ui/config/ConfigAppearance.qml:442 +msgctxt "Chart config" +msgid "Usage:" +msgstr "Utilisation :" + +#: ../contents/ui/config/ConfigAppearance.qml:369 ../contents/ui/config/ConfigAppearance.qml:394 +#: ../contents/ui/config/ConfigAppearance.qml:419 ../contents/ui/config/ConfigAppearance.qml:426 +#: ../contents/ui/config/ConfigAppearance.qml:444 ../contents/ui/config/ConfigAppearance.qml:451 +#: ../contents/ui/config/ConfigAppearance.qml:476 ../contents/ui/config/ConfigAppearance.qml:483 +msgctxt "Chart color" +msgid "Choose series color" +msgstr "Choisir la couleur de la série" + +#: ../contents/ui/config/ConfigAppearance.qml:374 ../contents/ui/config/ConfigAppearance.qml:456 +msgctxt "Chart config" +msgid "Temperature:" +msgstr "Température :" + +#: ../contents/ui/config/ConfigAppearance.qml:376 ../contents/ui/config/ConfigAppearance.qml:458 +msgctxt "Chart color" +msgid "Choose text color" +msgstr "Choisir la couleur du texte" + +#: ../contents/ui/config/ConfigAppearance.qml:392 +msgctxt "Chart config" +msgid "Physical:" +msgstr "Physique :" + +#: ../contents/ui/config/ConfigAppearance.qml:399 +msgctxt "Chart config" +msgid "Swap:" +msgstr "Swap :" + +#: ../contents/ui/config/ConfigAppearance.qml:401 +msgctxt "Chart color" +msgid "Choose color of series and text" +msgstr "Choisir la couleur de la série et du texte" + +#: ../contents/ui/config/ConfigAppearance.qml:417 ../contents/ui/config/ConfigData.qml:191 +msgctxt "Chart config" +msgid "Receiving:" +msgstr "Réception :" + +#: ../contents/ui/config/ConfigAppearance.qml:424 ../contents/ui/config/ConfigData.qml:215 +msgctxt "Chart config" +msgid "Sending:" +msgstr "Envoi :" + +#: ../contents/ui/config/ConfigAppearance.qml:449 +msgctxt "Chart config" +msgid "Memory:" +msgstr "Mémoire :" + +#: ../contents/ui/config/ConfigAppearance.qml:474 ../contents/ui/config/ConfigData.qml:250 +msgctxt "Chart config" +msgid "Read:" +msgstr "Lecture :" + +#: ../contents/ui/config/ConfigAppearance.qml:481 ../contents/ui/config/ConfigData.qml:274 +msgctxt "Chart config" +msgid "Write:" +msgstr "Écriture :" + +#: ../contents/ui/config/ConfigAppearance.qml:489 +msgid "Threshold text colors" +msgstr "Couleurs des seuils d'alerte" + +#: ../contents/ui/config/ConfigAppearance.qml:495 +msgid "Warning status:" +msgstr "État d’avertissement" + +#: ../contents/ui/config/ConfigAppearance.qml:497 +msgid "Choose text color when the value is in warning status" +msgstr "Choisissez la couleur du texte quand le seuil d'avertissement est passé" + +#: ../contents/ui/config/ConfigAppearance.qml:502 +msgid "Critical status:" +msgstr "État critique" + +#: ../contents/ui/config/ConfigAppearance.qml:504 +msgid "Choose text color when the value is in critical status" +msgstr "Choisissez la couleur du texte quand le seul critique est passé" + +#: ../contents/ui/config/ConfigData.qml:39 ../contents/ui/config/ConfigData.qml:67 +msgid "Custom" +msgstr "Personnalisée" + +#: ../contents/ui/config/ConfigData.qml:125 +msgctxt "Config header" +msgid "Thresholds" +msgstr "Seuils d'alerte" + +#: ../contents/ui/config/ConfigData.qml:148 +msgid "Network interfaces:" +msgstr "Interfaces réseau :" + +#: ../contents/ui/config/ConfigData.qml:185 ../contents/ui/config/ConfigData.qml:244 +msgid "Maximum transfer speed" +msgstr "Vitesse de transfert maximale" + +#: ../contents/ui/config/ConfigData.qml:298 +msgctxt "Config header" +msgid "Graphic card" +msgstr "Carte graphique" + +#: ../contents/ui/config/ConfigData.qml:305 +msgid "Graphic card:" +msgstr "Carte graphique :" + +#: ../contents/ui/config/ConfigData.qml:347 +msgid "Warning" +msgstr "Avertissement" + +#: ../contents/ui/config/ConfigData.qml:354 +msgid "Critical" +msgstr "Critique" + +#: ../contents/ui/config/ConfigData.qml:361 +msgid "CPU Temperature:" +msgstr "Température du CPU" + +#: ../contents/ui/config/ConfigData.qml:393 +msgid "Physical Memory Usage:" +msgstr "Utilisation de la mémoire" + +#: ../contents/ui/config/ConfigData.qml:417 +msgid "GPU Temperature:" +msgstr "Température du GPU" + +#: ../contents/ui/config/ConfigGeneral.qml:84 +msgctxt "Config header" +msgid "Click action" +msgstr "Action du clique" + +#: ../contents/ui/config/ConfigGeneral.qml:101 +msgid "Update interval:" +msgstr "Intervalle d'actualisation :" + +#: ../contents/ui/config/ConfigGeneral.qml:110 +msgid "%1 seconds" +msgstr "%1 secondes" + +#: ../contents/ui/config/ConfigGeneral.qml:128 ../contents/ui/config/ConfigGeneral.qml:215 +#: ../contents/ui/config/ConfigGeneral.qml:276 +msgid "Visibility:" +msgstr "Visibilité" + +#: ../contents/ui/config/ConfigGeneral.qml:134 ../contents/ui/config/ConfigGeneral.qml:170 +#: ../contents/ui/config/ConfigGeneral.qml:221 ../contents/ui/config/ConfigGeneral.qml:282 +msgid "Disabled" +msgstr "Désactivé" + +#: ../contents/ui/config/ConfigGeneral.qml:137 +msgid "Total usage" +msgstr "Utilisation total" + +#: ../contents/ui/config/ConfigGeneral.qml:140 +msgid "System usage" +msgstr "Utilisation du système" + +#: ../contents/ui/config/ConfigGeneral.qml:143 +msgid "User usage" +msgstr "Utilisation de l'Utilisateur" + +#: ../contents/ui/config/ConfigGeneral.qml:163 +msgid "Clock visibility:" +msgstr "Visibilité de l'horloge :" + +#: ../contents/ui/config/ConfigGeneral.qml:173 +msgctxt "Agregator" +msgid "Average" +msgstr "Moyenne" + +#: ../contents/ui/config/ConfigGeneral.qml:176 +msgctxt "Agregator" +msgid "Minimum" +msgstr "Minimum" + +#: ../contents/ui/config/ConfigGeneral.qml:179 +msgctxt "Agregator" +msgid "Maximum" +msgstr "Maximum" + +#: ../contents/ui/config/ConfigGeneral.qml:199 ../contents/ui/config/ConfigGeneral.qml:341 +msgid "Show temperature" +msgstr "Afficher la température" + +#: ../contents/ui/config/ConfigGeneral.qml:224 +msgid "Physical memory (in KiB)" +msgstr "Mémoire Physique (en Kio)" + +#: ../contents/ui/config/ConfigGeneral.qml:227 +msgid "Physical memory (in %)" +msgstr "Mémoire Physique (en %)" + +#: ../contents/ui/config/ConfigGeneral.qml:230 +msgid "Application memory (in KiB)" +msgstr "Mémoire Applicative (en Kio)" + +#: ../contents/ui/config/ConfigGeneral.qml:233 +msgid "Application memory (in %)" +msgstr "Mémoire Applicative (en %)" + +#: ../contents/ui/config/ConfigGeneral.qml:259 +msgid "Show swap" +msgstr "Afficher le swap" + +#: ../contents/ui/config/ConfigGeneral.qml:285 +msgid "In kibibyte (KiB/s)" +msgstr "En kibioctet (Kio/s)" + +#: ../contents/ui/config/ConfigGeneral.qml:288 +msgid "In kilobit (Kbps)" +msgstr "En kilobit (Kbps)" + +#: ../contents/ui/config/ConfigGeneral.qml:291 +msgid "In kilobyte (KBps)" +msgstr "En kilooctet (Kops)" + +#: ../contents/ui/config/ConfigGeneral.qml:327 ../contents/ui/config/ConfigGeneral.qml:364 +msgid "Enabled?" +msgstr "Activé ?" + +#: ../contents/ui/config/ConfigGeneral.qml:331 +msgid "Show memory" +msgstr "Afficher la mémoire" + +#: ../contents/ui/config/ConfigGeneral.qml:336 +msgid "Memory in percent" +msgstr "Mémoire en pourcent" + +#: ../contents/ui/config/ConfigGeneral.qml:380 +msgid "Search an application:" +msgstr "Chercher une application :" + +#: ../contents/ui/config/ConfigGeneral.qml:382 +msgid "Application name" +msgstr "Nom de l'application" + +#: ../contents/ui/config/ConfigGeneral.qml:389 +msgid "Applications" +msgstr "Applications" diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/nl.po b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/nl.po new file mode 100644 index 0000000..8e6f60b --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/nl.po @@ -0,0 +1,454 @@ +# Translation of resourcesMonitor-fork in nl +# Copyright (C) 2021 +# This file is distributed under the same license as the resourcesMonitor-fork package. +# Heimen Stoffels , 2021. +# +msgid "" +msgstr "" +"Project-Id-Version: resourcesMonitor-fork\n" +"Report-Msgid-Bugs-To: https://github.com/orblazer/plasma-applet-resources-monitor\n" +"POT-Creation-Date: 2023-05-31 18:43+0200\n" +"PO-Revision-Date: 2023-05-31 18:44+0200\n" +"Last-Translator: orblazer\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0\n" + +#: ../contents/config/config.qml:6 ../contents/ui/config/ConfigData.qml:120 ../contents/ui/config/ConfigGeneral.qml:79 +msgctxt "Config header" +msgid "General" +msgstr "Algemeen" + +#: ../contents/config/config.qml:11 +msgctxt "Config header" +msgid "Data" +msgstr "Gegevens" + +#: ../contents/config/config.qml:16 +msgctxt "Config header" +msgid "Appearance" +msgstr "Uiterlijk" + +#: ../contents/ui/components/functions.js:20 +msgctxt "kilobyte suffix" +msgid "Bps" +msgstr "Bps" + +#: ../contents/ui/components/functions.js:28 +msgctxt "kilobit suffix" +msgid "bps" +msgstr "bps" + +#: ../contents/ui/components/functions.js:36 +msgctxt "kibibyte suffix" +msgid "iB/s" +msgstr "iB/s" + +#: ../contents/ui/components/graph/CpuGraph.qml:41 +msgctxt "Graph label" +msgid "Clock" +msgstr "Klok" + +#: ../contents/ui/components/graph/CpuGraph.qml:41 ../contents/ui/components/graph/GpuGraph.qml:32 +msgctxt "Graph label" +msgid "Temp." +msgstr "Temp." + +#: ../contents/ui/components/graph/DisksGraph.qml:28 +msgctxt "Graph label" +msgid "Read" +msgstr "Lees" + +#: ../contents/ui/components/graph/DisksGraph.qml:28 +msgctxt "Graph label" +msgid "Write" +msgstr "Schrijf" + +#: ../contents/ui/components/graph/GpuGraph.qml:56 +msgctxt "Percent unit" +msgid "%1%" +msgstr "%1%" + +#: ../contents/ui/components/graph/NetworkGraph.qml:31 +msgctxt "Graph label" +msgid "Receiving" +msgstr "Ontvangst" + +#: ../contents/ui/components/graph/NetworkGraph.qml:31 +msgctxt "Graph label" +msgid "Sending" +msgstr "Verzend." + +#: ../contents/ui/config/ConfigAppearance.qml:76 ../contents/ui/config/ConfigAppearance.qml:361 +#: ../contents/ui/config/ConfigGeneral.qml:122 +msgctxt "Chart name" +msgid "CPU" +msgstr "CPU" + +#: ../contents/ui/config/ConfigAppearance.qml:81 ../contents/ui/config/ConfigAppearance.qml:386 +#: ../contents/ui/config/ConfigGeneral.qml:209 +msgctxt "Chart name" +msgid "Memory" +msgstr "Geheugen" + +#: ../contents/ui/config/ConfigAppearance.qml:86 ../contents/ui/config/ConfigAppearance.qml:436 +#: ../contents/ui/config/ConfigGeneral.qml:315 +msgctxt "Chart name" +msgid "GPU" +msgstr "GPU" + +#: ../contents/ui/config/ConfigAppearance.qml:91 ../contents/ui/config/ConfigAppearance.qml:468 +#: ../contents/ui/config/ConfigData.qml:239 ../contents/ui/config/ConfigGeneral.qml:352 +msgctxt "Chart name" +msgid "Disks I/O" +msgstr "Schijven I/O" + +#: ../contents/ui/config/ConfigAppearance.qml:96 ../contents/ui/config/ConfigAppearance.qml:411 +#: ../contents/ui/config/ConfigData.qml:142 ../contents/ui/config/ConfigGeneral.qml:270 +msgctxt "Chart name" +msgid "Network" +msgstr "Netwerk" + +#: ../contents/ui/config/ConfigAppearance.qml:115 ../contents/ui/config/ConfigGeneral.qml:116 +msgctxt "Config header" +msgid "Charts" +msgstr "Grafieken" + +#: ../contents/ui/config/ConfigAppearance.qml:120 +msgctxt "Config header" +msgid "Text" +msgstr "Tekst" + +#: ../contents/ui/config/ConfigAppearance.qml:125 +msgctxt "Config header" +msgid "Colors" +msgstr "Kleuren" + +#: ../contents/ui/config/ConfigAppearance.qml:143 +msgid "Vertical layout" +msgstr "Verticale indeling" + +#: ../contents/ui/config/ConfigAppearance.qml:148 +msgid "History amount:" +msgstr "Historie bedrag:" + +#: ../contents/ui/config/ConfigAppearance.qml:155 +msgid "Width:" +msgstr "Breedte:" + +#: ../contents/ui/config/ConfigAppearance.qml:162 +msgid "Height:" +msgstr "Hoogte:" + +#: ../contents/ui/config/ConfigAppearance.qml:169 +msgid "Margin:" +msgstr "Marge:" + +#: ../contents/ui/config/ConfigAppearance.qml:180 +msgid "Fill opacity:" +msgstr "Ondoorzichtigheid vullen:" + +#: ../contents/ui/config/ConfigAppearance.qml:192 +msgid "Charts order" +msgstr "Volgorde grafieken" + +#: ../contents/ui/config/ConfigAppearance.qml:280 +msgid "Drop shadows" +msgstr "Vallende schaduwen" + +#: ../contents/ui/config/ConfigAppearance.qml:285 +msgid "Font scale:" +msgstr "Tekstgrootte:" + +#: ../contents/ui/config/ConfigAppearance.qml:297 +msgid "Text displayment:" +msgstr "Tekst tonen:" + +#: ../contents/ui/config/ConfigAppearance.qml:303 +msgctxt "Text displayment" +msgid "Always" +msgstr "Altijd" + +#: ../contents/ui/config/ConfigAppearance.qml:306 +msgctxt "Text displayment" +msgid "On hover" +msgstr "Na aanwijzen" + +#: ../contents/ui/config/ConfigAppearance.qml:309 +msgctxt "Text displayment" +msgid "Hints when hover" +msgstr "Tip tonen na aanwijzen" + +#: ../contents/ui/config/ConfigAppearance.qml:319 +msgid "Placement:" +msgstr "Locatie:" + +#: ../contents/ui/config/ConfigAppearance.qml:325 +msgctxt "Text placement" +msgid "Top left" +msgstr "Linksboven" + +#: ../contents/ui/config/ConfigAppearance.qml:328 +msgctxt "Text placement" +msgid "Top right" +msgstr "Rechtboven" + +#: ../contents/ui/config/ConfigAppearance.qml:331 +msgctxt "Text placement" +msgid "Bottom left" +msgstr "Linksonder" + +#: ../contents/ui/config/ConfigAppearance.qml:334 +msgctxt "Text placement" +msgid "Bottom right" +msgstr "Rechtsonder" + +#: ../contents/ui/config/ConfigAppearance.qml:351 +msgid "Charts colors" +msgstr "Kleuren grafieken" + +#: ../contents/ui/config/ConfigAppearance.qml:367 ../contents/ui/config/ConfigAppearance.qml:442 +msgctxt "Chart config" +msgid "Usage:" +msgstr "Gebruik:" + +#: ../contents/ui/config/ConfigAppearance.qml:369 ../contents/ui/config/ConfigAppearance.qml:394 +#: ../contents/ui/config/ConfigAppearance.qml:419 ../contents/ui/config/ConfigAppearance.qml:426 +#: ../contents/ui/config/ConfigAppearance.qml:444 ../contents/ui/config/ConfigAppearance.qml:451 +#: ../contents/ui/config/ConfigAppearance.qml:476 ../contents/ui/config/ConfigAppearance.qml:483 +msgctxt "Chart color" +msgid "Choose series color" +msgstr "Kies seriekleur" + +#: ../contents/ui/config/ConfigAppearance.qml:374 ../contents/ui/config/ConfigAppearance.qml:456 +msgctxt "Chart config" +msgid "Temperature:" +msgstr "Temperatuur:" + +#: ../contents/ui/config/ConfigAppearance.qml:376 ../contents/ui/config/ConfigAppearance.qml:458 +msgctxt "Chart color" +msgid "Choose text color" +msgstr "Kies tekstkleur" + +#: ../contents/ui/config/ConfigAppearance.qml:392 +msgctxt "Chart config" +msgid "Physical:" +msgstr "Fysiek:" + +#: ../contents/ui/config/ConfigAppearance.qml:399 +msgctxt "Chart config" +msgid "Swap:" +msgstr "Swap:" + +#: ../contents/ui/config/ConfigAppearance.qml:401 +msgctxt "Chart color" +msgid "Choose color of series and text" +msgstr "Kies kleur van serie en tekst" + +#: ../contents/ui/config/ConfigAppearance.qml:417 ../contents/ui/config/ConfigData.qml:191 +msgctxt "Chart config" +msgid "Receiving:" +msgstr "Ontvangst:" + +#: ../contents/ui/config/ConfigAppearance.qml:424 ../contents/ui/config/ConfigData.qml:215 +msgctxt "Chart config" +msgid "Sending:" +msgstr "Verzending:" + +#: ../contents/ui/config/ConfigAppearance.qml:449 +msgctxt "Chart config" +msgid "Memory:" +msgstr "Geheugen" + +#: ../contents/ui/config/ConfigAppearance.qml:474 ../contents/ui/config/ConfigData.qml:250 +msgctxt "Chart config" +msgid "Read:" +msgstr "Lees:" + +#: ../contents/ui/config/ConfigAppearance.qml:481 ../contents/ui/config/ConfigData.qml:274 +msgctxt "Chart config" +msgid "Write:" +msgstr "Schrijf:" + +#: ../contents/ui/config/ConfigAppearance.qml:489 +msgid "Threshold text colors" +msgstr "Drempelwaarde tekstkleuren" + +#: ../contents/ui/config/ConfigAppearance.qml:495 +msgid "Warning status:" +msgstr "Waarschuwingsstatus:" + +#: ../contents/ui/config/ConfigAppearance.qml:497 +msgid "Choose text color when the value is in warning status" +msgstr "Kies de tekstkleur wanneer de waarde in de waarschuwingsstatus staat" + +#: ../contents/ui/config/ConfigAppearance.qml:502 +msgid "Critical status:" +msgstr "Kritieke status:" + +#: ../contents/ui/config/ConfigAppearance.qml:504 +msgid "Choose text color when the value is in critical status" +msgstr "Tekstkleur kiezen wanneer de waarde in kritieke status is" + +#: ../contents/ui/config/ConfigData.qml:39 ../contents/ui/config/ConfigData.qml:67 +msgid "Custom" +msgstr "Aangepast" + +#: ../contents/ui/config/ConfigData.qml:125 +msgctxt "Config header" +msgid "Thresholds" +msgstr "Drempels" + +#: ../contents/ui/config/ConfigData.qml:148 +msgid "Network interfaces:" +msgstr "Netwerkkaarten:" + +#: ../contents/ui/config/ConfigData.qml:185 ../contents/ui/config/ConfigData.qml:244 +msgid "Maximum transfer speed" +msgstr "Maximale overdrachtssnelheid" + +#: ../contents/ui/config/ConfigData.qml:298 +msgctxt "Config header" +msgid "Graphic card" +msgstr "Grafische kaart" + +#: ../contents/ui/config/ConfigData.qml:305 +msgid "Graphic card:" +msgstr "Grafische kaart:" + +#: ../contents/ui/config/ConfigData.qml:347 +msgid "Warning" +msgstr "Waarschuwing" + +#: ../contents/ui/config/ConfigData.qml:354 +msgid "Critical" +msgstr "Kritisch" + +#: ../contents/ui/config/ConfigData.qml:361 +msgid "CPU Temperature:" +msgstr "CPU-temperatuur:" + +#: ../contents/ui/config/ConfigData.qml:393 +msgid "Physical Memory Usage:" +msgstr "Fysiek geheugengebruik:" + +#: ../contents/ui/config/ConfigData.qml:417 +msgid "GPU Temperature:" +msgstr "GPU-temperatuur:" + +#: ../contents/ui/config/ConfigGeneral.qml:84 +msgctxt "Config header" +msgid "Click action" +msgstr "Klik actie" + +#: ../contents/ui/config/ConfigGeneral.qml:101 +msgid "Update interval:" +msgstr "Bijwerktussenpoos:" + +#: ../contents/ui/config/ConfigGeneral.qml:110 +msgid "%1 seconds" +msgstr "%1 seconden" + +#: ../contents/ui/config/ConfigGeneral.qml:128 ../contents/ui/config/ConfigGeneral.qml:215 +#: ../contents/ui/config/ConfigGeneral.qml:276 +msgid "Visibility:" +msgstr "Zichtbaarheid:" + +#: ../contents/ui/config/ConfigGeneral.qml:134 ../contents/ui/config/ConfigGeneral.qml:170 +#: ../contents/ui/config/ConfigGeneral.qml:221 ../contents/ui/config/ConfigGeneral.qml:282 +msgid "Disabled" +msgstr "Uitgeschakeld" + +#: ../contents/ui/config/ConfigGeneral.qml:137 +msgid "Total usage" +msgstr "Totaal gebruik" + +#: ../contents/ui/config/ConfigGeneral.qml:140 +msgid "System usage" +msgstr "Systeemgebruik" + +#: ../contents/ui/config/ConfigGeneral.qml:143 +msgid "User usage" +msgstr "Gebruikersgebruik" + +#: ../contents/ui/config/ConfigGeneral.qml:163 +msgid "Clock visibility:" +msgstr "Klok zichtbaarheid:" + +#: ../contents/ui/config/ConfigGeneral.qml:173 +msgctxt "Agregator" +msgid "Average" +msgstr "Gemiddeld" + +#: ../contents/ui/config/ConfigGeneral.qml:176 +msgctxt "Agregator" +msgid "Minimum" +msgstr "Minimaal" + +#: ../contents/ui/config/ConfigGeneral.qml:179 +msgctxt "Agregator" +msgid "Maximum" +msgstr "Maximaal" + +#: ../contents/ui/config/ConfigGeneral.qml:199 ../contents/ui/config/ConfigGeneral.qml:341 +msgid "Show temperature" +msgstr "Toon temperatuur" + +#: ../contents/ui/config/ConfigGeneral.qml:224 +msgid "Physical memory (in KiB)" +msgstr "Fysiek geheugen (in KiB)" + +#: ../contents/ui/config/ConfigGeneral.qml:227 +msgid "Physical memory (in %)" +msgstr "Fysiek geheugen (in %)" + +#: ../contents/ui/config/ConfigGeneral.qml:230 +msgid "Application memory (in KiB)" +msgstr "Toepassingsgeheugen (KiB)" + +#: ../contents/ui/config/ConfigGeneral.qml:233 +msgid "Application memory (in %)" +msgstr "Toepassingsgeheugen (in %)" + +#: ../contents/ui/config/ConfigGeneral.qml:259 +msgid "Show swap" +msgstr "Toon swap" + +#: ../contents/ui/config/ConfigGeneral.qml:285 +msgid "In kibibyte (KiB/s)" +msgstr "In kibibyte (KiB/s)" + +#: ../contents/ui/config/ConfigGeneral.qml:288 +msgid "In kilobit (Kbps)" +msgstr "In kilobit (Kbps)" + +#: ../contents/ui/config/ConfigGeneral.qml:291 +msgid "In kilobyte (KBps)" +msgstr "In kilobyte (KBps)" + +#: ../contents/ui/config/ConfigGeneral.qml:327 ../contents/ui/config/ConfigGeneral.qml:364 +msgid "Enabled?" +msgstr "Ingeschakeld?" + +#: ../contents/ui/config/ConfigGeneral.qml:331 +msgid "Show memory" +msgstr "Toon geheugen" + +#: ../contents/ui/config/ConfigGeneral.qml:336 +msgid "Memory in percent" +msgstr "Geheugen in procent" + +#: ../contents/ui/config/ConfigGeneral.qml:380 +msgid "Search an application:" +msgstr "Een toepassing zoeken:" + +#: ../contents/ui/config/ConfigGeneral.qml:382 +msgid "Application name" +msgstr "Naam toepassing" + +#: ../contents/ui/config/ConfigGeneral.qml:389 +msgid "Applications" +msgstr "Toepassingen" diff --git a/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/template.pot b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/template.pot new file mode 100644 index 0000000..c96a349 --- /dev/null +++ b/home/.local/share/plasma/plasmoids/org.kde.resourcesMonitor-fork/translate/template.pot @@ -0,0 +1,483 @@ +# Translation of resourcesMonitor-fork in LANGUAGE +# Copyright (C) 2023 +# This file is distributed under the same license as the resourcesMonitor-fork package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: resourcesMonitor-fork\n" +"Report-Msgid-Bugs-To: https://github.com/orblazer/plasma-applet-resources-monitor\n" +"POT-Creation-Date: 2023-05-31 18:43+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../contents/config/config.qml:6 +#: ../contents/ui/config/ConfigData.qml:120 +#: ../contents/ui/config/ConfigGeneral.qml:79 +msgctxt "Config header" +msgid "General" +msgstr "" + +#: ../contents/config/config.qml:11 +msgctxt "Config header" +msgid "Data" +msgstr "" + +#: ../contents/config/config.qml:16 +msgctxt "Config header" +msgid "Appearance" +msgstr "" + +#: ../contents/ui/components/functions.js:20 +msgctxt "kilobyte suffix" +msgid "Bps" +msgstr "" + +#: ../contents/ui/components/functions.js:28 +msgctxt "kilobit suffix" +msgid "bps" +msgstr "" + +#: ../contents/ui/components/functions.js:36 +msgctxt "kibibyte suffix" +msgid "iB/s" +msgstr "" + +#: ../contents/ui/components/graph/CpuGraph.qml:41 +msgctxt "Graph label" +msgid "Clock" +msgstr "" + +#: ../contents/ui/components/graph/CpuGraph.qml:41 +#: ../contents/ui/components/graph/GpuGraph.qml:32 +msgctxt "Graph label" +msgid "Temp." +msgstr "" + +#: ../contents/ui/components/graph/DisksGraph.qml:28 +msgctxt "Graph label" +msgid "Read" +msgstr "" + +#: ../contents/ui/components/graph/DisksGraph.qml:28 +msgctxt "Graph label" +msgid "Write" +msgstr "" + +#: ../contents/ui/components/graph/GpuGraph.qml:56 +msgctxt "Percent unit" +msgid "%1%" +msgstr "" + +#: ../contents/ui/components/graph/NetworkGraph.qml:31 +msgctxt "Graph label" +msgid "Receiving" +msgstr "" + +#: ../contents/ui/components/graph/NetworkGraph.qml:31 +msgctxt "Graph label" +msgid "Sending" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:76 +#: ../contents/ui/config/ConfigAppearance.qml:361 +#: ../contents/ui/config/ConfigGeneral.qml:122 +msgctxt "Chart name" +msgid "CPU" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:81 +#: ../contents/ui/config/ConfigAppearance.qml:386 +#: ../contents/ui/config/ConfigGeneral.qml:209 +msgctxt "Chart name" +msgid "Memory" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:86 +#: ../contents/ui/config/ConfigAppearance.qml:436 +#: ../contents/ui/config/ConfigGeneral.qml:315 +msgctxt "Chart name" +msgid "GPU" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:91 +#: ../contents/ui/config/ConfigAppearance.qml:468 +#: ../contents/ui/config/ConfigData.qml:239 +#: ../contents/ui/config/ConfigGeneral.qml:352 +msgctxt "Chart name" +msgid "Disks I/O" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:96 +#: ../contents/ui/config/ConfigAppearance.qml:411 +#: ../contents/ui/config/ConfigData.qml:142 +#: ../contents/ui/config/ConfigGeneral.qml:270 +msgctxt "Chart name" +msgid "Network" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:115 +#: ../contents/ui/config/ConfigGeneral.qml:116 +msgctxt "Config header" +msgid "Charts" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:120 +msgctxt "Config header" +msgid "Text" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:125 +msgctxt "Config header" +msgid "Colors" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:143 +msgid "Vertical layout" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:148 +msgid "History amount:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:155 +msgid "Width:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:162 +msgid "Height:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:169 +msgid "Margin:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:180 +msgid "Fill opacity:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:192 +msgid "Charts order" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:280 +msgid "Drop shadows" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:285 +msgid "Font scale:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:297 +msgid "Text displayment:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:303 +msgctxt "Text displayment" +msgid "Always" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:306 +msgctxt "Text displayment" +msgid "On hover" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:309 +msgctxt "Text displayment" +msgid "Hints when hover" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:319 +msgid "Placement:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:325 +msgctxt "Text placement" +msgid "Top left" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:328 +msgctxt "Text placement" +msgid "Top right" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:331 +msgctxt "Text placement" +msgid "Bottom left" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:334 +msgctxt "Text placement" +msgid "Bottom right" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:351 +msgid "Charts colors" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:367 +#: ../contents/ui/config/ConfigAppearance.qml:442 +msgctxt "Chart config" +msgid "Usage:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:369 +#: ../contents/ui/config/ConfigAppearance.qml:394 +#: ../contents/ui/config/ConfigAppearance.qml:419 +#: ../contents/ui/config/ConfigAppearance.qml:426 +#: ../contents/ui/config/ConfigAppearance.qml:444 +#: ../contents/ui/config/ConfigAppearance.qml:451 +#: ../contents/ui/config/ConfigAppearance.qml:476 +#: ../contents/ui/config/ConfigAppearance.qml:483 +msgctxt "Chart color" +msgid "Choose series color" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:374 +#: ../contents/ui/config/ConfigAppearance.qml:456 +msgctxt "Chart config" +msgid "Temperature:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:376 +#: ../contents/ui/config/ConfigAppearance.qml:458 +msgctxt "Chart color" +msgid "Choose text color" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:392 +msgctxt "Chart config" +msgid "Physical:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:399 +msgctxt "Chart config" +msgid "Swap:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:401 +msgctxt "Chart color" +msgid "Choose color of series and text" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:417 +#: ../contents/ui/config/ConfigData.qml:191 +msgctxt "Chart config" +msgid "Receiving:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:424 +#: ../contents/ui/config/ConfigData.qml:215 +msgctxt "Chart config" +msgid "Sending:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:449 +msgctxt "Chart config" +msgid "Memory:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:474 +#: ../contents/ui/config/ConfigData.qml:250 +msgctxt "Chart config" +msgid "Read:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:481 +#: ../contents/ui/config/ConfigData.qml:274 +msgctxt "Chart config" +msgid "Write:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:489 +msgid "Threshold text colors" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:495 +msgid "Warning status:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:497 +msgid "Choose text color when the value is in warning status" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:502 +msgid "Critical status:" +msgstr "" + +#: ../contents/ui/config/ConfigAppearance.qml:504 +msgid "Choose text color when the value is in critical status" +msgstr "" + +#: ../contents/ui/config/ConfigData.qml:39 +#: ../contents/ui/config/ConfigData.qml:67 +msgid "Custom" +msgstr "" + +#: ../contents/ui/config/ConfigData.qml:125 +msgctxt "Config header" +msgid "Thresholds" +msgstr "" + +#: ../contents/ui/config/ConfigData.qml:148 +msgid "Network interfaces:" +msgstr "" + +#: ../contents/ui/config/ConfigData.qml:185 +#: ../contents/ui/config/ConfigData.qml:244 +msgid "Maximum transfer speed" +msgstr "" + +#: ../contents/ui/config/ConfigData.qml:298 +msgctxt "Config header" +msgid "Graphic card" +msgstr "" + +#: ../contents/ui/config/ConfigData.qml:305 +msgid "Graphic card:" +msgstr "" + +#: ../contents/ui/config/ConfigData.qml:347 +msgid "Warning" +msgstr "" + +#: ../contents/ui/config/ConfigData.qml:354 +msgid "Critical" +msgstr "" + +#: ../contents/ui/config/ConfigData.qml:361 +msgid "CPU Temperature:" +msgstr "" + +#: ../contents/ui/config/ConfigData.qml:393 +msgid "Physical Memory Usage:" +msgstr "" + +#: ../contents/ui/config/ConfigData.qml:417 +msgid "GPU Temperature:" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:84 +msgctxt "Config header" +msgid "Click action" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:101 +msgid "Update interval:" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:110 +msgid "%1 seconds" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:128 +#: ../contents/ui/config/ConfigGeneral.qml:215 +#: ../contents/ui/config/ConfigGeneral.qml:276 +msgid "Visibility:" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:134 +#: ../contents/ui/config/ConfigGeneral.qml:170 +#: ../contents/ui/config/ConfigGeneral.qml:221 +#: ../contents/ui/config/ConfigGeneral.qml:282 +msgid "Disabled" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:137 +msgid "Total usage" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:140 +msgid "System usage" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:143 +msgid "User usage" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:163 +msgid "Clock visibility:" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:173 +msgctxt "Agregator" +msgid "Average" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:176 +msgctxt "Agregator" +msgid "Minimum" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:179 +msgctxt "Agregator" +msgid "Maximum" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:199 +#: ../contents/ui/config/ConfigGeneral.qml:341 +msgid "Show temperature" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:224 +msgid "Physical memory (in KiB)" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:227 +msgid "Physical memory (in %)" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:230 +msgid "Application memory (in KiB)" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:233 +msgid "Application memory (in %)" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:259 +msgid "Show swap" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:285 +msgid "In kibibyte (KiB/s)" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:288 +msgid "In kilobit (Kbps)" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:291 +msgid "In kilobyte (KBps)" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:327 +#: ../contents/ui/config/ConfigGeneral.qml:364 +msgid "Enabled?" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:331 +msgid "Show memory" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:336 +msgid "Memory in percent" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:380 +msgid "Search an application:" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:382 +msgid "Application name" +msgstr "" + +#: ../contents/ui/config/ConfigGeneral.qml:389 +msgid "Applications" +msgstr ""