diff --git a/ui/types/message.go b/ui/types/message.go index b69eab2..8899a7d 100644 --- a/ui/types/message.go +++ b/ui/types/message.go @@ -83,3 +83,27 @@ func (message *Message) CalculateBuffer(width int) { } } } + +func (message *Message) GetSender() string { + return message.Sender +} + +func (message *Message) GetSenderColor() tcell.Color { + return message.SenderColor +} + +func (message *Message) GetTimestamp() string { + return message.Timestamp +} + +func (message *Message) GetDate() string { + return message.Date +} + +func (message *Message) GetTextColor() tcell.Color { + return tcell.ColorDefault +} + +func (message *Message) GetTimestampColor() tcell.Color { + return tcell.ColorDefault +} diff --git a/ui/types/meta.go b/ui/types/meta.go new file mode 100644 index 0000000..c1817d4 --- /dev/null +++ b/ui/types/meta.go @@ -0,0 +1,59 @@ +// gomuks - A terminal Matrix client written in Go. +// Copyright (C) 2018 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package types + +import ( + "github.com/gdamore/tcell" +) + +type MessageMeta interface { + GetSender() string + GetSenderColor() tcell.Color + GetTextColor() tcell.Color + GetTimestampColor() tcell.Color + GetTimestamp() string + GetDate() string +} + +type BasicMeta struct { + Sender, Timestamp, Date string + SenderColor, TextColor, TimestampColor tcell.Color +} + +func (meta *BasicMeta) GetSender() string { + return meta.Sender +} + +func (meta *BasicMeta) GetSenderColor() tcell.Color { + return meta.SenderColor +} + +func (meta *BasicMeta) GetTimestamp() string { + return meta.Timestamp +} + +func (meta *BasicMeta) GetDate() string { + return meta.Date +} + +func (meta *BasicMeta) GetTextColor() tcell.Color { + return meta.TextColor +} + +func (meta *BasicMeta) GetTimestampColor() tcell.Color { + return meta.TimestampColor +} diff --git a/ui/widget/message-view.go b/ui/widget/message-view.go index 953dd7d..070d982 100644 --- a/ui/widget/message-view.go +++ b/ui/widget/message-view.go @@ -44,8 +44,8 @@ type MessageView struct { messageIDs map[string]bool messages []*types.Message - metaBuffer []*types.Message textBuffer []string + metaBuffer []types.MessageMeta } func NewMessageView() *MessageView { @@ -61,7 +61,7 @@ func NewMessageView() *MessageView { messages: make([]*types.Message, 0), messageIDs: make(map[string]bool), textBuffer: make([]string, 0), - metaBuffer: make([]*types.Message, 0), + metaBuffer: make([]types.MessageMeta, 0), widestSender: 5, prevWidth: -1, @@ -129,9 +129,9 @@ func (view *MessageView) recalculateMessageBuffers() { func (view *MessageView) appendBuffer(message *types.Message) { if len(view.metaBuffer) > 0 { prevMeta := view.metaBuffer[len(view.metaBuffer)-1] - if prevMeta != nil && prevMeta.Date != message.Date { + if prevMeta != nil && prevMeta.GetDate() != message.Date { view.textBuffer = append(view.textBuffer, fmt.Sprintf("Date changed to %s", message.Date)) - view.metaBuffer = append(view.metaBuffer, nil) + view.metaBuffer = append(view.metaBuffer, &types.BasicMeta{TextColor: tcell.ColorGreen}) } } @@ -144,7 +144,7 @@ func (view *MessageView) appendBuffer(message *types.Message) { func (view *MessageView) recalculateBuffer() { _, _, width, height := view.GetInnerRect() view.textBuffer = make([]string, 0) - view.metaBuffer = make([]*types.Message, 0) + view.metaBuffer = make([]types.MessageMeta, 0) if height != view.prevHeight || width != view.prevWidth { for _, message := range view.messages { @@ -259,8 +259,7 @@ func (view *MessageView) Draw(screen tcell.Screen) { screen.SetContent(separatorX, separatorY, view.Separator, nil, tcell.StyleDefault) } - var prevMeta *types.Message - var prevSender string + var prevMeta types.MessageMeta indexOffset := len(view.textBuffer) - view.ScrollOffset - height if indexOffset <= -PaddingAtTop { message := "Scroll up to load more messages." @@ -278,18 +277,17 @@ func (view *MessageView) Draw(screen tcell.Screen) { } text, meta := view.textBuffer[index], view.metaBuffer[index] if meta != prevMeta { - if meta != nil { - view.writeLine(screen, meta.Timestamp, x, y+line, tcell.ColorDefault) - if meta.Sender != prevSender { - view.writeLineRight( - screen, meta.Sender, - x+usernameOffsetX, y+line, - view.widestSender, meta.SenderColor) - prevSender = meta.Sender - } + if len(meta.GetTimestamp()) > 0 { + view.writeLine(screen, meta.GetTimestamp(), x, y+line, meta.GetTimestampColor()) + } + if len(meta.GetSender()) > 0 && (prevMeta == nil || meta.GetSender() != prevMeta.GetSender()) { + view.writeLineRight( + screen, meta.GetSender(), + x+usernameOffsetX, y+line, + view.widestSender, meta.GetSenderColor()) } prevMeta = meta } - view.writeLine(screen, text, x+messageOffsetX, y+line, tcell.ColorDefault) + view.writeLine(screen, text, x+messageOffsetX, y+line, meta.GetTextColor()) } }