morpheus

A Matrix client written in Go-QT
git clone git://archive.git.mtrnord.blog/Nordgedanken/morpheus.git
Log | Files | Refs | README | LICENSE

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 }