diff --git a/src/qml/Component/AvatarTabButton.qml b/src/qml/Component/AvatarTabButton.qml index f0686693b..f2f131f7f 100644 --- a/src/qml/Component/AvatarTabButton.qml +++ b/src/qml/Component/AvatarTabButton.qml @@ -16,6 +16,7 @@ Delegates.RoundedItemDelegate { required property url source signal contextMenuRequested() + signal selected() padding: Kirigami.Units.largeSpacing @@ -23,14 +24,21 @@ Delegates.RoundedItemDelegate { QQC2.ToolTip.text: text QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay + Accessible.onPressAction: selected(); + Keys.onSpacePressed: selected(); + Keys.onEnterPressed: selected(); + onPressAndHold: root.contextMenuRequested() TapHandler { - acceptedButtons: Qt.RightButton - acceptedDevices: PointerDevice.Mouse - grabPermissions: PointerHandler.TakeOverForbidden - gesturePolicy: TapHandler.WithinBounds - onTapped: root.contextMenuRequested() + acceptedButtons: Qt.RightButton | Qt.LeftButton + onTapped: (eventPoint, button) => { + if (button === Qt.RightButton) { + root.contextMenuRequested(); + } else { + root.selected(); + } + } } contentItem: KirigamiComponents.Avatar { diff --git a/src/qml/Dialog/KeyVerification/KeyVerificationDialog.qml b/src/qml/Dialog/KeyVerification/KeyVerificationDialog.qml index 31325f499..0ff4b89a9 100644 --- a/src/qml/Dialog/KeyVerification/KeyVerificationDialog.qml +++ b/src/qml/Dialog/KeyVerification/KeyVerificationDialog.qml @@ -7,6 +7,7 @@ import QtQuick.Layouts import QtQml import org.kde.kirigami as Kirigami +import org.kde.kirigamiaddons.delegates as Delegates import org.kde.neochat Kirigami.Page { @@ -48,14 +49,16 @@ Kirigami.Page { icon: "security-medium-symbolic" text: i18n("Waiting for other party to verify.") } - Kirigami.BasicListItem { + Delegates.RoundedItemDelegate { id: emojiVerification - text: "Emoji Verification" + text: i18n("Emoji Verification") visible: root.session.state === KeyVerificationSession.READY - subtitle: i18n("Compare a set of emoji on both devices") - onClicked: { - root.session.sendStartSas() + contentItem: Delegates.SubtitleContentItem { + subtitle: i18n("Compare a set of emoji on both devices") + itemDelegate: emojiVerification } + onClicked: root.session.sendStartSas() + anchors.centerIn: parent } Message { visible: root.session.state === KeyVerificationSession.DONE diff --git a/src/qml/Dialog/UserDetailDialog.qml b/src/qml/Dialog/UserDetailDialog.qml index 5e6ab413f..6f6fe143e 100644 --- a/src/qml/Dialog/UserDetailDialog.qml +++ b/src/qml/Dialog/UserDetailDialog.qml @@ -6,7 +6,8 @@ import QtQuick import QtQuick.Layouts import org.kde.kirigami as Kirigami -import org.kde.kirigamiaddons.labs.components as KirigamiComponents +import org.kde.kirigamiaddons.components as KirigamiComponents +import org.kde.kirigamiaddons.formcard as FormCard import org.kde.neochat @@ -20,8 +21,8 @@ Kirigami.Dialog { parent: applicationWindow().overlay - leftPadding: Kirigami.Units.smallSpacing - rightPadding: Kirigami.Units.smallSpacing + leftPadding: 0 + rightPadding: 0 topPadding: 0 bottomPadding: 0 @@ -74,7 +75,7 @@ Kirigami.Dialog { Layout.fillWidth: true } - Kirigami.BasicListItem { + FormCard.FormButtonDelegate { visible: !root.user.isLocalUser action: Kirigami.Action { text: room.connection.isIgnored(root.user.object) ? i18n("Unignore this user") : i18n("Ignore this user") @@ -85,7 +86,8 @@ Kirigami.Dialog { } } } - Kirigami.BasicListItem { + + FormCard.FormButtonDelegate { visible: !root.user.isLocalUser && room.canSendState("kick") && room.containsUser(root.user.id) action: Kirigami.Action { @@ -97,7 +99,8 @@ Kirigami.Dialog { } } } - Kirigami.BasicListItem { + + FormCard.FormButtonDelegate { visible: !root.user.isLocalUser && room.canSendState("invite") && !room.containsUser(root.user.id) action: Kirigami.Action { @@ -110,7 +113,8 @@ Kirigami.Dialog { } } } - Kirigami.BasicListItem { + + FormCard.FormButtonDelegate { visible: !root.user.isLocalUser && room.canSendState("ban") && !room.isUserBanned(root.user.id) action: Kirigami.Action { @@ -126,7 +130,8 @@ Kirigami.Dialog { } } } - Kirigami.BasicListItem { + + FormCard.FormButtonDelegate { visible: !root.user.isLocalUser && room.canSendState("ban") && room.isUserBanned(root.user.id) action: Kirigami.Action { @@ -139,7 +144,8 @@ Kirigami.Dialog { } } } - Kirigami.BasicListItem { + + FormCard.FormButtonDelegate { visible: room.canSendState("m.room.power_levels") action: Kirigami.Action { text: i18n("Set user power level") @@ -162,7 +168,8 @@ Kirigami.Dialog { } } } - Kirigami.BasicListItem { + + FormCard.FormButtonDelegate { visible: root.user.isLocalUser || room.canSendState("redact") action: Kirigami.Action { @@ -178,7 +185,8 @@ Kirigami.Dialog { } } } - Kirigami.BasicListItem { + + FormCard.FormButtonDelegate { visible: !root.user.isLocalUser action: Kirigami.Action { text: i18n("Open a private chat") @@ -189,7 +197,8 @@ Kirigami.Dialog { } } } - Kirigami.BasicListItem { + + FormCard.FormButtonDelegate { action: Kirigami.Action { text: i18n("Copy link") icon.name: "username-copy" diff --git a/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml b/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml index c2c076e36..c59f05a1d 100644 --- a/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml +++ b/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml @@ -6,7 +6,8 @@ import QtQuick import QtQuick.Controls as QQC2 import QtQuick.Layouts import org.kde.kirigami as Kirigami -import org.kde.kirigamiaddons.labs.components as KirigamiComponents +import org.kde.kirigamiaddons.components as KirigamiComponents +import org.kde.kirigamiaddons.formcard as FormCard import org.kde.neochat @@ -270,9 +271,9 @@ Loader { id: listViewAction model: actionLayout.actions - Kirigami.BasicListItem { - icon: modelData.icon.name - iconColor: modelData.icon.color ?? undefined + FormCard.FormButtonDelegate { + icon.name: modelData.icon.name + icon.color: modelData.icon.color ?? undefined enabled: modelData.enabled visible: modelData.visible text: modelData.text @@ -280,7 +281,6 @@ Loader { modelData.triggered() root.item.close(); } - implicitHeight: visible ? Kirigami.Units.gridUnit * 3 : 0 } } } @@ -353,9 +353,9 @@ Loader { id: listViewAction model: root.actions - Kirigami.BasicListItem { - icon: modelData.icon.name - iconColor: modelData.icon.color ?? undefined + FormCard.FormButtonDelegate { + icon.name: modelData.icon.name + icon.color: modelData.icon.color ?? undefined enabled: modelData.enabled visible: modelData.visible text: modelData.text @@ -363,17 +363,15 @@ Loader { modelData.triggered() root.item.close(); } - implicitHeight: visible ? Kirigami.Units.gridUnit * 3 : 0 } } Repeater { model: root.nestedActions - Kirigami.BasicListItem { + FormCard.FormButtonDelegate { action: modelData visible: modelData.visible - implicitHeight: visible ? Kirigami.Units.gridUnit * 3 : 0 onClicked: { stackView.push(nestedActionsComponent, { title: modelData.text, diff --git a/src/qml/Page/ExplorerDelegate.qml b/src/qml/Page/ExplorerDelegate.qml index b3cf96dd7..d27a02394 100644 --- a/src/qml/Page/ExplorerDelegate.qml +++ b/src/qml/Page/ExplorerDelegate.qml @@ -52,13 +52,17 @@ Delegates.RoundedItemDelegate { } contentItem: RowLayout { + spacing: Kirigami.Units.smallSpacing + Components.Avatar { Layout.preferredWidth: Kirigami.Units.gridUnit * 2 Layout.preferredHeight: Kirigami.Units.gridUnit * 2 + Layout.alignment: Qt.AlignTop source: root.avatarUrl name: root.displayName } + ColumnLayout { Layout.fillWidth: true RowLayout { diff --git a/src/qml/Page/JoinRoomPage.qml b/src/qml/Page/JoinRoomPage.qml index 5415d5527..205b21b3e 100644 --- a/src/qml/Page/JoinRoomPage.qml +++ b/src/qml/Page/JoinRoomPage.qml @@ -8,7 +8,7 @@ import QtQuick.Layouts import Qt.labs.qmlmodels import org.kde.kirigami as Kirigami -import org.kde.kirigamiaddons.labs.components as KirigamiComponents +import org.kde.kirigamiaddons.delegates as Delegates import org.kde.neochat @@ -92,34 +92,53 @@ Kirigami.ScrollablePage { id: serverListModel } - delegate: Kirigami.BasicListItem { + delegate: Delegates.RoundedItemDelegate { id: serverItem - label: isAddServerDelegate ? i18n("Add New Server") : url - subtitle: isHomeServer ? i18n("Home Server") : "" + required property int index + required property string url + required property bool isAddServerDelegate + required property bool isHomeServer + required property bool isDeletable + + text: isAddServerDelegate ? i18n("Add New Server") : url + highlighted: false + + topInset: index === 0 ? Kirigami.Units.smallSpacing : Math.round(Kirigami.Units.smallSpacing / 2) + bottomInset: index === ListView.view.count - 1 ? Kirigami.Units.smallSpacing : Math.round(Kirigami.Units.smallSpacing / 2) onClicked: if (isAddServerDelegate) { addServerSheet.open() } - trailing: QQC2.ToolButton { - visible: isAddServerDelegate || isDeletable - icon.name: isAddServerDelegate ? "list-add" : "dialog-close" - text: i18n("Add new server") - Accessible.name: text - display: QQC2.AbstractButton.IconOnly + contentItem: RowLayout { + spacing: Kirigami.Units.smallSpacing - onClicked: { - if (serverField.currentIndex === index && isDeletable) { - serverField.currentIndex = 0 - server = serverField.currentValue - serverField.popup.close() - } - if (isAddServerDelegate) { - addServerSheet.open() - serverItem.clicked() - } else { - serverListModel.removeServerAtIndex(index) + Delegates.SubtitleContentItem { + itemDelegate: serverItem + subtitle: serverItem.isHomeServer ? i18n("Home Server") : "" + Layout.fillWidth: true + } + + QQC2.ToolButton { + visible: serverItem.isAddServerDelegate || serverItem.isDeletable + icon.name: serverItem.isAddServerDelegate ? "list-add" : "dialog-close" + text: i18nc("@action:button", "Add new server") + Accessible.name: text + display: QQC2.AbstractButton.IconOnly + + onClicked: { + if (serverField.currentIndex === serverItem.index && serverItem.isDeletable) { + serverField.currentIndex = 0; + server = serverField.currentValue; + serverField.popup.close(); + } + if (serverItem.isAddServerDelegate) { + addServerSheet.open(); + serverItem.clicked(); + } else { + serverListModel.removeServerAtIndex(serverItem.index); + } } } } @@ -210,8 +229,10 @@ Kirigami.ScrollablePage { ListView { id: publicRoomsListView - topMargin: Kirigami.Units.smallSpacing - clip: true + + topMargin: Math.round(Kirigami.Units.smallSpacing / 2) + bottomMargin: Math.round(Kirigami.Units.smallSpacing / 2) + model: PublicRoomListModel { id: publicRoomListModel diff --git a/src/qml/Page/RoomList/SpaceDrawer.qml b/src/qml/Page/RoomList/SpaceDrawer.qml index a73881cf3..7b784f6ab 100644 --- a/src/qml/Page/RoomList/SpaceDrawer.qml +++ b/src/qml/Page/RoomList/SpaceDrawer.qml @@ -100,7 +100,7 @@ QQC2.Control { text: displayName source: avatar ? ("image://mxc/" + avatar) : "" - onClicked: root.selectedSpaceId = roomId + onSelected: root.selectedSpaceId = roomId checked: root.selectedSpaceId === roomId onContextMenuRequested: root.createContextMenu(currentRoom) } diff --git a/src/qml/Page/RoomList/SpaceListContextMenu.qml b/src/qml/Page/RoomList/SpaceListContextMenu.qml index f462d3d9f..56b7b99e3 100644 --- a/src/qml/Page/RoomList/SpaceListContextMenu.qml +++ b/src/qml/Page/RoomList/SpaceListContextMenu.qml @@ -7,7 +7,8 @@ import QtQuick.Controls as QQC2 import QtQuick.Layouts import org.kde.kirigami as Kirigami -import org.kde.kirigamiaddons.labs.components as KirigamiComponents +import org.kde.kirigamiaddons.components as KirigamiComponents +import org.kde.kirigamiaddons.formcard as FormCard import org.kde.neochat @@ -79,13 +80,16 @@ Loader { ColumnLayout { id: popupContent + width: parent.width spacing: 0 + RowLayout { id: headerLayout Layout.fillWidth: true Layout.margins: Kirigami.Units.largeSpacing spacing: Kirigami.Units.largeSpacing + KirigamiComponents.Avatar { id: avatar source: room.avatarMediaId ? ("image://mxc/" + room.avatarMediaId) : "" @@ -93,22 +97,40 @@ Loader { Layout.preferredHeight: Kirigami.Units.gridUnit * 3 Layout.alignment: Qt.AlignTop } + Kirigami.Heading { level: 5 Layout.fillWidth: true text: room.displayName wrapMode: Text.WordWrap } + } - QQC2.ToolButton { - icon.name: 'settings-configure' - onClicked: QQC2.ApplicationWindow.window.pageStack.pushDialogLayer('qrc:/Categories.qml', {room: room, connection: root.connection}, { title: i18n("Space Settings") }) + FormCard.FormButtonDelegate { + text: i18nc("'Space' is a matrix space", "View Space") + icon.name: "view-list-details" + onClicked: RoomManager.enterRoom(room); + } + + FormCard.FormButtonDelegate { + text: i18nc("@action:inmenu", "Copy Address to Clipboard") + icon.name: "edit-copy" + onClicked: if (room.canonicalAlias.length === 0) { + Clipboard.saveText(room.id); + } else { + Clipboard.saveText(room.canonicalAlias); } } - Kirigami.BasicListItem { + + FormCard.FormButtonDelegate { + text: i18nc("'Space' is a matrix space", "Space Settings") + icon.name: 'settings-configure' + onClicked: QQC2.ApplicationWindow.window.pageStack.pushDialogLayer('qrc:/Categories.qml', {room: room, connection: connection}, { title: i18n("Space Settings") }) + } + + FormCard.FormButtonDelegate { text: i18nc("'Space' is a matrix space", "Leave Space") onClicked: RoomManager.leaveRoom(room) - implicitHeight: visible ? Kirigami.Units.gridUnit * 3 : 0 } } onClosed: root.closed() diff --git a/src/qml/Settings/SonnetConfigPage.qml b/src/qml/Settings/SonnetConfigPage.qml index 13302823f..05e7111d8 100644 --- a/src/qml/Settings/SonnetConfigPage.qml +++ b/src/qml/Settings/SonnetConfigPage.qml @@ -8,6 +8,7 @@ import QtQuick.Layouts import org.kde.kirigami as Kirigami import org.kde.sonnet as Sonnet import org.kde.kirigamiaddons.formcard as FormCard +import org.kde.kirigamiaddons.delegates as Delegates Kirigami.ScrollablePage { id: root @@ -170,19 +171,39 @@ Kirigami.ScrollablePage { } } ListView { + topMargin: Math.round(Kirigami.Units.smallSpacing / 2) + bottomMargin: Math.round(Kirigami.Units.smallSpacing / 2) + model: settings.currentIgnoreList - delegate: Kirigami.BasicListItem { - label: model.modelData - trailing: QQC2.ToolButton { - icon.name: "delete" - onClicked: { - remove(modelData) - if (instantApply) { - settings.save(); - } + delegate: Delegates.RoundedItemDelegate { + id: wordDelegate + + required property var modelData + + text: modelData + + contentItem: RowLayout { + spacing: Kirigami.Units.smallSpacing + + Delegates.DefaultContentItem { + itemDelegate: wordDelegate + Layout.fillWidth: true } - QQC2.ToolTip { - text: i18n("Delete word") + + QQC2.ToolButton { + text: i18nc("@action:button", "Delete word") + icon.name: "delete" + display: QQC2.ToolButton.IconOnly + onClicked: { + remove(wordDelegate.modelData); + if (instantApply) { + settings.save(); + } + } + + QQC2.ToolTip.text: text + QQC2.ToolTip.visible: hovered + QQC2.ToolTip.delay: Kirigami.ToolTip.toolTipDelay } } }