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 )