From 659f10c71a2584de5168e81cafb9d2cc91a96d4e Mon Sep 17 00:00:00 2001 From: Tobias Fella Date: Mon, 24 Oct 2022 14:11:47 +0200 Subject: [PATCH] Improve Space list - Give it a context menu - Clean up code BUG: 460167 --- src/qml/Menu/SpaceListContextMenu.qml | 119 ++++++++++++++++++++++++++ src/qml/Page/RoomListPage.qml | 59 ++++++++----- src/res.qrc | 1 + 3 files changed, 158 insertions(+), 21 deletions(-) create mode 100644 src/qml/Menu/SpaceListContextMenu.qml diff --git a/src/qml/Menu/SpaceListContextMenu.qml b/src/qml/Menu/SpaceListContextMenu.qml new file mode 100644 index 000000000..250b4ae8d --- /dev/null +++ b/src/qml/Menu/SpaceListContextMenu.qml @@ -0,0 +1,119 @@ +// SPDX-FileCopyrightText: 2020 Carl Schwan +// SPDX-FileCopyrightText: 2022 Tobias Fella +// SPDX-License-Identifier: GPL-3.0-only + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 + +import org.kde.kirigami 2.19 as Kirigami + +import org.kde.neochat 1.0 + +/** + * Context menu when clicking on a room in the room list + */ +Loader { + id: root + property var room + signal closed() + + Component { + id: regularMenu + Menu { + MenuItem { + text: i18nc("@action:inmenu", "Copy Address to Clipboard") + onTriggered: if (room.canonicalAlias.length === 0) { + Clipboard.saveText(room.id) + } else { + Clipboard.saveText(room.canonicalAlias) + } + } + + MenuItem { + text: i18nc("'Space' is a matrix space", "Space Settings") + onTriggered: ApplicationWindow.window.pageStack.pushDialogLayer('qrc:/Categories.qml', {room: room}) + } + + MenuSeparator {} + + MenuItem { + text: i18nc("'Space' is a matrix space", "Leave Space") + onTriggered: RoomManager.leaveRoom(room) + } + + onClosed: { + root.closed() + destroy() + } + } + } + + Component { + id: mobileMenu + + Kirigami.OverlayDrawer { + id: drawer + height: popupContent.implicitHeight + edge: Qt.BottomEdge + padding: 0 + leftPadding: 0 + rightPadding: 0 + bottomPadding: 0 + topPadding: 0 + + parent: applicationWindow().overlay + + ColumnLayout { + id: popupContent + width: parent.width + spacing: 0 + RowLayout { + id: headerLayout + Layout.fillWidth: true + Layout.margins: Kirigami.Units.largeSpacing + spacing: Kirigami.Units.largeSpacing + Kirigami.Avatar { + id: avatar + source: room.avatarMediaId ? ("image://mxc/" + room.avatarMediaId) : "" + Layout.preferredWidth: Kirigami.Units.gridUnit * 3 + Layout.preferredHeight: Kirigami.Units.gridUnit * 3 + Layout.alignment: Qt.AlignTop + } + Kirigami.Heading { + level: 5 + Layout.fillWidth: true + text: room.displayName + wrapMode: Text.WordWrap + } + + ToolButton { + icon.name: 'settings-configure' + onClicked: ApplicationWindow.window.pageStack.pushDialogLayer('qrc:/Categories.qml', {room: room}) + } + } + Kirigami.BasicListItem { + text: i18nc("'Space' is a matrix space", "Leave Space") + onClicked: RoomManager.leaveRoom(room) + implicitHeight: visible ? Kirigami.Units.gridUnit * 3 : 0 + } + } + onClosed: root.closed() + } + } + + asynchronous: true + sourceComponent: Kirigami.Settings.isMobile ? mobileMenu : regularMenu + + function open() { + active = true; + } + + onStatusChanged: if (status == Loader.Ready) { + if (Kirigami.Settings.isMobile) { + item.open(); + } else { + item.popup(); + } + } +} diff --git a/src/qml/Page/RoomListPage.qml b/src/qml/Page/RoomListPage.qml index 445f76830..b86fee1e9 100644 --- a/src/qml/Page/RoomListPage.qml +++ b/src/qml/Page/RoomListPage.qml @@ -13,20 +13,19 @@ import org.kde.kitemmodels 1.0 import org.kde.neochat 1.0 Kirigami.ScrollablePage { + id: page header: ColumnLayout { visible: !page.collapsedMode - Layout.fillWidth: true - Layout.fillHeight: true spacing: 0 ListView { id: spaceList - property string activeSpaceId: '' + property string activeSpaceId: "" orientation: Qt.Horizontal - spacing: Kirigami.Units.largeSpacing - clip:true + spacing: Kirigami.Units.smallSpacing + clip: true visible: spaceList.count > 0 Layout.preferredHeight: Kirigami.Units.gridUnit * 3 @@ -61,37 +60,55 @@ Kirigami.ScrollablePage { } } - delegate: QQC2.Control { + delegate: QQC2.ItemDelegate { required property string avatar required property var currentRoom required property int index required property string id - implicitWidth: ListView.view.headerItem.implicitWidth - implicitHeight: ListView.view.headerItem.implicitHeight + + height: parent.height + width: height + leftPadding: topPadding + rightPadding: topPadding contentItem: Kirigami.Avatar { - actions.main: Kirigami.Action { - onTriggered: { - spaceList.activeSpaceId = id; - sortFilterRoomListModel.activeSpaceId = id; - } - } - name: currentRoom.displayName - - QQC2.ToolTip { - text: currentRoom.displayName - } - source: avatar !== "" ? "image://mxc/" + avatar : "" } + + onClicked: { + spaceList.activeSpaceId = id; + sortFilterRoomListModel.activeSpaceId = id; + } + + QQC2.ToolTip { + text: currentRoom.displayName + } + + onPressAndHold: { + spaceList.createContextMenu(currentRoom) + } + TapHandler { + acceptedButtons: Qt.RightButton + acceptedDevices: PointerDevice.Mouse + onTapped: spaceList.createContextMenu(currentRoom) + } + } + function createContextMenu(room) { + const menu = spaceListContextMenu.createObject(page, {room: room}) + menu.open() } } + Kirigami.Separator { Layout.fillWidth: true } + + Component { + id: spaceListContextMenu + SpaceListContextMenu {} + } } - id: page title: i18n("Rooms") diff --git a/src/res.qrc b/src/res.qrc index 034e649b6..f57e4a56a 100644 --- a/src/res.qrc +++ b/src/res.qrc @@ -69,6 +69,7 @@ qml/Menu/Timeline/MessageSourceSheet.qml qml/Menu/Timeline/ReportSheet.qml qml/Menu/RoomListContextMenu.qml + qml/Menu/SpaceListContextMenu.qml qml/Component/glowdot.png qml/Component/confetti.png qml/Settings/SettingsPage.qml