Warning, /network/neochat/src/qml/ContextMenu.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.delegates as Delegates
0012 
0013 import org.kde.neochat
0014 
0015 /**
0016  * Context menu when clicking on a room in the room list
0017  */
0018 Loader {
0019     id: root
0020 
0021     property NeoChatRoom room
0022     required property NeoChatConnection connection
0023 
0024     signal closed
0025 
0026     Component {
0027         id: regularMenu
0028         QQC2.Menu {
0029             QQC2.MenuItem {
0030                 id: newWindow
0031                 text: i18n("Open in New Window")
0032                 icon.name: "window-new"
0033                 onTriggered: RoomManager.openWindow(room)
0034                 visible: !Kirigami.Settings.isMobile
0035             }
0036 
0037             QQC2.MenuSeparator {
0038                 visible: newWindow.visible
0039             }
0040 
0041             QQC2.MenuItem {
0042                 text: room.isFavourite ? i18n("Remove from Favourites") : i18n("Add to Favourites")
0043                 icon.name: room.isFavourite ? "bookmark-remove" : "bookmark-new"
0044                 onTriggered: room.isFavourite ? room.removeTag("m.favourite") : room.addTag("m.favourite", 1.0)
0045             }
0046 
0047             QQC2.MenuItem {
0048                 text: room.isLowPriority ? i18n("Reprioritize") : i18n("Deprioritize")
0049                 icon.name: room.isLowPriority ? "arrow-up" : "arrow-down"
0050                 onTriggered: room.isLowPriority ? room.removeTag("m.lowpriority") : room.addTag("m.lowpriority", 1.0)
0051             }
0052 
0053             QQC2.MenuItem {
0054                 text: i18n("Mark as Read")
0055                 icon.name: "checkmark"
0056                 onTriggered: room.markAllMessagesAsRead()
0057             }
0058 
0059             QQC2.MenuItem {
0060                 text: room.isDirectChat() ? i18nc("@action:inmenu", "Copy user's Matrix ID to Clipboard") : i18nc("@action:inmenu", "Copy Address to Clipboard")
0061                 icon.name: "edit-copy"
0062                 onTriggered: if (room.isDirectChat()) {
0063                     Clipboard.saveText(room.directChatRemoteUser.id);
0064                 } else if (room.canonicalAlias.length === 0) {
0065                     Clipboard.saveText(room.id);
0066                 } else {
0067                     Clipboard.saveText(room.canonicalAlias);
0068                 }
0069             }
0070 
0071             QQC2.Menu {
0072                 title: i18n("Notification State")
0073                 icon.name: "notifications"
0074 
0075                 QQC2.MenuItem {
0076                     text: i18n("Follow Global Setting")
0077                     icon.name: "globe"
0078                     checkable: true
0079                     autoExclusive: true
0080                     checked: room.pushNotificationState === PushNotificationState.Default
0081                     enabled: room.pushNotificationState != PushNotificationState.Unknown
0082                     onTriggered: {
0083                         room.pushNotificationState = PushNotificationState.Default;
0084                     }
0085                 }
0086                 QQC2.MenuItem {
0087                     text: i18nc("As in 'notify for all messages'", "All")
0088                     icon.name: "notifications"
0089                     checkable: true
0090                     autoExclusive: true
0091                     checked: room.pushNotificationState === PushNotificationState.All
0092                     enabled: room.pushNotificationState != PushNotificationState.Unknown
0093                     onTriggered: {
0094                         room.pushNotificationState = PushNotificationState.All;
0095                     }
0096                 }
0097                 QQC2.MenuItem {
0098                     text: i18nc("As in 'notify when the user is mentioned or the message contains a set keyword'", "@Mentions and Keywords")
0099                     icon.name: "im-user"
0100                     checkable: true
0101                     autoExclusive: true
0102                     checked: room.pushNotificationState === PushNotificationState.MentionKeyword
0103                     enabled: room.pushNotificationState != PushNotificationState.Unknown
0104                     onTriggered: {
0105                         room.pushNotificationState = PushNotificationState.MentionKeyword;
0106                     }
0107                 }
0108                 QQC2.MenuItem {
0109                     text: i18nc("As in 'do not notify for any messages'", "Off")
0110                     icon.name: "notifications-disabled"
0111                     checkable: true
0112                     autoExclusive: true
0113                     checked: room.pushNotificationState === PushNotificationState.Mute
0114                     enabled: room.pushNotificationState != PushNotificationState.Unknown
0115                     onTriggered: {
0116                         room.pushNotificationState = PushNotificationState.Mute;
0117                     }
0118                 }
0119             }
0120 
0121             QQC2.MenuItem {
0122                 text: i18n("Room Settings")
0123                 icon.name: "configure"
0124                 onTriggered: QQC2.ApplicationWindow.window.pageStack.pushDialogLayer('qrc:/org/kde/neochat/qml/Categories.qml', {
0125                     room: room,
0126                     connection: connection
0127                 }, {
0128                     title: i18n("Room Settings")
0129                 })
0130             }
0131 
0132             QQC2.MenuSeparator {}
0133 
0134             QQC2.MenuItem {
0135                 text: i18n("Leave Room")
0136                 icon.name: "go-previous"
0137                 onTriggered: RoomManager.leaveRoom(room)
0138             }
0139 
0140             onClosed: {
0141                 root.closed();
0142             }
0143         }
0144     }
0145 
0146     Component {
0147         id: mobileMenu
0148 
0149         Kirigami.OverlayDrawer {
0150             id: drawer
0151 
0152             parent: applicationWindow().overlay
0153             edge: Qt.BottomEdge
0154 
0155             height: popupContent.implicitHeight
0156 
0157             leftPadding: 0
0158             rightPadding: 0
0159             bottomPadding: 0
0160             topPadding: 0
0161 
0162             ColumnLayout {
0163                 id: popupContent
0164 
0165                 width: parent.width
0166                 spacing: 0
0167 
0168                 RowLayout {
0169                     id: headerLayout
0170                     Layout.fillWidth: true
0171                     Layout.margins: Kirigami.Units.largeSpacing
0172                     spacing: Kirigami.Units.largeSpacing
0173                     KirigamiComponents.Avatar {
0174                         id: avatar
0175                         source: room.avatarMediaId ? ("image://mxc/" + room.avatarMediaId) : ""
0176                         name: room.displayName
0177                         Layout.preferredWidth: Kirigami.Units.gridUnit * 3
0178                         Layout.preferredHeight: Kirigami.Units.gridUnit * 3
0179                         Layout.alignment: Qt.AlignTop
0180                     }
0181                     Kirigami.Heading {
0182                         level: 5
0183                         Layout.fillWidth: true
0184                         text: room.displayName
0185                         elide: Text.ElideRight
0186                     }
0187                     QQC2.ToolButton {
0188                         checked: room.isFavourite
0189                         checkable: true
0190                         icon.name: 'favorite'
0191                         Accessible.name: room.isFavourite ? i18n("Remove from Favourites") : i18n("Add to Favourites")
0192                         onClicked: room.isFavourite ? room.removeTag("m.favourite") : room.addTag("m.favourite", 1.0)
0193                     }
0194 
0195                     QQC2.ToolButton {
0196                         icon.name: 'settings-configure'
0197                         onClicked: {
0198                             QQC2.ApplicationWindow.window.pageStack.pushDialogLayer('qrc:/org/kde/neochat/qml/Categories.qml', {
0199                                 room: room,
0200                                 connection: root.connection
0201                             }, {
0202                                 title: i18n("Room Settings")
0203                             });
0204                             drawer.close();
0205                         }
0206                     }
0207                 }
0208 
0209                 Delegates.RoundedItemDelegate {
0210                     text: room.isLowPriority ? i18n("Reprioritize") : i18n("Deprioritize")
0211                     icon.name: room.isLowPriority ? "arrow-up" : "arrow-down"
0212                     onClicked: room.isLowPriority ? room.removeTag("m.lowpriority") : room.addTag("m.lowpriority", 1.0)
0213                     Layout.fillWidth: true
0214                 }
0215 
0216                 Delegates.RoundedItemDelegate {
0217                     text: i18n("Mark as Read")
0218                     icon.name: "checkmark"
0219                     onClicked: room.markAllMessagesAsRead()
0220                     Layout.fillWidth: true
0221                 }
0222 
0223                 Delegates.RoundedItemDelegate {
0224                     text: i18n("Leave Room")
0225                     icon.name: "go-previous"
0226                     onClicked: {
0227                         RoomManager.leaveRoom(room);
0228                         drawer.close();
0229                     }
0230                     Layout.fillWidth: true
0231                 }
0232             }
0233 
0234             onClosed: root.closed()
0235         }
0236     }
0237 
0238     asynchronous: true
0239     sourceComponent: Kirigami.Settings.isMobile ? mobileMenu : regularMenu
0240 
0241     function open() {
0242         active = true;
0243     }
0244 
0245     onStatusChanged: if (status == Loader.Ready) {
0246         if (Kirigami.Settings.isMobile) {
0247             item.open();
0248         } else {
0249             item.popup();
0250         }
0251     }
0252 }