package main import ( "log" "gioui.org/app" "gioui.org/io/event" "gioui.org/op" "gioui.org/unit" "gioui.org/widget" "gioui.org/widget/material" "xengineering.eu/limox/xmpp" ) type LimoxState uint8 const ( Disconnected LimoxState = iota Connecting Connected ) type Limox struct { JidEditor widget.Editor PwdEditor widget.Editor MainButton widget.Clickable sessionIn chan<- any sessionOut chan any State LimoxState Window *app.Window Operations op.Ops Theme *material.Theme } func NewLimox() Limox { l := Limox{ Window: new(app.Window), Operations: op.Ops{}, Theme: material.NewTheme(), sessionOut: make(chan any), State: Disconnected, } l.Window.Option(app.Title("LimoX")) l.Window.Option(app.Size(unit.Dp(400), unit.Dp(600))) l.JidEditor.SetText(getLastJid()) l.PwdEditor.SetText(getLastPwd()) return l } func (l *Limox) run() error { c := make(chan event.Event) go func() { for { c <- l.Window.Event() } }() for { select { case e := <-c: switch e := e.(type) { case app.DestroyEvent: return e.Err case app.FrameEvent: l.draw(e) } case data := <-l.sessionOut: switch data.(type) { case xmpp.SessionDisconnect: l.State = Disconnected case xmpp.SessionConnect: l.State = Connected default: log.Printf("Unknown XMPP data '%d'\n", data) } l.Window.Invalidate() } } } func (l *Limox) buttonCallback() { c := l.sessionIn switch l.State { case Disconnected: jid := l.JidEditor.Text() pwd := l.PwdEditor.Text() setLastJid(jid) setLastPwd(pwd) l.sessionIn = xmpp.StartSession(l.sessionOut, jid, pwd) l.State = Connecting case Connecting: go func() { c <- xmpp.SessionShouldDisconnect{} }() l.State = Disconnected case Connected: go func() { c <- xmpp.SessionShouldDisconnect{} }() l.State = Disconnected } }