Warning, /network/neochat/src/qml/SelectParentDialog.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.formcard as FormCard
0010 import org.kde.kirigamiaddons.labs.components as Components
0011
0012 import org.kde.neochat
0013
0014 /**
0015 * @brief A dialog to select a parent space to add to a given room.
0016 */
0017 Kirigami.Dialog {
0018 id: root
0019
0020 /**
0021 * @brief The current room that a parent is being selected for.
0022 */
0023 required property NeoChatRoom room
0024
0025 title: i18nc("@title", "Select new official parent")
0026
0027 width: Math.min(applicationWindow().width, Kirigami.Units.gridUnit * 24)
0028 leftPadding: 0
0029 rightPadding: 0
0030 topPadding: 0
0031 bottomPadding: 0
0032
0033 standardButtons: Kirigami.Dialog.Cancel
0034 customFooterActions: [
0035 Kirigami.Action {
0036 enabled: chosenRoomDelegate.visible && root.room.canModifyParent(chosenRoomDelegate.roomId)
0037 text: i18n("OK")
0038 icon.name: "dialog-ok"
0039 onTriggered: {
0040 root.room.addParent(chosenRoomDelegate.roomId, makeCanonicalCheck.checked, existingOfficialCheck.checked);
0041 root.close();
0042 }
0043 }
0044 ]
0045
0046 contentItem: ColumnLayout {
0047 spacing: 0
0048 FormCard.FormButtonDelegate {
0049 visible: !chosenRoomDelegate.visible
0050 text: i18nc("@action:button", "Pick room")
0051 onClicked: {
0052 let dialog = pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/ExploreRoomsPage.qml", {
0053 connection: root.room.connection,
0054 showOnlySpaces: true
0055 }, {
0056 title: i18nc("@title", "Choose Parent Space")
0057 });
0058 dialog.roomSelected.connect((roomId, displayName, avatarUrl, alias, topic, memberCount, isJoined) => {
0059 chosenRoomDelegate.roomId = roomId;
0060 chosenRoomDelegate.displayName = displayName;
0061 chosenRoomDelegate.avatarUrl = avatarUrl;
0062 chosenRoomDelegate.alias = alias;
0063 chosenRoomDelegate.topic = topic;
0064 chosenRoomDelegate.memberCount = memberCount;
0065 chosenRoomDelegate.isJoined = isJoined;
0066 chosenRoomDelegate.visible = true;
0067 });
0068 }
0069 }
0070 FormCard.AbstractFormDelegate {
0071 id: chosenRoomDelegate
0072 property string roomId
0073 property string displayName
0074 property url avatarUrl
0075 property string alias
0076 property string topic
0077 property int memberCount
0078 property bool isJoined
0079
0080 visible: false
0081
0082 contentItem: RowLayout {
0083 Components.Avatar {
0084 Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0085 Layout.preferredHeight: Kirigami.Units.gridUnit * 2
0086
0087 source: chosenRoomDelegate.avatarUrl
0088 name: chosenRoomDelegate.displayName
0089 }
0090 ColumnLayout {
0091 Layout.fillWidth: true
0092 RowLayout {
0093 Layout.fillWidth: true
0094 Kirigami.Heading {
0095 Layout.fillWidth: true
0096 level: 4
0097 text: chosenRoomDelegate.displayName
0098 font.bold: true
0099 textFormat: Text.PlainText
0100 elide: Text.ElideRight
0101 wrapMode: Text.NoWrap
0102 }
0103 QQC2.Label {
0104 visible: chosenRoomDelegate.isJoined
0105 text: i18n("Joined")
0106 color: Kirigami.Theme.linkColor
0107 }
0108 }
0109 QQC2.Label {
0110 Layout.fillWidth: true
0111 visible: text
0112 text: chosenRoomDelegate.topic ? chosenRoomDelegate.topic.replace(/(\r\n\t|\n|\r\t)/gm, " ") : ""
0113 textFormat: Text.PlainText
0114 elide: Text.ElideRight
0115 wrapMode: Text.NoWrap
0116 }
0117 RowLayout {
0118 Layout.fillWidth: true
0119 Kirigami.Icon {
0120 source: "user"
0121 color: Kirigami.Theme.disabledTextColor
0122 implicitHeight: Kirigami.Units.iconSizes.small
0123 implicitWidth: Kirigami.Units.iconSizes.small
0124 }
0125 QQC2.Label {
0126 text: chosenRoomDelegate.memberCount + " " + (chosenRoomDelegate.alias ?? chosenRoomDelegate.roomId)
0127 color: Kirigami.Theme.disabledTextColor
0128 elide: Text.ElideRight
0129 Layout.fillWidth: true
0130 }
0131 }
0132 }
0133 }
0134
0135 onClicked: {
0136 let dialog = pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/ExploreRoomsPage.qml", {
0137 connection: root.room.connection,
0138 showOnlySpaces: true
0139 }, {
0140 title: i18nc("@title", "Explore Rooms")
0141 });
0142 dialog.roomSelected.connect((roomId, displayName, avatarUrl, alias, topic, memberCount, isJoined) => {
0143 chosenRoomDelegate.roomId = roomId;
0144 chosenRoomDelegate.displayName = displayName;
0145 chosenRoomDelegate.avatarUrl = avatarUrl;
0146 chosenRoomDelegate.alias = alias;
0147 chosenRoomDelegate.topic = topic;
0148 chosenRoomDelegate.memberCount = memberCount;
0149 chosenRoomDelegate.isJoined = isJoined;
0150 chosenRoomDelegate.visible = true;
0151 });
0152 }
0153 }
0154 FormCard.FormCheckDelegate {
0155 id: existingOfficialCheck
0156 property NeoChatRoom space: root.room.connection.room(chosenRoomDelegate.roomId)
0157 text: i18n("Set this room as a child of the space %1", space?.displayName ?? "")
0158 checked: enabled
0159
0160 enabled: chosenRoomDelegate.visible && space && space.canSendState("m.space.child")
0161 }
0162 FormCard.FormTextDelegate {
0163 visible: chosenRoomDelegate.visible && !root.room.canModifyParent(chosenRoomDelegate.roomId)
0164 text: existingOfficialCheck.space ? (existingOfficialCheck.space.isSpace ? i18n("You do not have a high enough privilege level in the parent to set this state") : i18n("The selected room is not a space")) : i18n("You do not have the privileges to complete this action")
0165 textItem.color: Kirigami.Theme.negativeTextColor
0166 }
0167 FormCard.FormCheckDelegate {
0168 id: makeCanonicalCheck
0169 text: i18n("Make this space the canonical parent")
0170 checked: enabled
0171
0172 enabled: chosenRoomDelegate.visible
0173 }
0174 }
0175 }