Warning, /network/neochat/src/qml/RoomInformation.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2023 James Graham <james.h.graham@protonmail.com> 0002 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0003 0004 import QtQuick 0005 import QtQuick.Controls as QQC2 0006 import QtQuick.Layouts 0007 0008 import org.kde.kirigami as Kirigami 0009 import org.kde.kirigamiaddons.delegates as Delegates 0010 import org.kde.kirigamiaddons.labs.components as KirigamiComponents 0011 import org.kde.kitemmodels 0012 0013 import org.kde.neochat 0014 import org.kde.neochat.config 0015 0016 /** 0017 * @brief Component for visualising the room information. 0018 * 0019 * The component has a header section which changes between group rooms and direct 0020 * chats with information like the avatar and topic. Followed by the allowed actions 0021 * and finally a user list. 0022 * 0023 * @note This component is only the contents, it will need to be placed in either 0024 * a drawer (desktop) or page (mobile) to be used. 0025 * 0026 * @sa RoomDrawer, RoomDrawerPage 0027 */ 0028 QQC2.ScrollView { 0029 id: root 0030 0031 /** 0032 * @brief The current room that user is viewing. 0033 */ 0034 required property NeoChatRoom room 0035 0036 required property NeoChatConnection connection 0037 0038 /** 0039 * @brief The title that should be displayed for this component if available. 0040 */ 0041 readonly property string title: root.room.isSpace ? i18nc("@action:title", "Space Members") : i18nc("@action:title", "Room information") 0042 0043 // HACK: Hide unnecessary horizontal scrollbar (https://bugreports.qt.io/browse/QTBUG-83890) 0044 QQC2.ScrollBar.horizontal.policy: QQC2.ScrollBar.AlwaysOff 0045 0046 ListView { 0047 id: userList 0048 header: ColumnLayout { 0049 id: columnLayout 0050 0051 property alias userListSearchField: userListSearchField 0052 0053 spacing: 0 0054 width: ListView.view ? ListView.view.width - ListView.view.leftMargin - ListView.view.rightMargin : 0 0055 0056 Loader { 0057 active: true 0058 Layout.fillWidth: true 0059 Layout.topMargin: Kirigami.Units.smallSpacing 0060 visible: !root.room.isSpace 0061 sourceComponent: root.room.isDirectChat() ? directChatDrawerHeader : groupChatDrawerHeader 0062 onItemChanged: if (item) { 0063 userList.positionViewAtBeginning(); 0064 } 0065 } 0066 0067 Kirigami.ListSectionHeader { 0068 visible: !root.room.isSpace 0069 label: i18n("Options") 0070 activeFocusOnTab: false 0071 0072 Layout.fillWidth: true 0073 } 0074 0075 Delegates.RoundedItemDelegate { 0076 id: devtoolsButton 0077 0078 icon.name: "tools" 0079 text: i18n("Open developer tools") 0080 visible: Config.developerTools && !root.room.isSpace 0081 0082 Layout.fillWidth: true 0083 0084 onClicked: { 0085 applicationWindow().pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/DevtoolsPage.qml", { 0086 room: root.room, 0087 connection: root.connection 0088 }, { 0089 title: i18n("Developer Tools") 0090 }); 0091 } 0092 } 0093 0094 Delegates.RoundedItemDelegate { 0095 id: searchButton 0096 visible: !root.room.isSpace 0097 icon.name: "search" 0098 text: i18n("Search in this room") 0099 0100 Layout.fillWidth: true 0101 0102 onClicked: { 0103 pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/RoomSearchPage.qml", { 0104 room: root.room 0105 }, { 0106 title: i18nc("@action:title", "Search") 0107 }); 0108 } 0109 } 0110 0111 Delegates.RoundedItemDelegate { 0112 id: favouriteButton 0113 visible: !root.room.isSpace 0114 icon.name: root.room && root.room.isFavourite ? "rating" : "rating-unrated" 0115 text: root.room && root.room.isFavourite ? i18n("Remove room from favorites") : i18n("Make room favorite") 0116 0117 onClicked: root.room.isFavourite ? root.room.removeTag("m.favourite") : root.room.addTag("m.favourite", 1.0) 0118 0119 Layout.fillWidth: true 0120 } 0121 0122 Delegates.RoundedItemDelegate { 0123 id: locationsButton 0124 visible: !root.room.isSpace 0125 icon.name: "map-flat" 0126 text: i18n("Show locations for this room") 0127 0128 onClicked: pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/LocationsPage.qml", { 0129 room: root.room 0130 }, { 0131 title: i18nc("Locations on a map", "Locations") 0132 }) 0133 0134 Layout.fillWidth: true 0135 } 0136 0137 Kirigami.ListSectionHeader { 0138 label: i18n("Members") 0139 activeFocusOnTab: false 0140 spacing: 0 0141 visible: !root.room.isDirectChat() 0142 0143 Layout.fillWidth: true 0144 0145 QQC2.ToolButton { 0146 visible: root.room.canSendState("invite") 0147 icon.name: "list-add-user" 0148 0149 onClicked: { 0150 applicationWindow().pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/InviteUserPage.qml", { 0151 room: root.room 0152 }, { 0153 title: i18nc("@title", "Invite a User") 0154 }); 0155 } 0156 0157 QQC2.ToolTip.text: i18n("Invite user to room") 0158 QQC2.ToolTip.visible: hovered 0159 QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay 0160 } 0161 0162 QQC2.Label { 0163 Layout.alignment: Qt.AlignRight 0164 text: root.room ? i18np("%1 member", "%1 members", root.room.joinedCount) : i18n("No member count") 0165 } 0166 } 0167 0168 Kirigami.SearchField { 0169 id: userListSearchField 0170 0171 visible: !root.room.isDirectChat() 0172 onVisibleChanged: if (visible) { 0173 forceActiveFocus(); 0174 } 0175 Layout.fillWidth: true 0176 Layout.leftMargin: Kirigami.Units.largeSpacing 0177 Layout.rightMargin: Kirigami.Units.largeSpacing 0178 Layout.bottomMargin: Kirigami.Units.smallSpacing 0179 0180 focusSequence: "Ctrl+Shift+F" 0181 0182 onAccepted: sortedMessageEventModel.filterString = text 0183 } 0184 } 0185 0186 KSortFilterProxyModel { 0187 id: sortedMessageEventModel 0188 0189 sourceModel: UserListModel { 0190 room: root.room 0191 } 0192 0193 sortRoleName: "powerLevel" 0194 sortOrder: Qt.DescendingOrder 0195 filterRoleName: "name" 0196 filterCaseSensitivity: Qt.CaseInsensitive 0197 } 0198 0199 model: root.room.isDirectChat() ? 0 : sortedMessageEventModel 0200 0201 clip: true 0202 activeFocusOnTab: true 0203 0204 delegate: Delegates.RoundedItemDelegate { 0205 id: userDelegate 0206 0207 required property string name 0208 required property string userId 0209 required property string avatar 0210 required property int powerLevel 0211 required property string powerLevelString 0212 0213 implicitHeight: Kirigami.Units.gridUnit * 2 0214 0215 text: name 0216 0217 onClicked: { 0218 userDelegate.highlighted = true; 0219 RoomManager.resolveResource(userDelegate.userId, "mention"); 0220 } 0221 0222 contentItem: RowLayout { 0223 KirigamiComponents.Avatar { 0224 implicitWidth: height 0225 sourceSize { 0226 height: Kirigami.Units.gridUnit + Kirigami.Units.smallSpacing * 2.5 0227 width: Kirigami.Units.gridUnit + Kirigami.Units.smallSpacing * 2.5 0228 } 0229 source: userDelegate.avatar 0230 name: userDelegate.userId 0231 0232 Layout.fillHeight: true 0233 } 0234 0235 QQC2.Label { 0236 text: userDelegate.name 0237 textFormat: Text.PlainText 0238 elide: Text.ElideRight 0239 0240 Layout.fillWidth: true 0241 } 0242 0243 QQC2.Label { 0244 visible: userDelegate.powerLevel > 0 0245 0246 text: userDelegate.powerLevelString 0247 color: Kirigami.Theme.disabledTextColor 0248 textFormat: Text.PlainText 0249 } 0250 } 0251 } 0252 } 0253 0254 Component { 0255 id: groupChatDrawerHeader 0256 GroupChatDrawerHeader { 0257 room: root.room 0258 } 0259 } 0260 0261 Component { 0262 id: directChatDrawerHeader 0263 DirectChatDrawerHeader { 0264 room: root.room 0265 } 0266 } 0267 0268 onRoomChanged: { 0269 if (root.headerItem) { 0270 root.headerItem.userListSearchField.text = ""; 0271 } 0272 userList.currentIndex = -1; 0273 } 0274 }