go-simple-ui/internal/app/app.go

101 lines
1.9 KiB
Go

package app
import (
"log"
"os"
"simple_ui/internal/components"
"simple_ui/internal/ui"
"gioui.org/app"
"gioui.org/layout"
"gioui.org/op"
"gioui.org/unit"
"gioui.org/widget"
"gioui.org/widget/material"
"golang.org/x/exp/shiny/materialdesign/icons"
)
func Run() {
go runApp()
app.Main()
}
func runApp() {
w := &app.Window{}
w.Option(
app.Title("Simple UI"),
app.Size(800, 600),
app.MinSize(400, 300),
)
err := runWindowEvents(w)
if err != nil {
log.Fatal(err)
}
os.Exit(0)
}
func runWindowEvents(window *app.Window) error {
theme := material.NewTheme()
var ops op.Ops
currentPage := HomePage
navMenu := components.NewNavigationMenu(theme)
homeIcon, err := widget.NewIcon(icons.ActionHome)
if err != nil {
log.Fatalf("failed to create home icon: %v", err)
}
aboutIcon, err := widget.NewIcon(icons.ActionInfo)
if err != nil {
log.Fatalf("failed to create about icon: %v", err)
}
navMenu.AddItem("Home", homeIcon, func() { currentPage = HomePage })
navMenu.AddItem("About", aboutIcon, func() { currentPage = AboutPage })
navMenu.SetSelected(int(currentPage))
pages := []ui.Page{
HomePage: ui.NewHomePage(theme),
AboutPage: ui.NewAboutPage(theme),
}
for {
switch e := window.Event().(type) {
case app.DestroyEvent:
return e.Err
case app.FrameEvent:
gtx := app.NewContext(&ops, e)
navMenu.HandleClicks(gtx)
navMenu.SetSelected(int(currentPage))
layout.Flex{
Axis: layout.Horizontal,
}.Layout(gtx,
layout.Rigid(func(gtx layout.Context) layout.Dimensions {
return navMenu.Layout(gtx)
}),
layout.Flexed(1, func(gtx layout.Context) layout.Dimensions {
return layout.Inset{
Top: unit.Dp(16),
Bottom: unit.Dp(16),
Left: unit.Dp(16),
Right: unit.Dp(16),
}.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
return pages[currentPage].Layout(gtx)
})
}),
)
e.Frame(gtx.Ops)
}
}
}
const (
HomePage = iota
AboutPage
)