bedrocktool/ui/gui.go

178 lines
3.9 KiB
Go
Raw Permalink Normal View History

2023-06-24 11:42:08 +00:00
//go:build gui
2023-03-06 14:50:36 +00:00
package ui
2023-03-05 21:50:58 +00:00
import (
"bufio"
2023-03-05 21:50:58 +00:00
"context"
2023-03-15 01:36:55 +00:00
"image/color"
"io"
2023-03-14 01:07:39 +00:00
"gioui.org/app"
"gioui.org/font/gofont"
"gioui.org/io/system"
"gioui.org/layout"
"gioui.org/op"
"gioui.org/widget/material"
2023-03-15 01:36:55 +00:00
"gioui.org/x/pref/theme"
2023-03-14 01:07:39 +00:00
"github.com/bedrock-tool/bedrocktool/ui/gui/pages"
2023-04-27 19:45:04 +00:00
"github.com/bedrock-tool/bedrocktool/ui/gui/pages/packs"
2023-03-14 01:07:39 +00:00
"github.com/bedrock-tool/bedrocktool/ui/gui/pages/settings"
2023-03-18 11:12:54 +00:00
"github.com/bedrock-tool/bedrocktool/ui/gui/pages/skins"
2023-05-04 14:00:51 +00:00
"github.com/bedrock-tool/bedrocktool/ui/gui/pages/update"
2023-03-14 01:07:39 +00:00
"github.com/bedrock-tool/bedrocktool/ui/gui/pages/worlds"
2023-03-18 11:12:54 +00:00
"github.com/bedrock-tool/bedrocktool/ui/messages"
2023-03-05 21:50:58 +00:00
"github.com/bedrock-tool/bedrocktool/utils"
2023-03-14 01:07:39 +00:00
"github.com/sirupsen/logrus"
2023-03-05 21:50:58 +00:00
)
type GUI struct {
utils.BaseUI
2023-03-05 21:50:58 +00:00
router pages.Router
cancel context.CancelFunc
authPopup bool
authPopupText string
2023-03-05 21:50:58 +00:00
}
func (g *GUI) Init() bool {
utils.Auth.LoginWithMicrosoftCallback = g.LoginWithMicrosoftCallback
return true
}
2023-03-15 01:36:55 +00:00
var paletteLight = material.Palette{
Bg: color.NRGBA{0xff, 0xff, 0xff, 0xff},
Fg: color.NRGBA{0x12, 0x12, 0x12, 0xff},
ContrastBg: color.NRGBA{0x7c, 0x00, 0xf8, 0xff},
ContrastFg: color.NRGBA{0x00, 0x00, 0x00, 0xff},
}
var paletteDark = material.Palette{
Bg: color.NRGBA{0x12, 0x12, 0x12, 0xff},
Fg: color.NRGBA{0xff, 0xff, 0xff, 0xff},
ContrastBg: color.NRGBA{0x7c, 0x00, 0xf8, 0xff},
ContrastFg: color.NRGBA{0xff, 0xff, 0xff, 0xff},
}
2023-03-15 13:51:31 +00:00
func (g *GUI) Start(ctx context.Context, cancel context.CancelFunc) (err error) {
g.cancel = cancel
w := app.NewWindow(
2023-05-05 17:52:18 +00:00
app.Title("Bedrocktool " + utils.Version),
2023-03-15 13:51:31 +00:00
)
2023-03-14 01:07:39 +00:00
th := material.NewTheme(gofont.Collection())
2023-03-15 01:36:55 +00:00
dark, err := theme.IsDarkMode()
if err != nil {
logrus.Warn(err)
}
if dark {
_th := th.WithPalette(paletteDark)
th = &_th
} else {
_th := th.WithPalette(paletteLight)
th = &_th
}
2023-03-15 13:51:31 +00:00
g.router = pages.NewRouter(ctx, w.Invalidate, th)
g.router.Register("Settings", settings.New(&g.router))
g.router.Register("worlds", worlds.New(&g.router))
2023-03-18 11:12:54 +00:00
g.router.Register("skins", skins.New(&g.router))
2023-04-27 19:45:04 +00:00
g.router.Register("packs", packs.New(&g.router))
2023-05-04 14:00:51 +00:00
g.router.Register("update", update.New(&g.router))
2023-03-15 13:51:31 +00:00
g.router.SwitchTo("Settings")
go func() {
app.Main()
}()
2023-05-05 17:52:18 +00:00
return g.run(w)
2023-03-15 13:51:31 +00:00
}
func (g *GUI) run(w *app.Window) error {
2023-03-14 01:07:39 +00:00
var ops op.Ops
for {
select {
case e := <-w.Events():
switch e := e.(type) {
case system.DestroyEvent:
2023-03-15 14:01:34 +00:00
logrus.Info("Closing")
g.cancel()
g.router.Wg.Wait()
2023-03-14 01:07:39 +00:00
return e.Err
case system.FrameEvent:
gtx := layout.NewContext(&ops, e)
layout.Stack{
Alignment: layout.Center,
}.Layout(gtx,
layout.Expanded(func(gtx layout.Context) layout.Dimensions {
return g.router.Layout(gtx, g.router.Theme)
}),
layout.Stacked(func(gtx layout.Context) layout.Dimensions {
if g.authPopup {
return g.AuthPopup(gtx)
}
return layout.Dimensions{}
}),
)
2023-03-14 01:07:39 +00:00
e.Frame(gtx.Ops)
}
case <-g.router.Ctx.Done():
logrus.Info("Closing")
g.cancel()
g.router.Wg.Wait()
return nil
}
}
2023-03-14 01:07:39 +00:00
}
2023-04-01 22:22:50 +00:00
func (g *GUI) Message(data interface{}) messages.MessageResponse {
r := g.router.Handler(data)
2023-03-14 01:07:39 +00:00
if r.Ok || r.Data != nil {
return r
}
2023-03-05 21:50:58 +00:00
2023-03-18 11:12:54 +00:00
r = messages.MessageResponse{
Ok: false,
Data: nil,
2023-03-05 21:50:58 +00:00
}
2023-04-01 22:22:50 +00:00
switch data.(type) {
case messages.CanShowImages:
r.Ok = true
}
return r
2023-03-05 21:50:58 +00:00
}
2023-03-06 14:50:36 +00:00
func (g *GUI) AuthPopup(gtx layout.Context) layout.Dimensions {
gtx.Constraints.Max = gtx.Constraints.Max.Div(2)
return layout.Center.Layout(gtx, material.Body1(g.router.Theme, g.authPopupText).Layout)
}
func (g *GUI) LoginWithMicrosoftCallback(r io.Reader) {
g.authPopup = true
b := bufio.NewReader(r)
for {
line, _, err := b.ReadLine()
if err != nil {
panic(err)
}
println(string(line))
g.authPopupText += string(line) + "\n"
g.router.Invalidate()
if string(line) == "Authentication successful." {
break
}
}
g.authPopup = false
}
2023-03-06 14:50:36 +00:00
func init() {
utils.MakeGui = func() utils.UI {
return &GUI{}
}
}