cchat-gtk/internal/ui/messages/container/compact/compact.go

70 lines
1.7 KiB
Go

package compact
import (
"github.com/diamondburned/cchat"
"github.com/diamondburned/cchat-gtk/internal/gts"
"github.com/diamondburned/cchat-gtk/internal/ui/messages/container"
"github.com/diamondburned/cchat-gtk/internal/ui/messages/message"
"github.com/diamondburned/cchat-gtk/internal/ui/primitives"
"github.com/gotk3/gotk3/gtk"
)
type Container struct {
*container.ListContainer
sg SizeGroups
}
type SizeGroups struct {
Timestamp *gtk.SizeGroup
Username *gtk.SizeGroup
}
func NewSizeGroups() SizeGroups {
sg1, _ := gtk.SizeGroupNew(gtk.SIZE_GROUP_HORIZONTAL)
sg2, _ := gtk.SizeGroupNew(gtk.SIZE_GROUP_HORIZONTAL)
return SizeGroups{sg1, sg2}
}
func (sgs *SizeGroups) Add(msg Message) {
sgs.Timestamp.AddWidget(msg.Timestamp)
sgs.Username.AddWidget(msg.Username)
}
var _ container.Container = (*Container)(nil)
func NewContainer(ctrl container.Controller) *Container {
c := container.NewListContainer(ctrl)
primitives.AddClass(c, "compact-container")
return &Container{c, NewSizeGroups()}
}
func (c *Container) NewPresendMessage(state *message.PresendState) container.PresendMessageRow {
msg := WrapPresendMessage(state)
c.sg.Add(msg.Message)
c.addMessage(msg)
return msg
}
func (c *Container) CreateMessage(msg cchat.MessageCreate) {
gts.ExecAsync(func() {
msg := WrapMessage(message.NewState(msg))
c.sg.Add(msg)
c.addMessage(msg)
c.CleanMessages()
})
}
func (c *Container) addMessage(msg container.MessageRow) {
_, at := container.InsertPosition(c, msg.Unwrap().Time)
c.AddMessageAt(msg, at)
}
func (c *Container) UpdateMessage(msg cchat.MessageUpdate) {
gts.ExecAsync(func() { container.UpdateMessage(c, msg) })
}
func (c *Container) DeleteMessage(msg cchat.MessageDelete) {
gts.ExecAsync(func() { c.PopMessage(msg.ID()) })
}