From d060d10615434c557373ee00ba009cc8b583e881 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 14 Apr 2018 15:33:20 +0300 Subject: Allow clicking names to mention them --- ui/message-view.go | 70 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 15 deletions(-) (limited to 'ui/message-view.go') diff --git a/ui/message-view.go b/ui/message-view.go index 9216aed..80add59 100644 --- a/ui/message-view.go +++ b/ui/message-view.go @@ -22,19 +22,21 @@ import ( "math" "os" - "maunium.net/go/gomuks/lib/open" - "maunium.net/go/gomuks/ui/messages/tstring" - "maunium.net/go/tcell" "maunium.net/go/gomuks/debug" "maunium.net/go/gomuks/interface" + "maunium.net/go/gomuks/lib/open" "maunium.net/go/gomuks/ui/messages" + "maunium.net/go/gomuks/ui/messages/tstring" "maunium.net/go/gomuks/ui/widget" + "maunium.net/go/tcell" "maunium.net/go/tview" ) type MessageView struct { *tview.Box + parent *RoomView + ScrollOffset int MaxSenderWidth int DateFormat string @@ -54,9 +56,11 @@ type MessageView struct { metaBuffer []ifc.MessageMeta } -func NewMessageView() *MessageView { +func NewMessageView(parent *RoomView) *MessageView { return &MessageView{ - Box: tview.NewBox(), + Box: tview.NewBox(), + parent: parent, + MaxSenderWidth: 15, TimestampWidth: len(messages.TimeFormat), ScrollOffset: 0, @@ -253,28 +257,64 @@ func (view *MessageView) recalculateBuffers() { } } -func (view *MessageView) HandleClick(x, y int, button tcell.ButtonMask) { +func (view *MessageView) HandleClick(x, y int, button tcell.ButtonMask) bool { if button != tcell.Button1 { - return + return false } _, _, _, height := view.GetRect() line := view.TotalHeight() - view.ScrollOffset - height + y if line < 0 || line >= view.TotalHeight() { - return + return false } message := view.metaBuffer[line] - imageMessage, ok := message.(*messages.ImageMessage) - if !ok { + var prevMessage ifc.MessageMeta + if line > 0 { + prevMessage = view.metaBuffer[line-1] + } + + usernameX := view.TimestampWidth + TimestampSenderGap + messageX := usernameX + view.widestSender + SenderMessageGap + if x >= messageX { + switch message := message.(type) { + case *messages.ImageMessage: + open.Open(message.Path()) + case messages.UIMessage: + debug.Print("Message clicked:", message.NotificationContent()) + } + } else if x >= usernameX { uiMessage, ok := message.(messages.UIMessage) - if ok { - debug.Print("Message clicked:", uiMessage.NotificationContent()) + if !ok { + return false + } + + prevUIMessage, _ := prevMessage.(messages.UIMessage) + if prevUIMessage != nil && prevUIMessage.Sender() == uiMessage.Sender() { + return false + } + + sender := []rune(uiMessage.Sender()) + if len(sender) == 0 { + return false } - return - } - open.Open(imageMessage.Path()) + cursorPos := view.parent.input.GetCursorOffset() + text := []rune(view.parent.input.GetText()) + var newText []rune + if cursorPos == 0 { + newText = append(sender, ':', ' ') + newText = append(newText, text...) + } else { + newText = append(text[0:cursorPos], sender...) + newText = append(newText, ' ') + newText = append(newText, text[cursorPos:]...) + } + view.parent.input.SetText(string(newText)) + view.parent.input.SetCursorOffset(cursorPos + len(newText) - len(text)) + return true + } + return false } const PaddingAtTop = 5 -- cgit v1.2.3