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 }