Warning, /plasma/libksysguard/faces/ConfigAppearance.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
0003     SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
0004     SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 import QtQuick
0010 import QtQuick.Layouts
0011 import QtQuick.Controls as QQC2
0012 
0013 import org.kde.kirigami as Kirigami
0014 import org.kde.kquickcontrols
0015 import org.kde.config
0016 import org.kde.newstuff as NewStuff
0017 
0018 import org.kde.quickcharts as Charts
0019 import org.kde.ksysguard.sensors as Sensors
0020 import org.kde.ksysguard.faces as Faces
0021 
0022 Kirigami.FormLayout {
0023     id: root
0024 
0025     signal configurationChanged
0026 
0027     function saveConfig() {
0028         controller.title = cfg_title;
0029         controller.faceId = cfg_chartFace;
0030         controller.showTitle = cfg_showTitle
0031         controller.updateRateLimit = cfg_updateRateLimit
0032 
0033         var preset = pendingPreset;
0034         pendingPreset = "";
0035         if (preset != "") {
0036             controller.loadPreset(preset);
0037             root.controller.highPrioritySensorColors = automaticColorSource.colors
0038         }
0039     }
0040 
0041     property Faces.SensorFaceController controller
0042     property alias cfg_title: titleField.text
0043     property alias cfg_showTitle: showTitleCheckbox.checked
0044     property string cfg_chartFace
0045     property alias cfg_updateRateLimit: updateRateLimitSpinBox.value
0046 
0047     onCfg_titleChanged: configurationChanged();
0048     onCfg_showTitleChanged: configurationChanged()
0049     onCfg_chartFaceChanged: configurationChanged();
0050     onCfg_updateRateLimitChanged: configurationChanged();
0051 
0052     // config keys of the selected preset to be applied on save
0053     property string pendingPreset
0054 
0055     Component.onCompleted: {
0056         cfg_title = controller.title;
0057         cfg_chartFace = controller.faceId;
0058         cfg_showTitle = controller.showTitle
0059         cfg_updateRateLimit = controller.updateRateLimit
0060     }
0061 
0062     Charts.ColorGradientSource {
0063         id: automaticColorSource
0064         baseColor: Kirigami.Theme.highlightColor
0065         itemCount: root.controller.highPrioritySensorIds.length
0066     }
0067 
0068     Kirigami.OverlaySheet {
0069         id: presetSheet
0070         parent: root
0071         ListView {
0072             implicitWidth: Kirigami.Units.gridUnit * 15
0073             focus: true
0074             model: controller.availablePresetsModel
0075             delegate: Kirigami.SwipeListItem {
0076                 contentItem: QQC2.Label {
0077                     elide: Text.ElideRight
0078                     text: model.display
0079                 }
0080                 actions: Kirigami.Action {
0081                     icon.name: "delete"
0082                     visible: model.writable
0083                     onTriggered: controller.uninstallPreset(model.pluginId);
0084                 }
0085                 onClicked: {
0086                     cfg_title = model.display;
0087                     pendingPreset = model.pluginId;
0088                     if (model.config.chartFace) {
0089                         cfg_chartFace = model.config.chartFace;
0090                     }
0091 
0092                     root.configurationChanged();
0093                     presetSheet.close();
0094                 }
0095 
0096                 // shortcut overrides can only be on the item with focus
0097                 Keys.onShortcutOverride: {
0098                     if (event.key === Qt.Key_Escape) {
0099                         event.accepted = true;
0100                         root.close();
0101                     }
0102                 }
0103             }
0104         }
0105     }
0106     RowLayout {
0107         Kirigami.FormData.label: i18nd("KSysGuardSensorFaces", "Presets:")
0108 
0109         QQC2.Button {
0110             icon.name: "document-open"
0111             text: i18nd("KSysGuardSensorFaces", "Load Preset...")
0112             onClicked: presetSheet.open()
0113         }
0114 
0115         NewStuff.Button {
0116             Accessible.name: i18nd("KSysGuardSensorFaces", "Get new presets...")
0117             configFile: "systemmonitor-presets.knsrc"
0118             text: ""
0119             onEntryEvent: controller.availablePresetsModel.reload();
0120             QQC2.ToolTip {
0121                 text: parent.Accessible.name
0122             }
0123         }
0124 
0125         QQC2.Button {
0126             id: saveButton
0127             icon.name: "document-save"
0128             text: i18nd("KSysGuardSensorFaces", "Save Settings As Preset")
0129             onClicked: controller.savePreset();
0130         }
0131     }
0132 
0133     Kirigami.Separator {
0134         Kirigami.FormData.isSection: true
0135     }
0136 
0137     RowLayout {
0138         Kirigami.FormData.label: i18nd("KSysGuardSensorFaces", "Title:")
0139         QQC2.TextField {
0140             id: titleField
0141         }
0142         QQC2.CheckBox {
0143             id: showTitleCheckbox
0144             text: i18nd("KSysGuardSensorFaces", "Show Title")
0145         }
0146     }
0147 
0148     RowLayout {
0149         Kirigami.FormData.label: i18nd("KSysGuardSensorFaces", "Display Style:")
0150         QQC2.ComboBox {
0151             id: faceCombo
0152             model: controller.availableFacesModel
0153             textRole: "display"
0154             currentIndex: {
0155                 // TODO just make an indexOf invocable on the model?
0156                 for (var i = 0; i < count; ++i) {
0157                     if (model.pluginId(i) === cfg_chartFace) {
0158                         return i;
0159                     }
0160                 }
0161                 return -1;
0162             }
0163             onActivated: {
0164                 cfg_chartFace = model.pluginId(index);
0165             }
0166         }
0167 
0168         NewStuff.Button {
0169             text: i18nd("KSysGuardSensorFaces", "Get New Display Styles...")
0170             configFile: "systemmonitor-faces.knsrc"
0171             onEntryEvent: controller.availableFacesModel.reload();
0172         }
0173     }
0174 
0175     QQC2.SpinBox {
0176         id: updateRateLimitSpinBox
0177         Layout.preferredWidth: titleField.implicitWidth
0178 
0179         Kirigami.FormData.label: i18nd("KSysGuardSensorFaces", "Minimum Time Between Updates:")
0180 
0181         from: 0
0182         to: 600000
0183         stepSize: 500
0184         editable: true
0185 
0186         textFromValue: function(value, locale) {
0187             if (value <= 0) {
0188                 return i18nd("KSysGuardSensorFaces", "No Limit");
0189             } else {
0190                 var seconds = value / 1000;
0191                 if (seconds == 1) { // Manual plural handling because i18ndp doesn't handle floats :(
0192                     return i18nd("KSysGuardSensorFaces", "1 second");
0193                 } else {
0194                     return i18nd("KSysGuardSensorFaces", "%1 seconds", seconds);
0195                 }
0196             }
0197         }
0198         valueFromText: function(value, locale) {
0199             // Don't use fromLocaleString here since it will error out on extra
0200             // characters like the (potentially translated) seconds that gets
0201             // added above. Instead parseInt ignores non-numeric characters.
0202             var v = parseInt(value)
0203             if (isNaN(v)) {
0204                 return 0;
0205             } else {
0206                 return v * 1000;
0207             }
0208         }
0209     }
0210 }