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 ""