Re-add reply rendering
This commit is contained in:
parent
007b05d54e
commit
005c51c3b5
@ -20,6 +20,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"maunium.net/go/gomuks/config"
|
||||||
"maunium.net/go/mautrix"
|
"maunium.net/go/mautrix"
|
||||||
"maunium.net/go/mauview"
|
"maunium.net/go/mauview"
|
||||||
"maunium.net/go/tcell"
|
"maunium.net/go/tcell"
|
||||||
@ -41,6 +42,7 @@ type BaseMessage struct {
|
|||||||
MsgIsHighlight bool
|
MsgIsHighlight bool
|
||||||
MsgIsService bool
|
MsgIsService bool
|
||||||
MsgSource json.RawMessage
|
MsgSource json.RawMessage
|
||||||
|
ReplyTo UIMessage
|
||||||
buffer []tstring.TString
|
buffer []tstring.TString
|
||||||
plainBuffer []tstring.TString
|
plainBuffer []tstring.TString
|
||||||
}
|
}
|
||||||
@ -171,9 +173,16 @@ func (msg *BaseMessage) TimestampColor() tcell.Color {
|
|||||||
return msg.getStateSpecificColor()
|
return msg.getStateSpecificColor()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msg *BaseMessage) ReplyHeight() int {
|
||||||
|
if msg.ReplyTo != nil {
|
||||||
|
return 2 + msg.ReplyTo.Height()
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
// Height returns the number of rows in the computed buffer (see Buffer()).
|
// Height returns the number of rows in the computed buffer (see Buffer()).
|
||||||
func (msg *BaseMessage) Height() int {
|
func (msg *BaseMessage) Height() int {
|
||||||
return len(msg.buffer)
|
return msg.ReplyHeight() + len(msg.buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Timestamp returns the full timestamp when the message was sent.
|
// Timestamp returns the full timestamp when the message was sent.
|
||||||
@ -236,8 +245,36 @@ func (msg *BaseMessage) Source() json.RawMessage {
|
|||||||
return msg.MsgSource
|
return msg.MsgSource
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msg *BaseMessage) SetReplyTo(event UIMessage) {
|
||||||
|
msg.ReplyTo = event
|
||||||
|
}
|
||||||
|
|
||||||
func (msg *BaseMessage) Draw(screen mauview.Screen) {
|
func (msg *BaseMessage) Draw(screen mauview.Screen) {
|
||||||
|
screen = msg.DrawReply(screen)
|
||||||
for y, line := range msg.buffer {
|
for y, line := range msg.buffer {
|
||||||
line.Draw(screen, 0, y)
|
line.Draw(screen, 0, y)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msg *BaseMessage) CalculateReplyBuffer(preferences config.UserPreferences, width int) {
|
||||||
|
if msg.ReplyTo == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
msg.ReplyTo.CalculateBuffer(preferences, width-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg *BaseMessage) DrawReply(screen mauview.Screen) mauview.Screen {
|
||||||
|
if msg.ReplyTo == nil {
|
||||||
|
return screen
|
||||||
|
}
|
||||||
|
width, height := screen.Size()
|
||||||
|
replyHeight := msg.ReplyTo.Height()
|
||||||
|
widget.WriteLineSimpleColor(screen, "In reply to", 0, 0, tcell.ColorGreen)
|
||||||
|
widget.WriteLineSimpleColor(screen, msg.ReplyTo.RealSender(), len("In reply to "), 0, msg.ReplyTo.SenderColor())
|
||||||
|
for y := 1; y < 1+replyHeight; y++ {
|
||||||
|
screen.SetCell(0, y, tcell.StyleDefault, '▋')
|
||||||
|
}
|
||||||
|
replyScreen := mauview.NewProxyScreen(screen, 1, 1, width-1, replyHeight)
|
||||||
|
msg.ReplyTo.Draw(replyScreen)
|
||||||
|
return mauview.NewProxyScreen(screen, 0, replyHeight+2, width, height-replyHeight-2)
|
||||||
|
}
|
||||||
|
@ -70,5 +70,6 @@ func (msg *ExpandedTextMessage) PlainText() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (msg *ExpandedTextMessage) CalculateBuffer(prefs config.UserPreferences, width int) {
|
func (msg *ExpandedTextMessage) CalculateBuffer(prefs config.UserPreferences, width int) {
|
||||||
|
msg.CalculateReplyBuffer(prefs, width)
|
||||||
msg.calculateBufferWithText(prefs, msg.MsgText, width)
|
msg.calculateBufferWithText(prefs, msg.MsgText, width)
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ func NewHTMLMessage(event *mautrix.Event, displayname string, root html.Entity)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (hw *HTMLMessage) Draw(screen mauview.Screen) {
|
func (hw *HTMLMessage) Draw(screen mauview.Screen) {
|
||||||
|
screen = hw.DrawReply(screen)
|
||||||
if hw.focused {
|
if hw.focused {
|
||||||
screen.SetStyle(tcell.StyleDefault.Background(hw.FocusedBg))
|
screen.SetStyle(tcell.StyleDefault.Background(hw.FocusedBg))
|
||||||
}
|
}
|
||||||
@ -69,16 +70,17 @@ func (hw *HTMLMessage) OnPasteEvent(event mauview.PasteEvent) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (hw *HTMLMessage) CalculateBuffer(preferences config.UserPreferences, width int) {
|
func (hw *HTMLMessage) CalculateBuffer(preferences config.UserPreferences, width int) {
|
||||||
if width <= 0 {
|
if width < 2 {
|
||||||
panic("Negative width in CalculateBuffer")
|
return
|
||||||
}
|
}
|
||||||
|
hw.CalculateReplyBuffer(preferences, width)
|
||||||
// TODO account for bare messages in initial startX
|
// TODO account for bare messages in initial startX
|
||||||
startX := 0
|
startX := 0
|
||||||
hw.Root.CalculateBuffer(width, startX, preferences.BareMessageView)
|
hw.Root.CalculateBuffer(width, startX, preferences.BareMessageView)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hw *HTMLMessage) Height() int {
|
func (hw *HTMLMessage) Height() int {
|
||||||
return hw.Root.Height()
|
return hw.ReplyHeight() + hw.Root.Height()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hw *HTMLMessage) PlainText() string {
|
func (hw *HTMLMessage) PlainText() string {
|
||||||
|
@ -92,6 +92,7 @@ func (msg *ImageMessage) CalculateBuffer(prefs config.UserPreferences, width int
|
|||||||
if width < 2 {
|
if width < 2 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
msg.CalculateReplyBuffer(prefs, width)
|
||||||
|
|
||||||
if prefs.BareMessageView || prefs.DisableImages {
|
if prefs.BareMessageView || prefs.DisableImages {
|
||||||
msg.calculateBufferWithText(prefs, tstring.NewTString(msg.PlainText()), width)
|
msg.calculateBufferWithText(prefs, tstring.NewTString(msg.PlainText()), width)
|
||||||
|
@ -37,6 +37,7 @@ type UIMessage interface {
|
|||||||
FormatDate() string
|
FormatDate() string
|
||||||
SameDate(message UIMessage) bool
|
SameDate(message UIMessage) bool
|
||||||
|
|
||||||
|
SetReplyTo(message UIMessage)
|
||||||
CalculateBuffer(preferences config.UserPreferences, width int)
|
CalculateBuffer(preferences config.UserPreferences, width int)
|
||||||
Draw(screen mauview.Screen)
|
Draw(screen mauview.Screen)
|
||||||
Height() int
|
Height() int
|
||||||
|
@ -37,13 +37,18 @@ func ParseEvent(matrix ifc.MatrixContainer, room *rooms.Room, evt *mautrix.Event
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if len(evt.Content.GetReplyTo()) > 0 {
|
if len(evt.Content.GetReplyTo()) > 0 {
|
||||||
roomID := evt.Content.RelatesTo.InReplyTo.RoomID
|
replyToRoom := room
|
||||||
if len(roomID) == 0 {
|
if len(evt.Content.RelatesTo.InReplyTo.RoomID) > 0 {
|
||||||
roomID = room.ID
|
replyToRoom = matrix.GetRoom(evt.Content.RelatesTo.InReplyTo.RoomID)
|
||||||
}
|
}
|
||||||
replyToEvt, _ := matrix.GetEvent(room, evt.Content.GetReplyTo())
|
replyToEvt, _ := matrix.GetEvent(replyToRoom, evt.Content.GetReplyTo())
|
||||||
if replyToEvt != nil {
|
if replyToEvt != nil {
|
||||||
// TODO add reply header
|
replyToMsg := directParseEvent(matrix, replyToRoom, replyToEvt)
|
||||||
|
if replyToMsg != nil {
|
||||||
|
msg.SetReplyTo(replyToMsg)
|
||||||
|
} else {
|
||||||
|
// TODO add unrenderable reply header
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// TODO add unknown reply header
|
// TODO add unknown reply header
|
||||||
}
|
}
|
||||||
|
@ -79,5 +79,6 @@ func (msg *TextMessage) PlainText() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (msg *TextMessage) CalculateBuffer(prefs config.UserPreferences, width int) {
|
func (msg *TextMessage) CalculateBuffer(prefs config.UserPreferences, width int) {
|
||||||
|
msg.CalculateReplyBuffer(prefs, width)
|
||||||
msg.calculateBufferWithText(prefs, msg.getCache(), width)
|
msg.calculateBufferWithText(prefs, msg.getCache(), width)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user