1
0
Fork 0
mirror of https://github.com/diamondburned/cchat-gtk.git synced 2024-09-28 04:58:50 +00:00
cchat-gtk/internal/ui/service/service.go

145 lines
3.4 KiB
Go
Raw Normal View History

2020-05-26 06:51:06 +00:00
package service
import (
"github.com/diamondburned/cchat"
2020-06-07 04:27:28 +00:00
"github.com/diamondburned/cchat-gtk/internal/keyring"
2020-05-28 19:26:55 +00:00
"github.com/diamondburned/cchat-gtk/internal/ui/primitives"
2020-06-06 00:47:28 +00:00
"github.com/diamondburned/cchat-gtk/internal/ui/service/breadcrumb"
2020-05-26 06:51:06 +00:00
"github.com/diamondburned/cchat-gtk/internal/ui/service/session"
2020-06-07 04:27:28 +00:00
"github.com/diamondburned/cchat-gtk/internal/ui/service/session/server"
2020-05-26 06:51:06 +00:00
"github.com/gotk3/gotk3/gtk"
)
2020-06-04 23:00:41 +00:00
type Controller interface {
session.Controller
2020-06-07 04:27:28 +00:00
// MessageRowSelected is wrapped around session's MessageRowSelected.
MessageRowSelected(*session.Row, *server.Row, cchat.ServerMessage)
// AuthenticateSession is called to spawn the authentication dialog.
2020-06-04 23:00:41 +00:00
AuthenticateSession(*Container, cchat.Service)
2020-06-07 04:27:28 +00:00
// SaveAllSessions is called to save all available sessions from the menu.
SaveAllSessions(*Container)
2020-06-04 23:00:41 +00:00
}
2020-05-26 06:51:06 +00:00
type View struct {
*gtk.ScrolledWindow
Box *gtk.Box
Services []*Container
}
func NewView() *View {
box, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 0)
box.Show()
2020-05-28 19:26:55 +00:00
primitives.AddClass(box, "services")
2020-05-26 06:51:06 +00:00
sw, _ := gtk.ScrolledWindowNew(nil, nil)
2020-05-28 19:26:55 +00:00
sw.SetPolicy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
2020-05-26 06:51:06 +00:00
sw.Add(box)
2020-05-28 19:26:55 +00:00
sw.Show()
2020-05-26 06:51:06 +00:00
return &View{
sw,
box,
nil,
}
}
2020-06-04 23:00:41 +00:00
func (v *View) AddService(svc cchat.Service, ctrl Controller) *Container {
s := NewContainer(svc, ctrl)
2020-05-26 06:51:06 +00:00
v.Services = append(v.Services, s)
v.Box.Add(s)
2020-06-04 23:00:41 +00:00
return s
2020-05-26 06:51:06 +00:00
}
type Container struct {
*gtk.Box
2020-06-07 04:27:28 +00:00
Service cchat.Service
2020-05-26 06:51:06 +00:00
header *header
revealer *gtk.Revealer
children *children
2020-06-07 04:27:28 +00:00
// Embed controller and extend it to override RestoreSession.
Controller
2020-05-26 06:51:06 +00:00
}
2020-06-04 23:00:41 +00:00
func NewContainer(svc cchat.Service, ctrl Controller) *Container {
2020-05-26 06:51:06 +00:00
children := newChildren()
2020-05-28 19:26:55 +00:00
2020-05-26 06:51:06 +00:00
chrev, _ := gtk.RevealerNew()
2020-06-04 23:00:41 +00:00
chrev.SetRevealChild(true)
2020-05-26 06:51:06 +00:00
chrev.Add(children)
2020-05-28 19:26:55 +00:00
chrev.Show()
2020-05-26 06:51:06 +00:00
2020-06-04 23:00:41 +00:00
header := newHeader(svc)
header.reveal.SetActive(chrev.GetRevealChild())
2020-05-26 06:51:06 +00:00
box, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 0)
box.Show()
box.PackStart(header, false, false, 0)
box.PackStart(chrev, false, false, 0)
2020-05-28 19:26:55 +00:00
primitives.AddClass(box, "service")
2020-05-26 06:51:06 +00:00
2020-06-07 04:27:28 +00:00
container := &Container{
Box: box,
Service: svc,
header: header,
revealer: chrev,
children: children,
Controller: ctrl,
}
2020-05-28 19:26:55 +00:00
// On click, toggle reveal.
header.reveal.Connect("clicked", func() {
revealed := !chrev.GetRevealChild()
chrev.SetRevealChild(revealed)
header.reveal.SetActive(revealed)
})
// On click, show the auth dialog.
2020-05-26 06:51:06 +00:00
header.add.Connect("clicked", func() {
2020-06-04 23:00:41 +00:00
ctrl.AuthenticateSession(container, svc)
2020-05-26 06:51:06 +00:00
})
2020-06-07 04:27:28 +00:00
// Make menu items.
primitives.AppendMenuItems(header.Menu, []primitives.MenuItem{
{Name: "Save Sessions", Fn: func() {
ctrl.SaveAllSessions(container)
}},
})
2020-05-26 06:51:06 +00:00
return container
}
2020-06-07 04:27:28 +00:00
func (c *Container) AddSession(ses cchat.Session) *session.Row {
srow := session.New(c, ses, c)
c.children.addSessionRow(ses.ID(), srow)
2020-05-26 06:51:06 +00:00
2020-06-07 04:27:28 +00:00
return srow
2020-06-04 23:00:41 +00:00
}
2020-06-07 04:27:28 +00:00
func (c *Container) AddLoadingSession(id, name string) *session.Row {
srow := session.NewLoading(c, name, c)
c.children.addSessionRow(id, srow)
2020-06-06 00:47:28 +00:00
2020-06-07 04:27:28 +00:00
return srow
2020-05-26 06:51:06 +00:00
}
2020-06-07 04:27:28 +00:00
// KeyringSessions returns all known keyring sessions. Sessions that can't be
// saved will not be in the slice.
func (c *Container) KeyringSessions() []keyring.Session {
var ksessions = make([]keyring.Session, 0, len(c.children.Sessions))
for _, s := range c.children.Sessions {
if k := s.KeyringSession(); k != nil {
ksessions = append(ksessions, *k)
2020-06-06 07:44:36 +00:00
}
}
2020-06-07 04:27:28 +00:00
return ksessions
2020-05-26 06:51:06 +00:00
}
2020-06-07 04:27:28 +00:00
func (c *Container) Breadcrumb() breadcrumb.Breadcrumb {
return breadcrumb.Try(nil, c.header.reveal.GetText())
2020-05-26 06:51:06 +00:00
}