diff --git a/gnu/local.mk b/gnu/local.mk index 22f86c64fc..d22961f84e 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1975,6 +1975,7 @@ dist_patch_DATA = \ %D%/packages/patches/netsurf-y2038-tests.patch \ %D%/packages/patches/netsurf-longer-test-timeout.patch \ %D%/packages/patches/nhc98-c-update.patch \ + %D%/packages/patches/nheko-0-12-1-fix-rendering-replies.patch \ %D%/packages/patches/nix-dont-build-html-doc.diff \ %D%/packages/patches/nfs4-acl-tools-0.3.7-fixpaths.patch \ %D%/packages/patches/network-manager-plugin-ownership.patch \ diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm index d299005cce..4e8e43b08d 100644 --- a/gnu/packages/messaging.scm +++ b/gnu/packages/messaging.scm @@ -2356,7 +2356,11 @@ for the Matrix protocol. It is built on to of @code{Boost.Asio}.") (sha256 (base32 "098jqccwsfbqkdpnhbych2rd076385wb51fx9qyjfiddidxv2mas")) (modules '((guix build utils))) - (snippet '(delete-file-recursively "third_party")))) + (snippet '(delete-file-recursively "third_party")) + ;; Release 0.12.1 has a major bug which prevents replies + ;; from rendering: https://github.com/Nheko-Reborn/nheko/issues/1944 + ;; TODO: revaluate for future versions. + (patches (search-patches "nheko-0-12-1-fix-rendering-replies.patch")))) (arguments (list #:tests? #f ;no test target diff --git a/gnu/packages/patches/nheko-0-12-1-fix-rendering-replies.patch b/gnu/packages/patches/nheko-0-12-1-fix-rendering-replies.patch new file mode 100644 index 0000000000..326e7b5285 --- /dev/null +++ b/gnu/packages/patches/nheko-0-12-1-fix-rendering-replies.patch @@ -0,0 +1,290 @@ +From 2769642d3c7bd3c0d830b2f18ef6b3bf6a710bf4 Mon Sep 17 00:00:00 2001 +From: Nicolas Werner +Date: Sun, 14 Sep 2025 23:43:20 +0200 +Subject: [PATCH] Fix most reply rendering issues with qt 6.9.2 + +--- + resources/qml/TimelineBubbleMessageStyle.qml | 31 ++++---- + resources/qml/TimelineDefaultMessageStyle.qml | 32 ++++----- + resources/qml/TopBar.qml | 2 +- + resources/qml/delegates/Reply.qml | 70 ++++++++++--------- + 4 files changed, 65 insertions(+), 70 deletions(-) + +diff --git a/resources/qml/TimelineBubbleMessageStyle.qml b/resources/qml/TimelineBubbleMessageStyle.qml +index 560cb1338..722718bc4 100644 +--- a/resources/qml/TimelineBubbleMessageStyle.qml ++++ b/resources/qml/TimelineBubbleMessageStyle.qml +@@ -210,9 +210,10 @@ TimelineEvent { + + AbstractButton { + id: replyRow +- visible: wrapper.reply ++ visible: wrapper.replyTo ++ ++ leftPadding: Nheko.paddingSmall + 4 + +- height: replyLine.height + anchors.left: parent.left + anchors.right: parent.right + +@@ -225,19 +226,7 @@ TimelineEvent { + cursorShape: Qt.PointingHandCursor + } + +- contentItem: Row { +- id: replyRowLay +- +- spacing: Nheko.paddingSmall +- +- Rectangle { +- id: replyLine +- height: Math.min( wrapper.reply?.height, timelineView.height / 10) + Nheko.paddingSmall + replyUserButton.height +- color: replyRow.userColor +- width: 4 +- } +- +- Column { ++ contentItem: Column { + spacing: 0 + + id: replyCol +@@ -247,7 +236,7 @@ TimelineEvent { + + contentItem: Label { + id: userName_ +- text: wrapper.reply?.userName ?? '' ++ text: wrapper.reply?.userName ?? 'missing name' + color: replyRow.userColor + textFormat: Text.RichText + width: wrapper.maxWidth +@@ -259,12 +248,20 @@ TimelineEvent { + replyUserButton, + wrapper.reply, + ] +- } + } + + background: Rectangle { + //width: replyRow.implicitContentWidth + color: Qt.tint(palette.base, Qt.hsla(replyRow.userColor.hslHue, 0.5, replyRow.userColor.hslLightness, 0.1)) ++ Rectangle { ++ anchors.top: parent.top ++ anchors.bottom: parent.bottom ++ anchors.left: parent.left ++ ++ id: replyLine ++ color: replyRow.userColor ++ width: 4 ++ } + } + + onClicked: { +diff --git a/resources/qml/TimelineDefaultMessageStyle.qml b/resources/qml/TimelineDefaultMessageStyle.qml +index 2bc0171a8..49454ac0b 100644 +--- a/resources/qml/TimelineDefaultMessageStyle.qml ++++ b/resources/qml/TimelineDefaultMessageStyle.qml +@@ -192,9 +192,9 @@ TimelineEvent { + + AbstractButton { + id: replyRow +- visible: wrapper.reply ++ visible: wrapper.replyTo + +- height: replyLine.height ++ leftPadding: Nheko.paddingSmall + 4 + + property color userColor: TimelineManager.userColor(wrapper.reply?.userId ?? '', palette.base) + +@@ -205,19 +205,7 @@ TimelineEvent { + cursorShape: Qt.PointingHandCursor + } + +- contentItem: Row { +- id: replyRowLay +- +- spacing: Nheko.paddingSmall +- +- Rectangle { +- id: replyLine +- height: Math.min( wrapper.reply?.height, timelineView.height / 10) + Nheko.paddingSmall + replyUserButton.height +- color: replyRow.userColor +- width: 4 +- } +- +- Column { ++ contentItem: Column { + spacing: 0 + + id: replyCol +@@ -227,7 +215,7 @@ TimelineEvent { + + contentItem: Label { + id: userName_ +- text: wrapper.reply?.userName ?? '' ++ text: wrapper.reply?.userName ?? 'missing name' + color: replyRow.userColor + textFormat: Text.RichText + width: wrapper.maxWidth +@@ -239,12 +227,20 @@ TimelineEvent { + replyUserButton, + wrapper.reply, + ] +- } + } + + background: Rectangle { +- //width: replyRow.implicitContentWidth + color: Qt.tint(palette.base, Qt.hsla(replyRow.userColor.hslHue, 0.5, replyRow.userColor.hslLightness, 0.1)) ++ ++ Rectangle { ++ anchors.top: parent.top ++ anchors.bottom: parent.bottom ++ anchors.left: parent.left ++ ++ id: replyLine ++ color: replyRow.userColor ++ width: 4 ++ } + } + + onClicked: { +diff --git a/resources/qml/TopBar.qml b/resources/qml/TopBar.qml +index 900e59e8b..cd20e94ec 100644 +--- a/resources/qml/TopBar.qml ++++ b/resources/qml/TopBar.qml +@@ -330,7 +330,7 @@ Pane { + ImageButton { + id: deletePinButton + +- Layout.alignment: Qt.AlignTop | Qt.AlignLeft ++ Layout.alignment: Qt.AlignTop | Qt.AlignRight + Layout.preferredHeight: 16 + Layout.preferredWidth: 16 + ToolTip.text: qsTr("Unpin") +diff --git a/resources/qml/delegates/Reply.qml b/resources/qml/delegates/Reply.qml +index 7ee2a0a14..77cad0f0a 100644 +--- a/resources/qml/delegates/Reply.qml ++++ b/resources/qml/delegates/Reply.qml +@@ -5,6 +5,7 @@ + import QtQuick + import QtQuick.Controls + import QtQuick.Window ++import QtQuick.Layouts + import im.nheko + import "../" + +@@ -21,7 +22,11 @@ AbstractButton { + property string userId: eventId ? room.dataById(eventId, Room.UserId, "") : "" + property string userName: eventId ? room.dataById(eventId, Room.UserName, "") : "" + implicitHeight: replyContainer.height +- implicitWidth: replyContainer.implicitWidth ++ implicitWidth: replyContainer.implicitWidth + leftPadding + rightPadding ++ ++ leftPadding: 4 + Nheko.paddingSmall ++ rightPadding: Nheko.paddingSmall ++ + required property int maxWidth + property bool limitHeight: false + +@@ -31,14 +36,14 @@ AbstractButton { + } + + onClicked: { +- let link = reply.child.linkAt != undefined && reply.child.linkAt(pressX-colorline.width, pressY - userName_.implicitHeight); ++ let link = timelineEvent.main.linkAt != undefined && timelineEvent.main.linkAt(pressX-colorline.width, pressY - userName_.implicitHeight); + if (link) { + Nheko.openLink(link) + } else { + room.showEvent(r.eventId) + } + } +- onPressAndHold: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(pressX-colorline.width, pressY - userName_.implicitHeight), r.eventId) ++ onPressAndHold: replyContextMenu.show(timelineEvent.main.copyText, timelineEvent.main.linkAt(pressX-colorline.width, pressY - userName_.implicitHeight), r.eventId) + + contentItem: TimelineEvent { + id: timelineEvent +@@ -51,49 +56,36 @@ AbstractButton { + maxWidth: r.maxWidth + limitAsReply: r.limitHeight + +- //height: replyContainer.implicitHeight +- data: Row { ++ data: Column { + id: replyContainer +- +- spacing: Nheko.paddingSmall ++ spacing: 0 + + clip: r.limitHeight + + height: r.limitHeight ? Math.min( timelineEvent.main?.height, timelineView.height / 10) + Nheko.paddingSmall + usernameBtn.height : undefined + +- Rectangle { +- id: colorline +- +- width: 4 +- height: content.height +- +- color: TimelineManager.userColor(r.userId, palette.base) +- } +- +- Column { +- id: content +- spacing: 0 ++ // FIXME: I have no idea, why this name doesn't render in the reply popup on Qt 6.9.2 ++ AbstractButton { ++ id: usernameBtn + +- AbstractButton { +- id: usernameBtn ++ visible: r.eventId + +- +- contentItem: Label { +- id: userName_ +- text: r.userName +- color: r.userColor +- textFormat: Text.RichText +- width: timelineEvent.main?.width +- } +- onClicked: room.openUserProfile(r.userId) ++ contentItem: Label { ++ visible: r.eventId ++ id: userName_ ++ text: r.userName ++ color: r.userColor ++ textFormat: Text.RichText ++ width: timelineEvent.main?.width + } +- +- data: [ +- usernameBtn, timelineEvent.main, +- ] ++ onClicked: room.openUserProfile(r.userId) + } + ++ data: [ ++ usernameBtn, timelineEvent.main, ++ ] + } ++ + } + + background: Rectangle { +@@ -103,6 +95,16 @@ AbstractButton { + property color userColor: TimelineManager.userColor(r.userId, palette.base) + property color bgColor: palette.base + color: Qt.tint(bgColor, Qt.hsla(userColor.hslHue, 0.5, userColor.hslLightness, 0.1)) ++ ++ Rectangle { ++ anchors.top: parent.top ++ anchors.bottom: parent.bottom ++ anchors.left: parent.left ++ ++ id: colorline ++ color: backgroundItem.userColor ++ width: 4 ++ } + } + + }