cchat-gtk/internal/ui/service/session/server/server.go

134 lines
2.5 KiB
Go
Raw Normal View History

2020-05-26 06:51:06 +00:00
package server
import (
"github.com/diamondburned/cchat"
"github.com/diamondburned/cchat-gtk/internal/gts"
"github.com/diamondburned/cchat-gtk/internal/log"
2020-05-28 19:26:55 +00:00
"github.com/diamondburned/cchat-gtk/internal/ui/primitives"
2020-05-26 06:51:06 +00:00
"github.com/gotk3/gotk3/gtk"
"github.com/pkg/errors"
)
2020-05-28 19:26:55 +00:00
const ChildrenMargin = 24
type RowController interface {
MessageRowSelected(*Row, cchat.ServerMessage)
}
2020-05-26 06:51:06 +00:00
type Row struct {
*gtk.Box
Button *gtk.Button
Server cchat.Server
2020-05-28 19:26:55 +00:00
ctrl RowController
2020-05-26 06:51:06 +00:00
// enum 1
message cchat.ServerMessage
// enum 2
children *Children
}
2020-05-28 19:26:55 +00:00
func New(server cchat.Server, ctrl RowController) *Row {
2020-05-26 06:51:06 +00:00
name, err := server.Name()
if err != nil {
log.Error(errors.Wrap(err, "Failed to get the server name"))
name = "no name"
}
2020-05-28 19:26:55 +00:00
button, _ := gtk.ButtonNewWithLabel(name)
primitives.BinLeftAlignLabel(button)
2020-05-26 06:51:06 +00:00
button.SetRelief(gtk.RELIEF_NONE)
2020-05-28 19:26:55 +00:00
button.Show()
box, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 0)
box.PackStart(button, false, false, 0)
box.Show()
primitives.AddClass(box, "server")
2020-05-26 06:51:06 +00:00
// TODO: images
var row = &Row{
Box: box,
Button: button,
Server: server,
2020-05-28 19:26:55 +00:00
ctrl: ctrl,
2020-05-26 06:51:06 +00:00
}
button.Connect("clicked", row.onClick)
switch server := server.(type) {
case cchat.ServerList:
2020-05-28 19:26:55 +00:00
row.children = NewChildren(server, ctrl)
box.PackStart(row.children, false, false, 0)
primitives.AddClass(box, "server-list")
2020-05-26 06:51:06 +00:00
case cchat.ServerMessage:
row.message = server
2020-05-28 19:26:55 +00:00
primitives.AddClass(box, "server-message")
2020-05-26 06:51:06 +00:00
}
return row
}
func (row *Row) onClick() {
switch {
case row.message != nil:
2020-05-28 19:26:55 +00:00
row.ctrl.MessageRowSelected(row, row.message)
2020-05-26 06:51:06 +00:00
case row.children != nil:
row.children.SetRevealChild(!row.children.GetRevealChild())
}
}
type Children struct {
*gtk.Revealer
Main *gtk.Box
List cchat.ServerList
2020-05-28 19:26:55 +00:00
Rows []*Row
rowctrl RowController
2020-05-26 06:51:06 +00:00
}
2020-05-28 19:26:55 +00:00
func NewChildren(list cchat.ServerList, ctrl RowController) *Children {
main, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 0)
main.SetMarginStart(ChildrenMargin)
main.Show()
2020-05-26 06:51:06 +00:00
rev, _ := gtk.RevealerNew()
rev.SetRevealChild(false)
2020-05-28 19:26:55 +00:00
rev.Add(main)
rev.Show()
2020-05-26 06:51:06 +00:00
children := &Children{
Revealer: rev,
Main: main,
List: list,
2020-05-28 19:26:55 +00:00
rowctrl: ctrl,
2020-05-26 06:51:06 +00:00
}
if err := list.Servers(children); err != nil {
log.Error(errors.Wrap(err, "Failed to get servers"))
}
return children
}
func (c *Children) SetServers(servers []cchat.Server) {
gts.ExecAsync(func() {
for _, row := range c.Rows {
c.Main.Remove(row)
}
c.Rows = make([]*Row, len(servers))
for i, server := range servers {
2020-05-28 19:26:55 +00:00
row := New(server, c.rowctrl)
2020-05-26 06:51:06 +00:00
c.Rows[i] = row
c.Main.Add(row)
}
})
}