aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ui/types/message.go24
-rw-r--r--ui/types/meta.go59
-rw-r--r--ui/widget/message-view.go32
3 files changed, 98 insertions, 17 deletions
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 <http://www.gnu.org/licenses/>.
+
+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())
}
}