Room Settings Parents

Add the ability to manage parent rooms from a child, this includes:
- viewing parents
- adding a new parent
- removing an existing one

Follows the rules from the matrix spec https://spec.matrix.org/v1.7/client-server-api/#mspaceparent-relationships
This commit is contained in:
James Graham
2023-10-02 18:41:17 +00:00
parent 17bc08270d
commit 7180fa022b
3 changed files with 310 additions and 0 deletions

View File

@@ -278,6 +278,181 @@ FormCard.FormCardPage {
}
}
}
FormCard.FormHeader {
title: i18n("Official Parent Spaces")
}
FormCard.FormCard {
Repeater {
id: officalParentRepeater
model: root.room.parentIds
delegate: FormCard.FormTextDelegate {
id: officalParentDelegate
required property string modelData
property NeoChatRoom space: root.connection.room(modelData)
text: {
if (space) {
return space.displayName;
} else {
return modelData;
}
}
description: {
if (space) {
if (space.canonicalAlias.length > 0) {
return space.canonicalAlias;
} else {
return modelData;
}
} else {
return "";
}
}
contentItem.children: QQC2.ToolButton {
visible: officalParentDelegate?.space.canSendState("m.space.child") && root.room.canSendState("m.space.parent")
display: QQC2.AbstractButton.IconOnly
action: Kirigami.Action {
id: removeParentAction
text: i18n("Remove parent")
icon.name: "edit-delete-remove"
onTriggered: root.room.removeParent(officalParentDelegate.modelData)
}
QQC2.ToolTip {
text: removeParentAction.text
delay: Kirigami.Units.toolTipDelay
}
}
}
}
FormCard.FormTextDelegate {
visible: officalParentRepeater.count <= 0
text: i18n("This room has no official parent spaces.")
}
}
FormCard.FormHeader {
visible: root.room.canSendState("m.space.parent")
title: i18n("Add Offical Parent Space")
}
FormCard.FormCard {
visible: root.room.canSendState("m.space.parent")
FormCard.FormButtonDelegate {
visible: !chosenRoomDelegate.visible
text: i18nc("@action:button", "Pick room")
onClicked: {
let dialog = pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/JoinRoomPage.qml", {connection: root.connection}, {title: i18nc("@title", "Explore Rooms")})
dialog.roomSelected.connect((roomId, displayName, avatarUrl, alias, topic, memberCount, isJoined) => {
chosenRoomDelegate.roomId = roomId;
chosenRoomDelegate.displayName = displayName;
chosenRoomDelegate.avatarUrl = avatarUrl;
chosenRoomDelegate.alias = alias;
chosenRoomDelegate.topic = topic;
chosenRoomDelegate.memberCount = memberCount;
chosenRoomDelegate.isJoined = isJoined;
chosenRoomDelegate.visible = true;
})
}
}
FormCard.AbstractFormDelegate {
id: chosenRoomDelegate
property string roomId
property string displayName
property url avatarUrl
property string alias
property string topic
property int memberCount
property bool isJoined
visible: false
contentItem: RowLayout {
KirigamiComponents.Avatar {
Layout.preferredWidth: Kirigami.Units.gridUnit * 2
Layout.preferredHeight: Kirigami.Units.gridUnit * 2
source: chosenRoomDelegate.avatarUrl
name: chosenRoomDelegate.displayName
}
ColumnLayout {
Layout.fillWidth: true
RowLayout {
Layout.fillWidth: true
Kirigami.Heading {
Layout.fillWidth: true
level: 4
text: chosenRoomDelegate.displayName
font.bold: true
textFormat: Text.PlainText
elide: Text.ElideRight
wrapMode: Text.NoWrap
}
QQC2.Label {
visible: chosenRoomDelegate.isJoined
text: i18n("Joined")
color: Kirigami.Theme.linkColor
}
}
QQC2.Label {
Layout.fillWidth: true
visible: text
text: chosenRoomDelegate.topic ? chosenRoomDelegate.topic.replace(/(\r\n\t|\n|\r\t)/gm," ") : ""
textFormat: Text.PlainText
elide: Text.ElideRight
wrapMode: Text.NoWrap
}
RowLayout {
Layout.fillWidth: true
Kirigami.Icon {
source: "user"
color: Kirigami.Theme.disabledTextColor
implicitHeight: Kirigami.Units.iconSizes.small
implicitWidth: Kirigami.Units.iconSizes.small
}
QQC2.Label {
text: chosenRoomDelegate.memberCount + " " + (chosenRoomDelegate.alias ?? chosenRoomDelegate.roomId)
color: Kirigami.Theme.disabledTextColor
elide: Text.ElideRight
Layout.fillWidth: true
}
}
}
}
onClicked: {
let dialog = pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/JoinRoomPage.qml", {connection: root.connection}, {title: i18nc("@title", "Explore Rooms")})
dialog.roomSelected.connect((roomId, displayName, avatarUrl, alias, topic, memberCount, isJoined) => {
chosenRoomDelegate.roomId = roomId;
chosenRoomDelegate.displayName = displayName;
chosenRoomDelegate.avatarUrl = avatarUrl;
chosenRoomDelegate.alias = alias;
chosenRoomDelegate.topic = topic;
chosenRoomDelegate.memberCount = memberCount;
chosenRoomDelegate.isJoined = isJoined;
chosenRoomDelegate.visible = true;
})
}
}
FormCard.FormCheckDelegate {
id: existingOfficialCheck
property NeoChatRoom space: root.connection.room(chosenRoomDelegate.roomId)
text: i18n("Set this room as a child of the space %1", space?.displayName ?? "")
checked: enabled
enabled: chosenRoomDelegate.visible && space && space.canSendState("m.space.child")
}
FormCard.FormTextDelegate {
visible: chosenRoomDelegate.visible && !root.room.canModifyParent(chosenRoomDelegate.roomId)
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")
textItem.color: Kirigami.Theme.negativeTextColor
}
FormCard.FormButtonDelegate {
text: i18nc("@action:button", "Ok")
enabled: chosenRoomDelegate.visible && root.room.canModifyParent(chosenRoomDelegate.roomId)
onClicked: {
root.room.addParent(chosenRoomDelegate.roomId)
}
}
}
Kirigami.InlineMessage {
Layout.maximumWidth: Kirigami.Units.gridUnit * 30