diff options
author | Tulir Asokan <tulir@maunium.net> | 2020-02-20 21:56:03 +0200 |
---|---|---|
committer | Tulir Asokan <tulir@maunium.net> | 2020-02-20 21:56:03 +0200 |
commit | db1424a06d2274f0321991660312445829df13c9 (patch) | |
tree | 47da36262279c77c05d3158a02b5b7cbf6cc1777 /ui/message-view.go | |
parent | db7d2da50cd0f4c20bc0966bff7c388c017e182f (diff) |
Add support for displaying reactions
Diffstat (limited to 'ui/message-view.go')
-rw-r--r-- | ui/message-view.go | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/ui/message-view.go b/ui/message-view.go index 9d67c7b..20ee149 100644 --- a/ui/message-view.go +++ b/ui/message-view.go @@ -284,11 +284,16 @@ func (view *MessageView) replaceBuffer(original *messages.UIMessage, new *messag view.msgBufferLock.Lock() if new.Height() != end-start { - metaBuffer := view.msgBuffer[0:start] - for i := 0; i < new.Height(); i++ { - metaBuffer = append(metaBuffer, new) + height := new.Height() + + newBuffer := make([]*messages.UIMessage, height + len(view.msgBuffer) - end) + for i := 0; i < height; i++ { + newBuffer[i] = new + } + for i := height; i < len(newBuffer); i++ { + newBuffer[i] = view.msgBuffer[end + (i - height)] } - view.msgBuffer = append(metaBuffer, view.msgBuffer[end:]...) + view.msgBuffer = append(view.msgBuffer[0:start], newBuffer...) } else { for i := start; i < end; i++ { view.msgBuffer[i] = new @@ -594,33 +599,38 @@ func (view *MessageView) Draw(screen mauview.Screen) { var prevMsg *messages.UIMessage view.msgBufferLock.RLock() - for line := viewStart; line < height && indexOffset+line < len(view.msgBuffer); line++ { + for line := viewStart; line < height && indexOffset+line < len(view.msgBuffer); { index := indexOffset + line msg := view.msgBuffer[index] - if msg != prevMsg { - if len(msg.FormatTime()) > 0 { - widget.WriteLineSimpleColor(screen, msg.FormatTime(), 0, line, msg.TimestampColor()) - } - // TODO hiding senders might not be that nice after all, maybe an option? (disabled for now) - //if !bareMode && (prevMsg == nil || meta.Sender() != prevMsg.Sender()) { - widget.WriteLineColor( - screen, mauview.AlignRight, msg.Sender(), - usernameX, line, view.widestSender(), - msg.SenderColor()) - //} - if msg.Edited { - // TODO add better indicator for edits - screen.SetCell(usernameX + view.widestSender(), line, tcell.StyleDefault.Foreground(tcell.ColorDarkRed), '*') - } - prevMsg = msg + if msg == prevMsg { + debug.Print("Unexpected re-encounter of", msg, msg.Height(), "at", line, index) + line++ + continue + } + + if len(msg.FormatTime()) > 0 { + widget.WriteLineSimpleColor(screen, msg.FormatTime(), 0, line, msg.TimestampColor()) + } + // TODO hiding senders might not be that nice after all, maybe an option? (disabled for now) + //if !bareMode && (prevMsg == nil || meta.Sender() != prevMsg.Sender()) { + widget.WriteLineColor( + screen, mauview.AlignRight, msg.Sender(), + usernameX, line, view.widestSender(), + msg.SenderColor()) + //} + if msg.Edited { + // TODO add better indicator for edits + screen.SetCell(usernameX+view.widestSender(), line, tcell.StyleDefault.Foreground(tcell.ColorDarkRed), '*') } for i := index - 1; i >= 0 && view.msgBuffer[i] == msg; i-- { line-- } msg.Draw(mauview.NewProxyScreen(screen, messageX, line, view.width()-messageX, msg.Height())) - line += msg.Height() - 1 + line += msg.Height() + + prevMsg = msg } view.msgBufferLock.RUnlock() } |