messageList.go (4570B)
1 package ui 2 3 import ( 4 "time" 5 6 "github.com/Nordgedanken/Morpheus/matrix" 7 "github.com/matrix-org/gomatrix" 8 "github.com/rhinoman/go-commonmark" 9 "github.com/therecipe/qt/core" 10 "github.com/therecipe/qt/uitools" 11 "github.com/therecipe/qt/widgets" 12 ) 13 14 //////////////////////////////////////////////////// 15 // // 16 // // 17 // // 18 // // 19 // DON'T TOUCH I HAVE NO IDEA WHY THIS EVEN WORKS // 20 // // 21 // // 22 // // 23 //////////////////////////////////////////////////// 24 25 // QVBoxLayoutWithTriggerSlot defines the QVBoxLayout with TriggerMessage slot to add messages to the View 26 type QVBoxLayoutWithTriggerSlot struct { 27 widgets.QVBoxLayout 28 29 _ func(messageBody, sender string, timestamp int64) `slot:"TriggerMessage"` 30 } 31 32 // NewMessageList generates a new QVBoxLayoutWithTriggerSlot and adds it to the message scrollArea 33 func NewMessageList(scrollArea *widgets.QScrollArea, messageView *widgets.QWidget) (messageViewLayout *QVBoxLayoutWithTriggerSlot) { 34 messageViewLayout = NewQVBoxLayoutWithTriggerSlot2(messageView) 35 36 messageViewLayout.SetSpacing(0) 37 messageViewLayout.SetContentsMargins(0, 0, 0, 0) 38 messageView.SetContentsMargins(0, 0, 0, 0) 39 scrollArea.SetWidget(messageView) 40 scrollArea.SetAlignment(core.Qt__AlignLeading | core.Qt__AlignLeft | core.Qt__AlignVCenter) 41 scrollArea.Widget().SetLayout(messageViewLayout) 42 43 return 44 } 45 46 // NewMessage adds a new message object to the view 47 func (messageViewLayout *QVBoxLayoutWithTriggerSlot) NewMessage(body string, cli *gomatrix.Client, sender string, timestamp int64, scrollArea *widgets.QScrollArea, own bool, mainUIStruct *MainUI) (err error) { 48 barAtBottom := false 49 bar := scrollArea.VerticalScrollBar() 50 if bar.Value() == bar.Maximum() { 51 barAtBottom = true 52 } 53 avatar, AvatarErr := matrix.GetUserAvatar(cli, sender, 61) 54 if err != nil { 55 err = AvatarErr 56 return 57 } 58 59 var widget = widgets.NewQWidget(nil, 0) 60 widgetThread := core.NewQThread(nil) 61 widget.MoveToThread(widgetThread) 62 widgetThread.Start() 63 64 var loader = uitools.NewQUiLoader(nil) 65 var file *core.QFile 66 if own { 67 file = core.NewQFile2(":/qml/ui/ownmessage.ui") 68 } else { 69 file = core.NewQFile2(":/qml/ui/message.ui") 70 } 71 72 file.Open(core.QIODevice__ReadOnly) 73 var wrapperWidget = loader.Load(file, widget) 74 file.Close() 75 76 timestampFormat := time.Unix(0, int64(timestamp)*int64(time.Millisecond)) 77 timestampString := timestampFormat.Format("15:04:05 - Mon 2.01.2006") 78 79 messageWidget := widgets.NewQWidgetFromPointer(widget.FindChild("message", core.Qt__FindChildrenRecursively).Pointer()) 80 messageWidgetThread := core.NewQThread(nil) 81 messageWidget.MoveToThread(messageWidgetThread) 82 messageWidgetThread.Start() 83 avatarLogo := widgets.NewQLabelFromPointer(widget.FindChild("avatar", core.Qt__FindChildrenRecursively).Pointer()) 84 messageContent := widgets.NewQLabelFromPointer(widget.FindChild("messageContent", core.Qt__FindChildrenRecursively).Pointer()) 85 timestampContent := widgets.NewQLabelFromPointer(widget.FindChild("timestamp", core.Qt__FindChildrenRecursively).Pointer()) 86 senderContent := widgets.NewQLabelFromPointer(widget.FindChild("sender", core.Qt__FindChildrenRecursively).Pointer()) 87 88 markdownMessage := commonmark.Md2Html(body, 0) 89 90 messageContent.SetText(markdownMessage) 91 92 senderDisplayNameResp, _ := cli.GetDisplayName(sender) 93 var senderDisplayName string 94 if senderDisplayNameResp == nil { 95 senderDisplayName = sender 96 } else if senderDisplayNameResp.DisplayName == "" { 97 senderDisplayName = sender 98 } else { 99 senderDisplayName = senderDisplayNameResp.DisplayName 100 } 101 senderContent.SetText(senderDisplayName) 102 timestampContent.SetText(timestampString) 103 avatarLogo.SetPixmap(avatar) 104 105 var lineLength int 106 lineLength = messageContent.FontMetrics().Width(messageContent.Text(), -1) - 87 107 if lineLength >= scrollArea.Widget().Size().Width() { 108 lineLength = scrollArea.Widget().Size().Width() - 20 - 87 109 } 110 111 messageContent.SetMinimumWidth(lineLength + 10) 112 113 messageWidget.SetMinimumWidth(lineLength) 114 messageWidget.Resize2(lineLength, wrapperWidget.Size().Height()) 115 116 messageViewLayout.SetSpacing(1) 117 messageViewLayout.SetContentsMargins(0, 0, 0, 0) 118 119 messageViewLayout.InsertWidget(messageViewLayout.Count()+1, messageWidget, 0, core.Qt__AlignBottom) 120 121 if barAtBottom { 122 bar.SetValue(bar.Maximum()) 123 } 124 125 return 126 }