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

0001 // SPDX-FileCopyrightText: 2019 Black Hat <bhat@encom.eu.org>
0002 // SPDX-FileCopyrightText: 2020 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 
0009 import org.kde.kirigami as Kirigami
0010 import org.kde.kirigamiaddons.components as KirigamiComponents
0011 import org.kde.kirigamiaddons.formcard as FormCard
0012 import org.kde.prison
0013 
0014 import org.kde.neochat
0015 
0016 Kirigami.Dialog {
0017     id: root
0018 
0019     property NeoChatRoom room
0020     property var user
0021 
0022     parent: applicationWindow().overlay
0023 
0024     leftPadding: 0
0025     rightPadding: 0
0026     topPadding: 0
0027     bottomPadding: 0
0028 
0029     standardButtons: Kirigami.Dialog.NoButton
0030 
0031     width: Math.min(applicationWindow().width, Kirigami.Units.gridUnit * 24)
0032     title: i18nc("@title:menu Account details dialog", "Account Details")
0033 
0034     contentItem: ColumnLayout {
0035         spacing: 0
0036         RowLayout {
0037             Layout.fillWidth: true
0038             Layout.leftMargin: Kirigami.Units.largeSpacing
0039             Layout.rightMargin: Kirigami.Units.largeSpacing
0040             Layout.topMargin: Kirigami.Units.largeSpacing
0041             Layout.bottomMargin: Kirigami.Units.largeSpacing
0042             spacing: Kirigami.Units.largeSpacing
0043 
0044             KirigamiComponents.Avatar {
0045                 id: avatar
0046                 Layout.preferredWidth: Kirigami.Units.iconSizes.huge
0047                 Layout.preferredHeight: Kirigami.Units.iconSizes.huge
0048 
0049                 name: root.user.displayName
0050                 source: root.user.avatarSource
0051                 color: root.user.color
0052             }
0053 
0054             ColumnLayout {
0055                 Layout.fillWidth: true
0056 
0057                 Kirigami.Heading {
0058                     level: 1
0059                     Layout.fillWidth: true
0060                     font.bold: true
0061 
0062                     elide: Text.ElideRight
0063                     wrapMode: Text.NoWrap
0064                     text: user.displayName
0065                     textFormat: Text.PlainText
0066                 }
0067 
0068                 Kirigami.SelectableLabel {
0069                     textFormat: TextEdit.PlainText
0070                     text: root.user.id
0071                 }
0072             }
0073             QQC2.AbstractButton {
0074                 Layout.minimumHeight: avatar.height * 0.75
0075                 Layout.maximumHeight: avatar.height * 1.5
0076                 contentItem: Barcode {
0077                     id: barcode
0078                     barcodeType: Barcode.QRCode
0079                     content: "https://matrix.to/#/" + root.user.id
0080                 }
0081 
0082                 onClicked: {
0083                     let map = qrMaximizeComponent.createObject(parent, {
0084                         text: barcode.content,
0085                         title: root.user.displayName,
0086                         subtitle: root.user.id,
0087                         avatarColor: root.user.color,
0088                         avatarSource: root.user.avatarSource,
0089                     });
0090                     root.close()
0091                     map.open()
0092                 }
0093 
0094                 QQC2.ToolTip.visible: hovered
0095                 QQC2.ToolTip.text: barcode.content
0096                 QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
0097             }
0098         }
0099 
0100         Kirigami.Separator {
0101             Layout.fillWidth: true
0102         }
0103 
0104         FormCard.FormButtonDelegate {
0105             visible: !root.user.isLocalUser
0106             action: Kirigami.Action {
0107                 text: room.connection.isIgnored(root.user.object) ? i18n("Unignore this user") : i18n("Ignore this user")
0108                 icon.name: "im-invisible-user"
0109                 onTriggered: {
0110                     root.close()
0111                     room.connection.isIgnored(root.user.object) ? room.connection.removeFromIgnoredUsers(root.user.object) : room.connection.addToIgnoredUsers(root.user.object)
0112                 }
0113             }
0114         }
0115 
0116         FormCard.FormButtonDelegate {
0117             visible: !root.user.isLocalUser && room.canSendState("kick") && room.containsUser(root.user.id) && room.getUserPowerLevel(root.user.id) < room.getUserPowerLevel(root.room.connection.localUser.id)
0118 
0119             action: Kirigami.Action {
0120                 text: i18n("Kick this user")
0121                 icon.name: "im-kick-user"
0122                 onTriggered: {
0123                     room.kickMember(root.user.id)
0124                     root.close()
0125                 }
0126             }
0127         }
0128 
0129         FormCard.FormButtonDelegate {
0130             visible: !root.user.isLocalUser && room.canSendState("invite") && !room.containsUser(root.user.id)
0131 
0132             action: Kirigami.Action {
0133                 enabled: !room.isUserBanned(root.user.id)
0134                 text: i18n("Invite this user")
0135                 icon.name: "list-add-user"
0136                 onTriggered: {
0137                     room.inviteToRoom(root.user.id)
0138                     root.close()
0139                 }
0140             }
0141         }
0142 
0143         FormCard.FormButtonDelegate {
0144             visible: !root.user.isLocalUser && room.canSendState("ban") && !room.isUserBanned(root.user.id) && room.getUserPowerLevel(root.user.id) < room.getUserPowerLevel(root.room.connection.localUser.id)
0145 
0146             action: Kirigami.Action {
0147                 text: i18n("Ban this user")
0148                 icon.name: "im-ban-user"
0149                 icon.color: Kirigami.Theme.negativeTextColor
0150                 onTriggered: {
0151                     applicationWindow().pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/BanSheet.qml", {room: root.room, userId: root.user.id}, {
0152                         title: i18nc("@title", "Ban User"),
0153                         width: Kirigami.Units.gridUnit * 25
0154                     })
0155                     root.close()
0156                 }
0157             }
0158         }
0159 
0160         FormCard.FormButtonDelegate {
0161             visible: !root.user.isLocalUser && room.canSendState("ban") && room.isUserBanned(root.user.id)
0162 
0163             action: Kirigami.Action {
0164                 text: i18n("Unban this user")
0165                 icon.name: "im-irc"
0166                 icon.color: Kirigami.Theme.negativeTextColor
0167                 onTriggered: {
0168                     room.unban(root.user.id)
0169                     root.close()
0170                 }
0171             }
0172         }
0173 
0174         FormCard.FormButtonDelegate {
0175             visible: room.canSendState("m.room.power_levels")
0176             action: Kirigami.Action {
0177                 text: i18n("Set user power level")
0178                 icon.name: "visibility"
0179                 onTriggered: {
0180                     let dialog = powerLevelDialog.createObject(applicationWindow().overlay, {
0181                         room: root.room,
0182                         userId: root.user.id,
0183                         powerLevel: root.room.getUserPowerLevel(root.user.id)
0184                     });
0185                     dialog.open()
0186                     root.close()
0187                 }
0188             }
0189 
0190             Component {
0191                 id: powerLevelDialog
0192                 PowerLevelDialog {
0193                     id: powerLevelDialog
0194                 }
0195             }
0196         }
0197 
0198         FormCard.FormButtonDelegate {
0199             visible: root.user.isLocalUser || room.canSendState("redact")
0200 
0201             action: Kirigami.Action {
0202                 text: i18n("Remove recent messages by this user")
0203                 icon.name: "delete"
0204                 icon.color: Kirigami.Theme.negativeTextColor
0205                 onTriggered: {
0206                     applicationWindow().pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/RemoveSheet.qml", {room: root.room, userId: root.user.id}, {
0207                         title: i18nc("@title", "Remove Messages"),
0208                         width: Kirigami.Units.gridUnit * 25
0209                     })
0210                     root.close()
0211                 }
0212             }
0213         }
0214 
0215         FormCard.FormButtonDelegate {
0216             visible: !root.user.isLocalUser
0217             action: Kirigami.Action {
0218                 text: i18n("Open a private chat")
0219                 icon.name: "document-send"
0220                 onTriggered: {
0221                     root.room.connection.openOrCreateDirectChat(root.user.object)
0222                     root.close()
0223                 }
0224             }
0225         }
0226 
0227         FormCard.FormButtonDelegate {
0228             action: Kirigami.Action {
0229                 text: i18n("Copy link")
0230                 icon.name: "username-copy"
0231                 onTriggered: {
0232                     Clipboard.saveText("https://matrix.to/#/" + root.user.id)
0233                 }
0234             }
0235         }
0236     }
0237     Component {
0238         id: qrMaximizeComponent
0239         QrCodeMaximizeComponent {}
0240     }
0241 }
0242