Warning, /network/neochat/src/qml/General.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2019-2020 Black Hat <bhat@encom.eu.org>
0002 // SPDX-FileCopyrightText: 2021 Carl Schwan <carl@carlschwan.eu>
0003 // SPDX-License-Identifier: GPL-3.0-only
0004 
0005 import QtQuick
0006 import QtQuick.Controls as QQC2
0007 import QtQuick.Layouts
0008 import QtQuick.Window
0009 
0010 import org.kde.kirigami as Kirigami
0011 import org.kde.kirigamiaddons.formcard as FormCard
0012 import org.kde.kirigamiaddons.labs.components as KirigamiComponents
0013 
0014 import org.kde.neochat
0015 
0016 FormCard.FormCardPage {
0017     id: root
0018 
0019     property NeoChatRoom room
0020     required property NeoChatConnection connection
0021 
0022     title: i18n("General")
0023 
0024     FormCard.FormHeader {
0025         title: i18n("Room Information")
0026     }
0027     FormCard.FormCard {
0028         FormCard.AbstractFormDelegate {
0029             background: null
0030             contentItem: RowLayout {
0031                 Item {
0032                     Layout.fillWidth: true
0033                 }
0034                 KirigamiComponents.Avatar {
0035                     id: avatar
0036                     Layout.alignment: Qt.AlignRight
0037                     name: room.name
0038                     source: room.avatarMediaId ? ("image://mxc/" + room.avatarMediaId) : ""
0039                     implicitWidth: Kirigami.Units.iconSizes.enormous
0040                     implicitHeight: Kirigami.Units.iconSizes.enormous
0041                 }
0042                 QQC2.Button {
0043                     Layout.alignment: Qt.AlignLeft
0044                     enabled: room.canSendState("m.room.avatar")
0045                     visible: enabled
0046                     icon.name: "cloud-upload"
0047                     text: i18n("Update avatar")
0048                     display: QQC2.AbstractButton.IconOnly
0049 
0050                     onClicked: {
0051                         const fileDialog = openFileDialog.createObject(QQC2.ApplicationWindow.overlay);
0052                         fileDialog.chosen.connect(function (path) {
0053                             if (!path)
0054                                 return;
0055                             room.changeAvatar(path);
0056                         });
0057                         fileDialog.open();
0058                     }
0059 
0060                     QQC2.ToolTip.text: text
0061                     QQC2.ToolTip.visible: hovered
0062                 }
0063                 Item {
0064                     Layout.fillWidth: true
0065                 }
0066             }
0067         }
0068         FormCard.FormTextFieldDelegate {
0069             id: roomNameField
0070             label: i18n("Room name:")
0071             text: room.name
0072             readOnly: !room.canSendState("m.room.name")
0073         }
0074         FormCard.AbstractFormDelegate {
0075             id: roomTopicField
0076             background: Item {}
0077             contentItem: ColumnLayout {
0078                 QQC2.Label {
0079                     id: roomTopicLabel
0080                     text: i18n("Room topic:")
0081                     Layout.fillWidth: true
0082                 }
0083                 QQC2.TextArea {
0084                     id: roomTopicTextArea
0085                     Accessible.description: roomTopicLabel.text
0086                     Layout.fillWidth: true
0087                     wrapMode: TextEdit.Wrap
0088                     text: room.topic
0089                     readOnly: !room.canSendState("m.room.topic")
0090                     onTextChanged: roomTopicField.text = text
0091                 }
0092             }
0093         }
0094         FormCard.AbstractFormDelegate {
0095             visible: !roomNameField.readOnly || !roomTopicTextArea.readOnly
0096             background: Item {}
0097             contentItem: RowLayout {
0098                 Item {
0099                     Layout.fillWidth: true
0100                 }
0101                 QQC2.Button {
0102                     Layout.bottomMargin: Kirigami.Units.smallSpacing
0103                     Layout.topMargin: Kirigami.Units.smallSpacing
0104                     enabled: room.name !== roomNameField.text || room.topic !== roomTopicField.text
0105                     text: i18n("Save")
0106                     onClicked: {
0107                         if (room.name != roomNameField.text) {
0108                             room.setName(roomNameField.text);
0109                         }
0110                         if (room.topic != roomTopicField.text) {
0111                             room.setTopic(roomTopicField.text);
0112                         }
0113                     }
0114                 }
0115             }
0116         }
0117         FormCard.FormTextDelegate {
0118             id: roomIdDelegate
0119             text: i18n("Room ID")
0120             description: room.id
0121 
0122             contentItem.children: QQC2.Button {
0123                 visible: roomIdDelegate.hovered
0124                 text: i18n("Copy room ID to clipboard")
0125                 icon.name: "edit-copy"
0126                 display: QQC2.AbstractButton.IconOnly
0127 
0128                 onClicked: {
0129                     Clipboard.saveText(room.id);
0130                 }
0131 
0132                 QQC2.ToolTip.text: text
0133                 QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
0134                 QQC2.ToolTip.visible: hovered
0135             }
0136         }
0137         FormCard.FormTextDelegate {
0138             text: i18n("Room version")
0139             description: room.version
0140 
0141             contentItem.children: QQC2.Button {
0142                 visible: room.canSwitchVersions()
0143                 enabled: room.version < room.maxRoomVersion
0144                 text: i18n("Upgrade Room")
0145                 icon.name: "arrow-up-double"
0146 
0147                 onClicked: {
0148                     if (room.canSwitchVersions()) {
0149                         roomUpgradeSheet.currentRoomVersion = room.version;
0150                         roomUpgradeSheet.open();
0151                     }
0152                 }
0153 
0154                 QQC2.ToolTip {
0155                     text: text
0156                     delay: Kirigami.Units.toolTipDelay
0157                 }
0158             }
0159         }
0160     }
0161 
0162     FormCard.FormHeader {
0163         title: i18n("Aliases")
0164     }
0165     FormCard.FormCard {
0166         FormCard.FormTextDelegate {
0167             visible: room.aliases.length <= 0
0168             text: i18n("No canonical alias set")
0169         }
0170         Repeater {
0171             id: altAliasRepeater
0172             model: room.aliases.slice().reverse()
0173 
0174             delegate: FormCard.FormTextDelegate {
0175                 text: modelData
0176                 description: room.canonicalAlias.length > 0 && modelData === room.canonicalAlias ? "Canonical alias" : ""
0177                 contentItem.children: [
0178                     QQC2.ToolButton {
0179                         id: setCanonicalAliasButton
0180                         visible: modelData !== room.canonicalAlias && room.canSendState("m.room.canonical_alias")
0181                         text: i18n("Make this alias the room's canonical alias")
0182                         icon.name: "checkmark"
0183                         display: QQC2.AbstractButton.IconOnly
0184 
0185                         onClicked: {
0186                             room.setCanonicalAlias(modelData);
0187                         }
0188                         QQC2.ToolTip {
0189                             text: setCanonicalAliasButton.text
0190                             delay: Kirigami.Units.toolTipDelay
0191                         }
0192                     },
0193                     QQC2.ToolButton {
0194                         id: deleteButton
0195                         visible: room.canSendState("m.room.canonical_alias")
0196                         text: i18n("Delete alias")
0197                         icon.name: "edit-delete-remove"
0198                         display: QQC2.AbstractButton.IconOnly
0199 
0200                         onClicked: {
0201                             room.unmapAlias(modelData);
0202                         }
0203                         QQC2.ToolTip {
0204                             text: deleteButton.text
0205                             delay: Kirigami.Units.toolTipDelay
0206                         }
0207                     }
0208                 ]
0209             }
0210         }
0211         FormCard.AbstractFormDelegate {
0212             visible: room.canSendState("m.room.canonical_alias")
0213 
0214             contentItem: RowLayout {
0215                 Kirigami.ActionTextField {
0216                     id: aliasAddField
0217 
0218                     Layout.fillWidth: true
0219 
0220                     placeholderText: i18n("#new_alias:server.org")
0221 
0222                     rightActions: Kirigami.Action {
0223                         icon.name: "edit-clear"
0224                         visible: aliasAddField.text.length > 0
0225                         onTriggered: {
0226                             aliasAddField.text = "";
0227                         }
0228                     }
0229 
0230                     onAccepted: {
0231                         room.mapAlias(aliasAddField.text);
0232                     }
0233                 }
0234                 QQC2.Button {
0235                     id: addButton
0236 
0237                     text: i18n("Add new alias")
0238                     Accessible.name: text
0239                     icon.name: "list-add"
0240                     display: QQC2.AbstractButton.IconOnly
0241                     enabled: aliasAddField.text.length > 0
0242 
0243                     onClicked: {
0244                         room.mapAlias(aliasAddField.text);
0245                     }
0246 
0247                     QQC2.ToolTip {
0248                         text: addButton.text
0249                         delay: Kirigami.Units.toolTipDelay
0250                     }
0251                 }
0252             }
0253         }
0254     }
0255 
0256     FormCard.FormHeader {
0257         title: i18n("URL Previews")
0258     }
0259     FormCard.FormCard {
0260         FormCard.FormCheckDelegate {
0261             text: i18n("Enable URL previews by default for room members")
0262             checked: room.defaultUrlPreviewState
0263             visible: room.canSendState("org.matrix.room.preview_urls")
0264             onToggled: {
0265                 room.defaultUrlPreviewState = checked;
0266             }
0267         }
0268         FormCard.FormCheckDelegate {
0269             text: i18n("Enable URL previews")
0270             // Most users won't see the above setting so tell them the default.
0271             description: room.defaultUrlPreviewState ? i18n("URL previews are enabled by default in this room") : i18n("URL previews are disabled by default in this room")
0272             checked: room.urlPreviewEnabled
0273             onToggled: {
0274                 room.urlPreviewEnabled = checked;
0275             }
0276         }
0277     }
0278     FormCard.FormHeader {
0279         title: i18n("Official Parent Spaces")
0280     }
0281     FormCard.FormCard {
0282         Repeater {
0283             id: officalParentRepeater
0284             model: root.room.parentIds
0285 
0286             delegate: FormCard.FormTextDelegate {
0287                 id: officalParentDelegate
0288                 required property string modelData
0289                 property NeoChatRoom space: root.connection.room(modelData)
0290                 text: {
0291                     if (space) {
0292                         return space.displayName;
0293                     } else {
0294                         return modelData;
0295                     }
0296                 }
0297                 description: {
0298                     if (space) {
0299                         if (space.canonicalAlias.length > 0) {
0300                             return space.canonicalAlias;
0301                         } else {
0302                             return modelData;
0303                         }
0304                     } else {
0305                         return "";
0306                     }
0307                 }
0308 
0309                 contentItem.children: RowLayout {
0310                     QQC2.Label {
0311                         visible: root.room.canonicalParent === officalParentDelegate.modelData
0312                         text: i18n("Canonical")
0313                     }
0314                     QQC2.ToolButton {
0315                         visible: root.room.canSendState("m.space.parent") && root.room.canonicalParent !== officalParentDelegate.modelData
0316                         display: QQC2.AbstractButton.IconOnly
0317                         action: Kirigami.Action {
0318                             id: canonicalParentAction
0319                             text: i18n("Make canonical parent")
0320                             icon.name: "checkmark"
0321                             onTriggered: root.room.canonicalParent = officalParentDelegate.modelData
0322                         }
0323                         QQC2.ToolTip {
0324                             text: canonicalParentAction.text
0325                             delay: Kirigami.Units.toolTipDelay
0326                         }
0327                     }
0328                     QQC2.ToolButton {
0329                         visible: officalParentDelegate?.space.canSendState("m.space.child") && root.room.canSendState("m.space.parent")
0330                         display: QQC2.AbstractButton.IconOnly
0331                         action: Kirigami.Action {
0332                             id: removeParentAction
0333                             text: i18n("Remove parent")
0334                             icon.name: "edit-delete-remove"
0335                             onTriggered: root.room.removeParent(officalParentDelegate.modelData)
0336                         }
0337                         QQC2.ToolTip {
0338                             text: removeParentAction.text
0339                             delay: Kirigami.Units.toolTipDelay
0340                         }
0341                     }
0342                 }
0343             }
0344         }
0345         FormCard.FormTextDelegate {
0346             visible: officalParentRepeater.count <= 0
0347             text: i18n("This room has no official parent spaces.")
0348         }
0349         FormCard.FormButtonDelegate {
0350             visible: root.room.canSendState("m.space.parent")
0351             text: i18nc("@action:button", "Add new official parent")
0352             onClicked: selectParentDialog.createObject(applicationWindow().overlay).open()
0353 
0354             Component {
0355                 id: selectParentDialog
0356                 SelectParentDialog {
0357                     room: root.room
0358                 }
0359             }
0360         }
0361     }
0362 
0363     Kirigami.InlineMessage {
0364         Layout.maximumWidth: Kirigami.Units.gridUnit * 30
0365         Layout.alignment: Qt.AlignHCenter
0366         text: i18n("This room continues another conversation.")
0367         type: Kirigami.MessageType.Information
0368         visible: room.predecessorId && room.connection.room(room.predecessorId)
0369         actions: Kirigami.Action {
0370             text: i18n("See older messages…")
0371             onTriggered: {
0372                 RoomManager.resolveResource(room.predecessorId);
0373                 root.close();
0374             }
0375         }
0376     }
0377     Kirigami.InlineMessage {
0378         Layout.maximumWidth: Kirigami.Units.gridUnit * 30
0379         Layout.alignment: Qt.AlignHCenter
0380         text: i18n("This room has been replaced.")
0381         type: Kirigami.MessageType.Information
0382         visible: room.successorId && room.connection.room(room.successorId)
0383         actions: Kirigami.Action {
0384             text: i18n("See new room…")
0385             onTriggered: {
0386                 RoomManager.resolveResource(room.successorId);
0387                 root.close();
0388             }
0389         }
0390     }
0391 
0392     property Component openFileDialog: Component {
0393         id: openFileDialog
0394 
0395         OpenFileDialog {
0396             parentWindow: root.Window.window
0397         }
0398     }
0399 
0400     property Kirigami.OverlaySheet roomUpgradeSheet: Kirigami.OverlaySheet {
0401         id: roomUpgradeSheet
0402 
0403         property var currentRoomVersion
0404 
0405         title: i18n("Upgrade the Room")
0406         Kirigami.FormLayout {
0407             QQC2.SpinBox {
0408                 id: spinBox
0409                 Kirigami.FormData.label: i18n("Select new version")
0410                 from: room.version
0411                 to: room.maxRoomVersion
0412                 value: room.version
0413             }
0414             QQC2.Button {
0415                 text: i18n("Confirm")
0416                 onClicked: {
0417                     room.switchVersion(spinBox.value);
0418                     roomUpgradeSheet.close();
0419                 }
0420             }
0421         }
0422     }
0423 }