From d1867ee14c28498f9243ce4eb9969ddc3677e433 Mon Sep 17 00:00:00 2001 From: ayn2op Date: Sun, 4 Oct 2026 15:43:48 -0400 Subject: [PATCH] refactor(messageslist): pass the render width as a parameter --- go.mod | 2 +- go.sum | 4 ++-- internal/ui/chat/messageslist/model.go | 28 +++++++++++--------------- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 9952b4b..8b49df7 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/cloudflare/circl v1.6.5 // indirect github.com/danieljoos/wincred v1.2.3 // indirect github.com/dchest/jsmin v1.0.0 // indirect - github.com/dlclark/regexp2/v2 v2.8.2 // indirect + github.com/dlclark/regexp2/v2 v2.8.3 // indirect github.com/ebitengine/purego v0.11.1 // indirect github.com/gdamore/encoding v1.0.1 // indirect github.com/godbus/dbus/v5 v5.2.2 // indirect diff --git a/go.sum b/go.sum index 5d7d1ac..1e5ddfc 100644 --- a/go.sum +++ b/go.sum @@ -42,8 +42,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dchest/jsmin v1.0.0 h1:Y2hWXmGZiRxtl+VcTksyucgTlYxnhPzTozCwx9gy9zI= github.com/dchest/jsmin v1.0.0/go.mod h1:AVBIund7Mr7lKXT70hKT2YgL3XEXUaUk5iw9DZ8b0Uc= -github.com/dlclark/regexp2/v2 v2.8.2 h1:uTTe+cxADL4be+dv4DZwsBIEPCQ6RHPlnVuKrtLqSx0= -github.com/dlclark/regexp2/v2 v2.8.2/go.mod h1:avUrQvPaLz2DrFNHJF0taWAFFX2C1GMSSoeiqFjcBmU= +github.com/dlclark/regexp2/v2 v2.8.3 h1:4iBHVtmyAsQOOthVo+0v0RxktjLPDOTKx9Nuhf+PpD0= +github.com/dlclark/regexp2/v2 v2.8.3/go.mod h1:avUrQvPaLz2DrFNHJF0taWAFFX2C1GMSSoeiqFjcBmU= github.com/ebitengine/purego v0.11.1 h1:2zpWRSQNVKN4eKsKO9eM1ILDgWfYMY9GwqRmK6XeQ/0= github.com/ebitengine/purego v0.11.1/go.mod h1:DCHPP08djqhNSoTfImcnHYQRZmd0qhakvrozqaEYhGQ= github.com/gdamore/encoding v1.0.1 h1:YzKZckdBL6jVt2Gc+5p82qhrGiqMdG/eNs6Wy0u3Uhw= diff --git a/internal/ui/chat/messageslist/model.go b/internal/ui/chat/messageslist/model.go index 77111c1..87abcb8 100644 --- a/internal/ui/chat/messageslist/model.go +++ b/internal/ui/chat/messageslist/model.go @@ -57,9 +57,6 @@ type Model struct { renderer *markdown.Renderer - // renderWidth is the width the message being rendered is laid out at. - renderWidth int - // kitty reports whether previews are drawn with kitty's graphics protocol. // kittyImages counts the images sent to the terminal. kitty bool @@ -249,8 +246,7 @@ func (ml *Model) buildItem(index int) tview.Widget { if item.view == nil { message := item.message view := &messageView{render: func(width int) richtext.Text { - ml.renderWidth = width - return ml.renderMessage(message, ml.cfg.Theme.MessagesList.MessageStyle.Style) + return ml.renderMessage(message, ml.cfg.Theme.MessagesList.MessageStyle.Style, width) }} for _, s := range previewSources(message) { if preview, ok := item.previews[s.proxy]; ok { @@ -335,9 +331,9 @@ func (d dateSeparator) Draw(screen tview.Screen, area tview.Rectangle) { func (dateSeparator) Handle(msg tview.Msg, area tview.Rectangle) tview.Msg { return msg } -func (ml *Model) renderMessage(message discord.Message, baseStyle tview.Style) richtext.Text { +func (ml *Model) renderMessage(message discord.Message, baseStyle tview.Style, width int) richtext.Text { builder := new(richtext.Builder) - ml.writeMessage(builder, message, baseStyle) + ml.writeMessage(builder, message, baseStyle, width) return builder.Finish() } @@ -390,7 +386,7 @@ func (ml *Model) onRowCursorChanged(index int) { ml.setCursor(target) } -func (ml *Model) writeMessage(builder *richtext.Builder, message discord.Message, baseStyle tview.Style) { +func (ml *Model) writeMessage(builder *richtext.Builder, message discord.Message, baseStyle tview.Style, width int) { if ml.cfg.HideBlockedUsers { isBlocked := ml.state.UserIsBlocked(message.Author.ID) if isBlocked { @@ -404,14 +400,14 @@ func (ml *Model) writeMessage(builder *richtext.Builder, message discord.Message if message.Reference != nil && message.Reference.Type == discord.MessageReferenceTypeForward { ml.drawForwardedMessage(builder, message, baseStyle) } else { - ml.drawDefaultMessage(builder, message, baseStyle) + ml.drawDefaultMessage(builder, message, baseStyle, width) } case discord.GuildMemberJoinMessage: ml.drawTimestamps(builder, message.Timestamp, baseStyle) ml.drawAuthor(builder, message, baseStyle) builder.Write("joined the server.", baseStyle) case discord.InlinedReplyMessage: - ml.drawReplyMessage(builder, message, baseStyle) + ml.drawReplyMessage(builder, message, baseStyle, width) case discord.ChannelPinnedMessage: ml.drawPinnedMessage(builder, message, baseStyle) default: @@ -551,7 +547,7 @@ func (ml *Model) drawSnapshotContent(builder *richtext.Builder, parent discord.M ml.drawContent(builder, message, baseStyle) } -func (ml *Model) drawDefaultMessage(builder *richtext.Builder, message discord.Message, baseStyle tview.Style) { +func (ml *Model) drawDefaultMessage(builder *richtext.Builder, message discord.Message, baseStyle tview.Style, width int) { if ml.cfg.Timestamps.Enabled { ml.drawTimestamps(builder, message.Timestamp, baseStyle) } @@ -564,7 +560,7 @@ func (ml *Model) drawDefaultMessage(builder *richtext.Builder, message discord.M builder.Write(" (edited)", dimStyle) } - ml.drawEmbeds(builder, message, baseStyle, contentRoot, contentSource) + ml.drawEmbeds(builder, message, baseStyle, width, contentRoot, contentSource) attachmentStyle := tview.MergeStyle(baseStyle, ml.cfg.Theme.MessagesList.AttachmentStyle.Style) for _, a := range message.Attachments { @@ -579,7 +575,7 @@ func (ml *Model) drawDefaultMessage(builder *richtext.Builder, message discord.M } } -func (ml *Model) drawEmbeds(builder *richtext.Builder, message discord.Message, baseStyle tview.Style, contentRoot ast.Node, contentSource []byte) { +func (ml *Model) drawEmbeds(builder *richtext.Builder, message discord.Message, baseStyle tview.Style, width int, contentRoot ast.Node, contentSource []byte) { if len(message.Embeds) == 0 { return } @@ -602,7 +598,7 @@ func (ml *Model) drawEmbeds(builder *richtext.Builder, message discord.Message, prefixText := " ▎ " prefixWidth := uniseg.StringWidth(prefixText) // Wrap against the list's width, so the message is rendered again when it changes. - wrapWidth := max(ml.renderWidth-prefixWidth, 1) + wrapWidth := max(width-prefixWidth, 1) for _, embed := range message.Embeds { lines := embedLines(embed, contentURLs) @@ -810,7 +806,7 @@ func (ml *Model) drawForwardedMessage(builder *richtext.Builder, message discord builder.Write(" ("+ml.formatTimestamp(message.MessageSnapshots[0].Message.Timestamp)+") ", dimStyle) } -func (ml *Model) drawReplyMessage(builder *richtext.Builder, message discord.Message, baseStyle tview.Style) { +func (ml *Model) drawReplyMessage(builder *richtext.Builder, message discord.Message, baseStyle tview.Style, width int) { dimStyle := baseStyle.Dim(true) builder.Write(ml.cfg.Theme.MessagesList.ReplyIndicator+" ", dimStyle) @@ -823,7 +819,7 @@ func (ml *Model) drawReplyMessage(builder *richtext.Builder, message discord.Mes } builder.NewLine() - ml.drawDefaultMessage(builder, message, baseStyle) + ml.drawDefaultMessage(builder, message, baseStyle, width) } func (ml *Model) drawPinnedMessage(builder *richtext.Builder, message discord.Message, baseStyle tview.Style) {