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)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|