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 }