101 lines
1.9 KiB
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
|
|
)
|