Warning, /plasma/plasma-systemmonitor/src/page/FaceConfigurationPage.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  * SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005  */
0006 
0007 import QtQuick 2.14
0008 import QtQuick.Controls 2.14
0009 import QtQuick.Layouts 1.14
0010 
0011 import Qt.labs.platform 1.1 as Platform
0012 
0013 import org.kde.kirigami 2.12 as Kirigami
0014 import org.kde.newstuff 1.81 as NewStuff
0015 
0016 import org.kde.ksysguard.faces 1.0 as Faces
0017 import org.kde.ksysguard.page 1.0
0018 
0019 Kirigami.ScrollablePage {
0020     id: page
0021 
0022     property FaceLoader loader
0023 
0024     property int activeSection: 0
0025 
0026     title: i18nc("@title:window %1 is face name", "Configure %1", loader.controller.title)
0027 
0028     Kirigami.ColumnView.fillWidth: false
0029 
0030     actions.main: Kirigami.Action {
0031         icon.name: "dialog-close"
0032         text: i18nc("@action", "Close")
0033         onTriggered: applicationWindow().pageStack.pop()
0034     }
0035 
0036     actions.contextualActions: [
0037         Kirigami.Action {
0038             text: i18nc("@action", "Load Preset…")
0039             icon.name: "document-new-from-template"
0040             onTriggered: loadPresetDialog.open()
0041         },
0042         NewStuff.Action {
0043             text: i18nc("@action", "Get new presets…")
0044             configFile: "systemmonitor-presets.knsrc"
0045             pageStack: applicationWindow().pageStack.layers
0046             onChangedEntriesChanged: loader.controller.availablePresetsModel.reload();
0047         },
0048         Kirigami.Action {
0049             text: i18nc("@action", "Save Settings as Preset")
0050             icon.name: "document-save-as-template"
0051             onTriggered: {
0052                 loader.controller.savePreset()
0053                 message.text = i18nc("@info:status %1 is preset name", "Saved settings as preset %1.", loader.controller.title)
0054                 message.visible = true
0055             }
0056         },
0057         Kirigami.Action {
0058             text: i18nc("@action", "Add Chart as Desktop Widget")
0059             icon.name: "document-export"
0060             enabled: WidgetExporter.plasmashellAvailable
0061             onTriggered: {
0062                 WidgetExporter.exportAsWidget(loader)
0063             }
0064         },
0065         Kirigami.Action { separator: true },
0066         NewStuff.Action {
0067             text: i18nc("@action", "Get new display styles…")
0068             configFile: "systemmonitor-faces.knsrc"
0069             pageStack: applicationWindow().pageStack.layers
0070             onChangedEntriesChanged: loader.controller.availableFacesModel.reload();
0071         }
0072     ]
0073 
0074     DialogLoader {
0075         id: loadPresetDialog
0076         sourceComponent: LoadPresetDialog {
0077 
0078             controller: loader.controller
0079 
0080             onAccepted: {
0081                 loader.controller.title = selectedTitle;
0082                 if (selectedFace) {
0083                     loader.controller.faceId = selectedFace
0084                 }
0085                 loader.controller.loadPreset(selectedPreset);
0086                 message.text = i18nc("@info:status %1 is preset name", "Loaded preset %1.", selectedTitle);
0087                 message.visible = true
0088             }
0089         }
0090     }
0091 
0092     ColumnLayout {
0093         id: layout
0094 
0095         Kirigami.InlineMessage {
0096             id: message
0097             Layout.fillWidth: true
0098             showCloseButton: true
0099         }
0100 
0101         Label {
0102             Layout.fillWidth: true
0103             text: i18nc("@label:textbox", "Title")
0104 
0105             CheckBox {
0106                 id: showTitleCheckbox
0107                 anchors.right: parent.right
0108                 anchors.verticalCenter: parent.verticalCenter
0109                 text: i18nc("@option:check", "Show Title")
0110                 checked: page.loader.controller.showTitle
0111                 onToggled: page.loader.controller.showTitle = checked
0112             }
0113         }
0114 
0115         TextField {
0116             id: titleField
0117 
0118             text: page.loader.controller.title
0119 
0120             Layout.fillWidth: true
0121 
0122             onTextEdited: page.loader.controller.title = text
0123         }
0124 
0125         Label {
0126             Layout.fillWidth: true
0127             text: i18nc("@label:textbox", "Display Style")
0128         }
0129 
0130         ComboBox {
0131             id: faceCombo
0132 
0133             property string faceId: page.loader.controller.faceId
0134 
0135             model: page.loader.controller.availableFacesModel
0136             textRole: "display"
0137             currentIndex: {
0138                 // TODO just make an indexOf invokable on the model?
0139                 for (var i = 0; i < count; ++i) {
0140                     if (model.pluginId(i) === faceId) {
0141                         return i;
0142                     }
0143                 }
0144                 return -1;
0145             }
0146             onActivated: {
0147                 page.loader.controller.faceId = model.pluginId(index);
0148             }
0149 
0150             Layout.fillWidth: true
0151         }
0152 
0153         Label {
0154             Layout.fillWidth: true
0155             text: i18nc("@label", "Minimum time between updates:")
0156         }
0157 
0158         SpinBox {
0159             id: updateRateLimitSpinBox
0160 
0161             Layout.fillWidth: true
0162 
0163             from: 0
0164             to: 600000
0165             stepSize: 500
0166             editable: true
0167 
0168             value: page.loader.controller.updateRateLimit
0169 
0170             textFromValue: function(value, locale) {
0171                 if (value <= 0) {
0172                     return i18n("No Limit");
0173                 } else {
0174                     var seconds = value / 1000;
0175                     if (seconds == 1) { // Manual plural handling because i18ndp doesn't handle floats :(
0176                         return i18n("1 second");
0177                     } else {
0178                         return i18n("%1 seconds", seconds);
0179                     }
0180                 }
0181             }
0182             valueFromText: function(value, locale) {
0183                 // Don't use fromLocaleString here since it will error out on extra
0184                 // characters like the (potentially translated) seconds that gets
0185                 // added above. Instead parseInt ignores non-numeric characters.
0186                 var v = parseInt(value)
0187                 if (isNaN(v)) {
0188                     return 0;
0189                 } else {
0190                     return v * 1000;
0191                 }
0192             }
0193 
0194             onValueModified: page.loader.controller.updateRateLimit = value
0195         }
0196 
0197         Item {
0198             Layout.fillWidth: true
0199             implicitHeight: children.length > 0 ? children[0].implicitHeight : 0
0200 
0201             children: loader.controller.faceConfigUi
0202 
0203             onWidthChanged: {
0204                 if (children.length > 0) {
0205                     children[0].width = width
0206                 }
0207             }
0208 
0209             Connections {
0210                 target: loader.controller.faceConfigUi
0211 
0212                 function onConfigurationChanged() {
0213                     loader.controller.faceConfigUi.saveConfig()
0214                     loader.dataObject.markDirty()
0215                 }
0216             }
0217         }
0218 
0219         Item {
0220             Layout.fillWidth: true
0221             implicitHeight: children.length > 0 ? children[0].implicitHeight : 0
0222 
0223             children: loader.controller.sensorsConfigUi
0224 
0225             onWidthChanged: {
0226                 if (children.length > 0) {
0227                     children[0].width = width
0228                 }
0229             }
0230 
0231             Connections {
0232                 target: loader.controller.sensorsConfigUi
0233 
0234                 function onConfigurationChanged() {
0235                     loader.controller.sensorsConfigUi.saveConfig()
0236                     loader.dataObject.markDirty()
0237                 }
0238             }
0239         }
0240 
0241         Item { Layout.fillHeight: true; width: 1 }
0242     }
0243 }