Warning, /plasma/flatpak-kcm/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
0007 import QtQuick.Controls as QQC2
0008 import QtQuick.Layouts
0009 import QtQuick.Dialogs as QtDialogs
0010 
0011 import org.kde.kirigami as Kirigami
0012 import org.kde.plasma.kcm.flatpakpermissions
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.FolderDialog __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.FolderDialog {
0098             onAccepted: {
0099                 let path = selectedFolder.toString();
0100                 const schema = "file://";
0101                 if (path.startsWith(schema)) {
0102                     path = path.slice(schema.length);
0103                 }
0104                 nameField.text = path;
0105             }
0106         }
0107     }
0108 
0109     function openFileDialog() {
0110         if (!__dialog) {
0111             __dialog = dialogComponent.createObject(root);
0112         }
0113         __dialog.selectedFolder = nameField.text;
0114         __dialog.open();
0115     }
0116 
0117     function acceptableInput() {
0118         const name = nameField.text;
0119 
0120         if (permsModel.permissionExists(sectionType, name)) {
0121             return false;
0122         }
0123 
0124         switch (sectionType) {
0125         case FlatpakPermissionsSectionType.Filesystems:
0126             return permsModel.isFilesystemNameValid(name);
0127         case FlatpakPermissionsSectionType.SessionBus:
0128         case FlatpakPermissionsSectionType.SystemBus:
0129             return permsModel.isDBusServiceNameValid(name);
0130         default:
0131             return false;
0132         }
0133     }
0134 
0135     onOpened: {
0136         const ok = standardButton(QQC2.Dialog.Ok);
0137         ok.enabled = Qt.binding(() => acceptableInput());
0138         ok.KeyNavigation.up = valueBox;
0139 
0140         const discard = standardButton(QQC2.Dialog.Discard);
0141         discard.KeyNavigation.up = valueBox;
0142 
0143         nameField.forceActiveFocus(Qt.PopupFocusReason);
0144     }
0145 
0146     onAccepted: {
0147         if (acceptableInput()) {
0148             const name = nameField.text;
0149             const value = valueBox.currentValue;
0150             permsModel.addUserEnteredPermission(sectionType, name, value);
0151             close();
0152         }
0153     }
0154 
0155     onDiscarded: {
0156         close();
0157     }
0158 }