refactor(messageslist): pass the render width as a parameter

This commit is contained in:
ayn2op 2026-10-04 15:43:48 -04:00
parent a94a791174
commit d1867ee14c
3 changed files with 15 additions and 19 deletions

2
go.mod
View file

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

4
go.sum
View file

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

View file

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