1
0
mirror of https://git.savannah.gnu.org/git/guix.git synced 2026-04-06 21:20:33 +02:00

gnu: nheko: Apply patch to render message replies properly.

* gnu/packages/patches/nheko-0-12-1-fix-rendering-replies.patch:
  New file.
* gnu/packages/messaging.scm (nheko)[source]: Apply it.
* gnu/local.mk: (dist_patch_DATA): Register it.

Change-Id: I262b8054e9ef6365450c8f89a69d60e4200f996f
Merges: https://codeberg.org/guix/guix/pulls/6853
Signed-off-by: Nguyễn Gia Phong <cnx@loang.net>
This commit is contained in:
bdunahu
2026-03-03 13:49:11 -05:00
committed by Nguyễn Gia Phong
parent bd0bba7440
commit 7c8cb33b98
3 changed files with 296 additions and 1 deletions

View File

@@ -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 \

View File

@@ -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

View File

@@ -0,0 +1,290 @@
From 2769642d3c7bd3c0d830b2f18ef6b3bf6a710bf4 Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
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
+ }
}
}