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 }