diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml index ab8a3ee8..98b9748a 100644 --- a/resources/qml/MessageView.qml +++ b/resources/qml/MessageView.qml @@ -26,7 +26,7 @@ Item { Connections { function onHideMenu() { messageContextMenuC.close(); - replyContextMenu.close(); + replyContextMenuC.close(); } target: MainWindow @@ -65,6 +65,7 @@ Item { TimelineDefaultMessageStyle { messageActions: messageActionsC messageContextMenu: messageContextMenuC + replyContextMenu: replyContextMenuC scrolledToThis: eventId === room.scrollTarget && (y + height > chat.y + chat.contentY && y < chat.y + chat.height + chat.contentY) } } @@ -74,6 +75,7 @@ Item { TimelineBubbleMessageStyle { messageActions: messageActionsC messageContextMenu: messageContextMenuC + replyContextMenu: replyContextMenuC scrolledToThis: eventId === room.scrollTarget && (y + height > chat.y + chat.contentY && y < chat.y + chat.height + chat.contentY) } } @@ -541,7 +543,7 @@ Item { } } Platform.Menu { - id: replyContextMenu + id: replyContextMenuC property string eventId property string link @@ -557,23 +559,23 @@ Item { Platform.MenuItem { enabled: visible text: qsTr("&Copy") - visible: replyContextMenu.text + visible: replyContextMenuC.text - onTriggered: Clipboard.text = replyContextMenu.text + onTriggered: Clipboard.text = replyContextMenuC.text } Platform.MenuItem { enabled: visible text: qsTr("Copy &link location") - visible: replyContextMenu.link + visible: replyContextMenuC.link - onTriggered: Clipboard.text = replyContextMenu.link + onTriggered: Clipboard.text = replyContextMenuC.link } Platform.MenuItem { enabled: visible text: qsTr("&Go to quoted message") visible: true - onTriggered: room.showEvent(replyContextMenu.eventId) + onTriggered: room.showEvent(replyContextMenuC.eventId) } } RoundButton { diff --git a/resources/qml/TimelineBubbleMessageStyle.qml b/resources/qml/TimelineBubbleMessageStyle.qml index ef6aba6e..2df3d917 100644 --- a/resources/qml/TimelineBubbleMessageStyle.qml +++ b/resources/qml/TimelineBubbleMessageStyle.qml @@ -44,6 +44,7 @@ TimelineEvent { required property bool isEditable required property QtObject messageContextMenu + required property QtObject replyContextMenu required property Item messageActions property int avatarMargin: (wrapper.isStateEvent || Settings.smallAvatars ? 0 : (Nheko.avatarSize + 8)) // align bubble with section header @@ -173,13 +174,14 @@ TimelineEvent { contentItem: Item { id: contentPlacementContainer - property int metadataWidth: 100 - property int metadataHeight: 20 - property bool fitsMetadata: ((wrapper.main?.width ?? 0) + wrapper.mainInset + metadata.width) < wrapper.maxWidth - implicitWidth: Math.max((wrapper.reply?.width ?? 0) + wrapper.replyInset, (wrapper.main?.width ?? 0) + wrapper.mainInset + (fitsMetadata ? metadata.width : 0)) - implicitHeight: contentColumn.implicitHeight + (fitsMetadata ? 0 : metadata.height) + // This doesnt work because of tables. They might have content in the top of the cell, while the background reaches to the bottom. Maybe using the textDocument we could do more? + // property bool fitsMetadataInside: wrapper.main?.positionAt ? (wrapper.main.positionAt(wrapper.main.width, wrapper.main.height - 4) == wrapper.main.positionAt(wrapper.main.width - metadata.width, wrapper.main.height - 4)) : false + property bool fitsMetadataInside: false + + implicitWidth: Math.max((wrapper.reply?.width ?? 0) + wrapper.replyInset, (wrapper.main?.width ?? 0) + wrapper.mainInset + ((fitsMetadata && !fitsMetadataInside) ? metadata.width : 0)) + implicitHeight: contentColumn.implicitHeight + ((fitsMetadata || fitsMetadataInside) ? 0 : metadata.height) TimelineMetadata { id: metadata @@ -275,6 +277,13 @@ TimelineEvent { wrapper.room.showEvent(wrapper.replyTo) } } + onPressAndHold: wrapper.replyContextMenu.show(wrapper.reply.copyText ?? "", wrapper.reply.linkAt ? wrapper.reply.linkAt(pressX-replyLine.width - Nheko.paddingSmall, pressY - replyUserButton.implicitHeight) : "", wrapper.replyTo) + TapHandler { + acceptedButtons: Qt.RightButton + onSingleTapped: (eventPoint) => wrapper.replyContextMenu.show(wrapper.reply.copyText ?? "", wrapper.reply.linkAt ? wrapper.reply.linkAt(eventPoint.position.x-replyLine.width - Nheko.paddingSmall, eventPoint.position.y - replyUserButton.implicitHeight) : "", wrapper.replyTo) + gesturePolicy: TapHandler.ReleaseWithinBounds + acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus | PointerDevice.TouchPad + } } data: [replyRow, wrapper.main] diff --git a/resources/qml/TimelineDefaultMessageStyle.qml b/resources/qml/TimelineDefaultMessageStyle.qml index 9685727d..e9a0712d 100644 --- a/resources/qml/TimelineDefaultMessageStyle.qml +++ b/resources/qml/TimelineDefaultMessageStyle.qml @@ -44,6 +44,7 @@ TimelineEvent { required property bool isEditable required property QtObject messageContextMenu + required property QtObject replyContextMenu required property Item messageActions property int avatarMargin: (wrapper.isStateEvent || Settings.smallAvatars ? 0 : (Nheko.avatarSize + 8)) // align bubble with section header @@ -261,6 +262,13 @@ TimelineEvent { wrapper.room.showEvent(wrapper.replyTo) } } + onPressAndHold: wrapper.replyContextMenu.show(wrapper.reply.copyText ?? "", wrapper.reply.linkAt ? wrapper.reply.linkAt(pressX-replyLine.width - Nheko.paddingSmall, pressY - replyUserButton.implicitHeight) : "", wrapper.replyTo) + TapHandler { + acceptedButtons: Qt.RightButton + onSingleTapped: (eventPoint) => wrapper.replyContextMenu.show(wrapper.reply.copyText ?? "", wrapper.reply.linkAt ? wrapper.reply.linkAt(eventPoint.position.x-replyLine.width - Nheko.paddingSmall, eventPoint.position.y - replyUserButton.implicitHeight) : "", wrapper.replyTo) + gesturePolicy: TapHandler.ReleaseWithinBounds + acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus | PointerDevice.TouchPad + } } data: [ @@ -292,14 +300,11 @@ TimelineEvent { id: reactionRow eventId: wrapper.eventId - layoutDirection: row.bubbleOnRight ? Qt.RightToLeft : Qt.LeftToRight reactions: wrapper.reactions width: wrapper.width - wrapper.avatarMargin x: wrapper.avatarMargin anchors { - //left: row.bubbleOnRight ? undefined : row.left - //right: row.bubbleOnRight ? row.right : undefined top: gridContainer.bottom topMargin: -4 }