diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml
index 1e61b68b..fe61b8d5 100644
--- a/resources/qml/RoomList.qml
+++ b/resources/qml/RoomList.qml
@@ -110,6 +110,17 @@ Page {
}
+
+ Component {
+ id: nestedSpaceMenuLevel
+
+ SpaceMenuLevel {
+ roomid: roomContextMenu.roomid
+ childMenu: rootSpaceMenu.childMenu
+ }
+ }
+
+
Platform.Menu {
id: roomContextMenu
@@ -154,42 +165,51 @@ Page {
onTriggered: Rooms.copyLink(roomContextMenu.roomid)
}
- Platform.MenuSeparator {
- text: qsTr("Tag room as:")
- }
+ Platform.Menu {
+ id: tagsMenu
+ title: qsTr("Tag room as:")
- Instantiator {
- model: Communities.tagsWithDefault
- onObjectAdded: roomContextMenu.insertItem(index + 4, object)
- onObjectRemoved: roomContextMenu.removeItem(object)
+ Instantiator {
+ model: Communities.tagsWithDefault
+ onObjectAdded: tagsMenu.insertItem(index, object)
+ onObjectRemoved: tagsMenu.removeItem(object)
- delegate: Platform.MenuItem {
- property string t: modelData
+ delegate: Platform.MenuItem {
+ property string t: modelData
- text: {
- switch (t) {
- case "m.favourite":
- return qsTr("Favourite");
- case "m.lowpriority":
- return qsTr("Low priority");
- case "m.server_notice":
- return qsTr("Server notice");
- default:
- return t.substring(2);
+ text: {
+ switch (t) {
+ case "m.favourite":
+ return qsTr("Favourite");
+ case "m.lowpriority":
+ return qsTr("Low priority");
+ case "m.server_notice":
+ return qsTr("Server notice");
+ default:
+ return t.substring(2);
+ }
}
+ checkable: true
+ checked: roomContextMenu.tags !== undefined && roomContextMenu.tags.includes(t)
+ onTriggered: Rooms.toggleTag(roomContextMenu.roomid, t, checked)
}
- checkable: true
- checked: roomContextMenu.tags !== undefined && roomContextMenu.tags.includes(t)
- onTriggered: Rooms.toggleTag(roomContextMenu.roomid, t, checked)
+
}
+ Platform.MenuItem {
+ text: qsTr("Create new tag...")
+ onTriggered: newTag.show()
+ }
}
- Platform.MenuItem {
- text: qsTr("Create new tag...")
- onTriggered: newTag.show()
- }
+ SpaceMenuLevel {
+ id: rootSpaceMenu
+ roomid: roomContextMenu.roomid
+ position: -1
+ title: qsTr("Add or remove from space")
+ childMenu: nestedSpaceMenuLevel
+ }
}
delegate: ItemDelegate {
diff --git a/resources/qml/components/SpaceMenuLevel.qml b/resources/qml/components/SpaceMenuLevel.qml
new file mode 100644
index 00000000..419b0f6e
--- /dev/null
+++ b/resources/qml/components/SpaceMenuLevel.qml
@@ -0,0 +1,84 @@
+// SPDX-FileCopyrightText: 2022 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import QtQuick 2.15
+import Qt.labs.platform 1.1 as Platform
+import im.nheko 1.0
+
+Platform.Menu {
+ id: spacesMenu
+
+ property string roomid
+ property Component childMenu
+
+ property int position: modelData == undefined ? -2 : modelData.treeIndex
+ title: modelData != undefined ? modelData.name : qsTr("Add or remove from space")
+ property bool loadChildren: false
+
+ onAboutToShow: loadChildren = true
+ //onAboutToHide: loadChildren = false
+
+ Platform.MenuItemGroup {
+ id: modificationGroup
+ visible: position != -1
+ }
+
+ Platform.MenuItem {
+ text: qsTr("Official community for this room")
+ group: modificationGroup
+ checkable: true
+ checked: spacesMenu.position >= 0 && (modelData.childValid && modelData.parentValid && modelData.canonical)
+ enabled: spacesMenu.position >= 0 && (modelData.canEditChild && modelData.canEditParent)
+ onTriggered: if (checked) Communities.updateSpaceStatus(modelData.roomid, spacesMenu.roomid, true, true, true)
+ }
+ Platform.MenuItem {
+ text: qsTr("Affiliated community for this room")
+ group: modificationGroup
+ checkable: true
+ checked: spacesMenu.position >= 0 && (modelData.childValid && modelData.parentValid && !modelData.canonical)
+ enabled: spacesMenu.position >= 0 && (modelData.canEditChild && modelData.canEditParent)
+ onTriggered: if (checked) Communities.updateSpaceStatus(modelData.roomid, spacesMenu.roomid, true, true, false)
+ }
+ Platform.MenuItem {
+ text: qsTr("Listed only for community members")
+ group: modificationGroup
+ checkable: true
+ checked: spacesMenu.position >= 0 && (modelData.childValid && !modelData.parentValid)
+ enabled: spacesMenu.position >= 0 && ((modelData.canEditChild || modelData.childValid) && (!modelData.parentValid || modelData.canEditParent))
+ onTriggered: if (checked) Communities.updateSpaceStatus(modelData.roomid, spacesMenu.roomid, false, true, false)
+ }
+ Platform.MenuItem {
+ text: qsTr("Listed only for room members")
+ group: modificationGroup
+ checkable: true
+ checked: spacesMenu.position >= 0 && (!modelData.childValid && modelData.parentValid)
+ enabled: spacesMenu.position >= 0 && ((modelData.canEditChild) && (modelData.parentValid || modelData.canEditParent))
+ onTriggered: if (checked) Communities.updateSpaceStatus(modelData.roomid, spacesMenu.roomid, true, false, false)
+ }
+ Platform.MenuItem {
+ text: qsTr("Not related")
+ group: modificationGroup
+ checkable: true
+ checked: spacesMenu.position >= 0 && (!modelData.childValid && !modelData.parentValid)
+ enabled: spacesMenu.position >= 0 && ((modelData.canEditChild || !modelData.childValid) && (!modelData.parentValid || modelData.canEditParent))
+ onTriggered: if (checked) Communities.updateSpaceStatus(modelData.roomid, spacesMenu.roomid, false, false, false)
+ }
+
+ Platform.MenuSeparator {
+ text: qsTr("Subcommunities")
+ group: modificationGroup
+ visible: modificationGroup.visible && inst.model != undefined
+ }
+
+ Instantiator {
+ id: inst
+ model: spacesMenu.loadChildren ? Communities.spaceChildrenListFromIndex(spacesMenu.roomid, spacesMenu.position) : undefined
+ onObjectAdded: (idx, o) => {
+ spacesMenu.insertMenu(idx + (spacesMenu.position != -1 ? 6 : 0), o)
+ }
+ //onObjectRemoved: spacesMenu.removeMenu(object)
+
+ delegate: childMenu
+ }
+}
diff --git a/resources/res.qrc b/resources/res.qrc
index 4bdb3cb8..c14ebd5f 100644
--- a/resources/res.qrc
+++ b/resources/res.qrc
@@ -120,16 +120,14 @@
<file>qml/SelfVerificationCheck.qml</file>
<file>qml/TypingIndicator.qml</file>
<file>qml/NotificationWarning.qml</file>
- <file>qml/pages/UserSettingsPage.qml</file>
- <file>qml/pages/WelcomePage.qml</file>
- <file>qml/pages/LoginPage.qml</file>
- <file>qml/pages/RegisterPage.qml</file>
<file>qml/components/AdaptiveLayout.qml</file>
<file>qml/components/AdaptiveLayoutElement.qml</file>
<file>qml/components/AvatarListTile.qml</file>
<file>qml/components/FlatButton.qml</file>
<file>qml/components/MainWindowDialog.qml</file>
+ <file>qml/components/NotificationBubble.qml</file>
<file>qml/components/ReorderableListview.qml</file>
+ <file>qml/components/SpaceMenuLevel.qml</file>
<file>qml/components/TextButton.qml</file>
<file>qml/delegates/Encrypted.qml</file>
<file>qml/delegates/FileMessage.qml</file>
@@ -172,10 +170,14 @@
<file>qml/dialogs/UserProfile.qml</file>
<file>qml/emoji/EmojiPicker.qml</file>
<file>qml/emoji/StickerPicker.qml</file>
+ <file>qml/pages/LoginPage.qml</file>
+ <file>qml/pages/RegisterPage.qml</file>
+ <file>qml/pages/UserSettingsPage.qml</file>
+ <file>qml/pages/WelcomePage.qml</file>
<file>qml/ui/NhekoSlider.qml</file>
<file>qml/ui/Ripple.qml</file>
- <file>qml/ui/Spinner.qml</file>
<file>qml/ui/Snackbar.qml</file>
+ <file>qml/ui/Spinner.qml</file>
<file>qml/ui/animations/BlinkAnimation.qml</file>
<file>qml/ui/media/MediaControls.qml</file>
<file>qml/voip/ActiveCallBar.qml</file>
@@ -186,7 +188,6 @@
<file>qml/voip/PlaceCall.qml</file>
<file>qml/voip/ScreenShare.qml</file>
<file>qml/voip/VideoCall.qml</file>
- <file>qml/components/NotificationBubble.qml</file>
</qresource>
<qresource prefix="/media">
<file>media/ring.ogg</file>
|