Warning, /plasma/flatpak-kcm/package/contents/ui/TextPromptDialog.qml is written in an unsupported language. File is not indexed.

0001 /**
0002  * SPDX-FileCopyrightText: 2023 ivan tkachenko <me@ratijas.tk>
0003  * SPDX-License-Identifier: GPL-2.0-or-later
0004  */
0005 
0006 import QtQuick 2.15
0007 import QtQuick.Controls 2.15 as QQC2
0008 import QtQuick.Layouts 1.15
0009 import QtQuick.Dialogs 1.3 as QtDialogs
0010 
0011 import org.kde.kirigami 2.20 as Kirigami
0012 import org.kde.plasma.kcm.flatpakpermissions 1.0
0013 
0014 Kirigami.PromptDialog {
0015     id: root
0016 
0017     required property FlatpakPermissionModel model
0018     required property /*FlatpakPermissionsSectionType::Type*/ int sectionType
0019 
0020     title: switch (sectionType) {
0021         case FlatpakPermissionsSectionType.Filesystems: return i18n("Add Filesystem Path Permission");
0022         case FlatpakPermissionsSectionType.SessionBus: return i18n("Add Session Bus Permission");
0023         case FlatpakPermissionsSectionType.SystemBus: return i18n("Add System Bus Permission");
0024         default: return ""
0025     }
0026 
0027     standardButtons: QQC2.Dialog.Ok | QQC2.Dialog.Discard
0028     closePolicy: QQC2.Popup.CloseOnEscape
0029 
0030     QQC2.Overlay.modal: KcmPopupModal {}
0031 
0032     Kirigami.FormLayout {
0033         RowLayout {
0034             spacing: Kirigami.Units.smallSpacing
0035             Layout.fillWidth: true
0036 
0037             Kirigami.FormData.label: switch (root.sectionType) {
0038                 case FlatpakPermissionsSectionType.Filesystems: return i18n("Enter filesystem path...");
0039                 case FlatpakPermissionsSectionType.SessionBus: return i18n("Enter session bus name...");
0040                 case FlatpakPermissionsSectionType.SystemBus: return i18n("Enter system bus name...");
0041                 default: return ""
0042             }
0043 
0044             QQC2.TextField {
0045                 id: nameField
0046 
0047                 Layout.fillWidth: true
0048 
0049                 Keys.onEnterPressed: valueBox.forceActiveFocus(Qt.TabFocusReason)
0050                 Keys.onReturnPressed: valueBox.forceActiveFocus(Qt.TabFocusReason)
0051                 KeyNavigation.down: valueBox
0052                 KeyNavigation.right: selectButton
0053             }
0054 
0055             QQC2.Button {
0056                 id: selectButton
0057 
0058                 KeyNavigation.down: valueBox
0059 
0060                 visible: root.sectionType === FlatpakPermissionsSectionType.Filesystems
0061                 // TODO: add description before next string freeze
0062                 icon.name: "document-open"
0063 
0064                 onClicked: root.openFileDialog();
0065             }
0066         }
0067 
0068         QQC2.ComboBox {
0069             id: valueBox
0070 
0071             Layout.fillWidth: true
0072 
0073             Keys.onEnterPressed: maybeAccept()
0074             Keys.onReturnPressed: maybeAccept()
0075 
0076             function maybeAccept() {
0077                 if (!popup.opened) {
0078                     root.accepted();
0079                 }
0080             }
0081 
0082             model: root.model.valuesModelForSectionType(root.sectionType)
0083             textRole: "display"
0084             valueRole: "value"
0085         }
0086     }
0087 
0088     // created once, on demand
0089     property QtDialogs.FileDialog __dialog
0090 
0091     readonly property Component __dialogComponent: Component {
0092         id: dialogComponent
0093 
0094         // TODO: make 2 buttons. One for selecting files, other one for
0095         // folders. It appears to be impossible to force the more
0096         // convenient file picker to select folders too.
0097         QtDialogs.FileDialog {
0098             selectFolder: true
0099             onAccepted: {
0100                 let path = fileUrl.toString();
0101                 const schema = "file://";
0102                 if (path.startsWith(schema)) {
0103                     path = path.slice(schema.length);
0104                 }
0105                 nameField.text = path;
0106             }
0107         }
0108     }
0109 
0110     function openFileDialog() {
0111         if (!__dialog) {
0112             __dialog = dialogComponent.createObject(root);
0113         }
0114         __dialog.folder = nameField.text;
0115         __dialog.open();
0116     }
0117 
0118     function acceptableInput() {
0119         const name = nameField.text;
0120 
0121         if (permsModel.permissionExists(sectionType, name)) {
0122             return false;
0123         }
0124 
0125         switch (sectionType) {
0126         case FlatpakPermissionsSectionType.Filesystems:
0127             return permsModel.isFilesystemNameValid(name);
0128         case FlatpakPermissionsSectionType.SessionBus:
0129         case FlatpakPermissionsSectionType.SystemBus:
0130             return permsModel.isDBusServiceNameValid(name);
0131         default:
0132             return false;
0133         }
0134     }
0135 
0136     onOpened: {
0137         const ok = standardButton(QQC2.Dialog.Ok);
0138         ok.enabled = Qt.binding(() => acceptableInput());
0139         ok.KeyNavigation.up = valueBox;
0140 
0141         const discard = standardButton(QQC2.Dialog.Discard);
0142         discard.KeyNavigation.up = valueBox;
0143 
0144         nameField.forceActiveFocus(Qt.TabFocusReason);
0145     }
0146 
0147     onAccepted: {
0148         if (acceptableInput()) {
0149             const name = nameField.text;
0150             const value = valueBox.currentValue;
0151             permsModel.addUserEnteredPermission(sectionType, name, value);
0152             close();
0153         }
0154     }
0155 
0156     onDiscarded: {
0157         close();
0158     }
0159 }