package main import ( "log" "reflect" "gioui.org/app" "gioui.org/font/gofont" "gioui.org/io/system" "gioui.org/op" "gioui.org/unit" "gioui.org/widget" "gioui.org/widget/material" ) type LimoxState uint8 const ( Disconnected LimoxState = iota Connecting Connected ) type Limox struct { JidEditor widget.Editor PwdEditor widget.Editor MainButton widget.Clickable XmppEvents chan any GuiEvents chan GuiEvent State LimoxState Window *app.Window Operations op.Ops Theme *material.Theme } func NewLimox() Limox { return Limox{ Window: app.NewWindow( app.Title("LimoX"), app.Size(unit.Dp(400), unit.Dp(600)), ), Operations: op.Ops{}, Theme: material.NewTheme(gofont.Collection()), XmppEvents: make(chan any), GuiEvents: make(chan GuiEvent), State: Disconnected, } } func (l *Limox) run() error { for { select { case e := <-l.Window.Events(): switch e := e.(type) { case system.DestroyEvent: return e.Err case system.FrameEvent: if l.MainButton.Clicked() { l.buttonCallback() } l.draw(e) } case ev := <-l.XmppEvents: switch ev.(type) { case error: log.Print(ev) l.State = Disconnected case XmppEvent: switch ev { case XmppDisconnect: l.State = Disconnected case XmppConnect: l.State = Connected default: log.Fatalf("Unknown XmppEvent '%d'\n", ev) } default: log.Fatalf("Unknown event type '%s'.\n", reflect.TypeOf(ev)) } l.Window.Invalidate() } } } func (l *Limox) buttonCallback() { switch l.State { case Disconnected: log.Println("Starting connection establishment ...") go l.xmpp(l.JidEditor.Text(), l.PwdEditor.Text()) l.State = Connecting case Connecting: log.Println("Aborted connection establishment") l.State = Disconnected case Connected: log.Println("Disconnecting ...") l.GuiEvents <- Disconnect l.State = Disconnected } }