118 lines
2.1 KiB
Go
118 lines
2.1 KiB
Go
package server
|
|
|
|
import (
|
|
"github.com/diamondburned/cchat"
|
|
"github.com/diamondburned/cchat-gtk/internal/gts"
|
|
"github.com/diamondburned/cchat-gtk/internal/log"
|
|
"github.com/gotk3/gotk3/gtk"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type Row struct {
|
|
*gtk.Box
|
|
Button *gtk.Button
|
|
Server cchat.Server
|
|
|
|
// enum 1
|
|
clicked func(*Row)
|
|
message cchat.ServerMessage
|
|
|
|
// enum 2
|
|
children *Children
|
|
}
|
|
|
|
func New(server cchat.Server) *Row {
|
|
name, err := server.Name()
|
|
if err != nil {
|
|
log.Error(errors.Wrap(err, "Failed to get the server name"))
|
|
name = "no name"
|
|
}
|
|
|
|
box, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0)
|
|
box.Show()
|
|
|
|
button, _ := gtk.ButtonNew()
|
|
button.Show()
|
|
button.SetRelief(gtk.RELIEF_NONE)
|
|
button.SetLabel(name)
|
|
|
|
// TODO: images
|
|
|
|
var row = &Row{
|
|
Box: box,
|
|
Button: button,
|
|
Server: server,
|
|
}
|
|
button.Connect("clicked", row.onClick)
|
|
|
|
switch server := server.(type) {
|
|
case cchat.ServerList:
|
|
row.children = NewChildren(server)
|
|
case cchat.ServerMessage:
|
|
row.message = server
|
|
}
|
|
|
|
return row
|
|
}
|
|
|
|
// SetOnClick sets the callback when the server is clicked. This only works if
|
|
// the passed in server implements ServerMessage.
|
|
func (row *Row) SetOnClick(clicked func(*Row)) {
|
|
if row.message != nil {
|
|
row.clicked = clicked
|
|
}
|
|
}
|
|
|
|
func (row *Row) onClick() {
|
|
switch {
|
|
case row.message != nil:
|
|
row.clicked(row)
|
|
case row.children != nil:
|
|
row.children.SetRevealChild(!row.children.GetRevealChild())
|
|
}
|
|
}
|
|
|
|
type Children struct {
|
|
*gtk.Revealer
|
|
Main *gtk.Box
|
|
Rows []*Row
|
|
List cchat.ServerList
|
|
}
|
|
|
|
func NewChildren(list cchat.ServerList) *Children {
|
|
rev, _ := gtk.RevealerNew()
|
|
rev.Show()
|
|
rev.SetRevealChild(false)
|
|
|
|
main, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0)
|
|
main.Show()
|
|
|
|
children := &Children{
|
|
Revealer: rev,
|
|
Main: main,
|
|
List: list,
|
|
}
|
|
|
|
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 {
|
|
row := New(server)
|
|
c.Rows[i] = row
|
|
c.Main.Add(row)
|
|
}
|
|
})
|
|
}
|