Add support for editing messages
This commit is contained in:
@ -17,7 +17,6 @@
|
||||
package messages
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
@ -55,7 +54,7 @@ type UIMessage struct {
|
||||
IsHighlight bool
|
||||
IsService bool
|
||||
Edited bool
|
||||
Source json.RawMessage
|
||||
Event *event.Event
|
||||
ReplyTo *UIMessage
|
||||
Renderer MessageRenderer
|
||||
}
|
||||
@ -82,7 +81,7 @@ func newUIMessage(evt *event.Event, displayname string, renderer MessageRenderer
|
||||
IsHighlight: false,
|
||||
IsService: false,
|
||||
Edited: len(evt.Gomuks.Edits) > 0,
|
||||
Source: evt.Content.VeryRaw,
|
||||
Event: evt,
|
||||
Renderer: renderer,
|
||||
}
|
||||
}
|
||||
|
@ -128,6 +128,7 @@ func ParseMessage(matrix ifc.MatrixContainer, room *rooms.Room, evt *event.Event
|
||||
evt.Content.RemoveReplyFallback()
|
||||
}
|
||||
if len(evt.Gomuks.Edits) > 0 {
|
||||
evt = evt.SomewhatDangerousCopy()
|
||||
evt.Content = *evt.Gomuks.Edits[len(evt.Gomuks.Edits)-1].Content.NewContent
|
||||
}
|
||||
switch evt.Content.MsgType {
|
||||
|
@ -67,6 +67,9 @@ type RoomView struct {
|
||||
|
||||
typing []string
|
||||
|
||||
editing *event.Event
|
||||
editMoveText string
|
||||
|
||||
completions struct {
|
||||
list []string
|
||||
textCache string
|
||||
@ -107,7 +110,9 @@ func NewRoomView(parent *MainView, room *rooms.Room) *RoomView {
|
||||
SetBackgroundColor(tcell.ColorDefault).
|
||||
SetPlaceholder("Send a message...").
|
||||
SetPlaceholderTextColor(tcell.ColorGray).
|
||||
SetTabCompleteFunc(view.InputTabComplete)
|
||||
SetTabCompleteFunc(view.InputTabComplete).
|
||||
SetPressKeyUpAtStartFunc(view.EditPrevious).
|
||||
SetPressKeyDownAtEndFunc(view.EditNext)
|
||||
|
||||
view.topic.
|
||||
SetTextColor(tcell.ColorWhite).
|
||||
@ -149,8 +154,12 @@ func (view *RoomView) Blur() {
|
||||
func (view *RoomView) GetStatus() string {
|
||||
var buf strings.Builder
|
||||
|
||||
if view.editing != nil {
|
||||
buf.WriteString("Editing message - ")
|
||||
}
|
||||
|
||||
if len(view.completions.list) > 0 {
|
||||
if view.completions.textCache != view.input.GetText() || view.completions.time.Add(10 * time.Second).Before(time.Now()) {
|
||||
if view.completions.textCache != view.input.GetText() || view.completions.time.Add(10*time.Second).Before(time.Now()) {
|
||||
view.completions.list = []string{}
|
||||
} else {
|
||||
buf.WriteString(strings.Join(view.completions.list, ", "))
|
||||
@ -354,6 +363,61 @@ func (view *RoomView) autocompleteEmoji(word string) (completions []string) {
|
||||
return
|
||||
}
|
||||
|
||||
func (view *RoomView) SetEditing(evt *event.Event) {
|
||||
if evt == nil {
|
||||
view.editing = nil
|
||||
view.SetInputText(view.editMoveText)
|
||||
view.editMoveText = ""
|
||||
} else {
|
||||
if view.editing == nil {
|
||||
view.editMoveText = view.GetInputText()
|
||||
}
|
||||
view.editing = evt
|
||||
view.SetInputText(view.editing.Content.Body)
|
||||
}
|
||||
view.status.SetText(view.GetStatus())
|
||||
}
|
||||
|
||||
func (view *RoomView) EditNext() {
|
||||
if view.editing == nil {
|
||||
return
|
||||
}
|
||||
var foundEvent *event.Event
|
||||
currentFound := view.editing == nil
|
||||
self := view.parent.matrix.Client().UserID
|
||||
for _, msg := range view.MessageView().messages {
|
||||
if currentFound {
|
||||
if msg.SenderID == self {
|
||||
foundEvent = msg.Event
|
||||
break
|
||||
}
|
||||
} else if msg.EventID == view.editing.ID {
|
||||
currentFound = true
|
||||
}
|
||||
}
|
||||
view.SetEditing(foundEvent)
|
||||
}
|
||||
|
||||
func (view *RoomView) EditPrevious() {
|
||||
var foundEvent *event.Event
|
||||
currentFound := view.editing == nil
|
||||
self := view.parent.matrix.Client().UserID
|
||||
msgs := view.MessageView().messages
|
||||
for i := len(msgs) - 1; i >= 0; i-- {
|
||||
if currentFound {
|
||||
if msgs[i].SenderID == self {
|
||||
foundEvent = msgs[i].Event
|
||||
break
|
||||
}
|
||||
} else if msgs[i].EventID == view.editing.ID {
|
||||
currentFound = true
|
||||
}
|
||||
}
|
||||
if foundEvent != nil {
|
||||
view.SetEditing(foundEvent)
|
||||
}
|
||||
}
|
||||
|
||||
func (view *RoomView) InputTabComplete(text string, cursorOffset int) {
|
||||
debug.Print("Tab completing", cursorOffset, text)
|
||||
str := runewidth.Truncate(text, cursorOffset, "")
|
||||
@ -396,11 +460,12 @@ func (view *RoomView) InputTabComplete(text string, cursorOffset int) {
|
||||
func (view *RoomView) InputSubmit(text string) {
|
||||
if len(text) == 0 {
|
||||
return
|
||||
} else if cmd := view.parent.cmdProcessor.ParseCommand(view, text); cmd != nil {
|
||||
} else if cmd := view.parent.cmdProcessor.ParseCommand(view, text); view.editing == nil && cmd != nil {
|
||||
go view.parent.cmdProcessor.HandleCommand(cmd)
|
||||
} else {
|
||||
go view.SendMessage(mautrix.MsgText, text)
|
||||
}
|
||||
view.editMoveText = ""
|
||||
view.SetInputText("")
|
||||
}
|
||||
|
||||
@ -410,9 +475,11 @@ func (view *RoomView) SendMessage(msgtype mautrix.MessageType, text string) {
|
||||
if !view.config.Preferences.DisableEmojis {
|
||||
text = emoji.Sprint(text)
|
||||
}
|
||||
evt := view.parent.matrix.PrepareMarkdownMessage(view.Room.ID, msgtype, text)
|
||||
evt := view.parent.matrix.PrepareMarkdownMessage(view.Room.ID, msgtype, text, view.editing)
|
||||
msg := view.parseEvent(evt)
|
||||
view.content.AddMessage(msg, AppendMessage)
|
||||
view.editing = nil
|
||||
view.status.SetText(view.GetStatus())
|
||||
eventID, err := view.parent.matrix.SendEvent(evt)
|
||||
if err != nil {
|
||||
msg.State = event.StateSendFail
|
||||
|
Reference in New Issue
Block a user