From 2cc9053e108a649a302f5ecf0306b682d820d4e1 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Mon, 20 Jun 2022 18:26:58 -0230 Subject: use gio for ui --- main.go | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 136 insertions(+), 4 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index be07b1b..d29fbc4 100644 --- a/main.go +++ b/main.go @@ -1,8 +1,18 @@ package main import ( - "fmt" + "golang.org/x/exp/slices" + "log" "os" + + "gioui.org/app" + "gioui.org/font/gofont" + "gioui.org/io/system" + "gioui.org/layout" + "gioui.org/op" + "gioui.org/unit" + "gioui.org/widget" + "gioui.org/widget/material" ) const ( @@ -11,9 +21,131 @@ const ( ) func main() { - _, err := NewApp() + state, err := NewApp() if err != nil { - fmt.Println(err) - os.Exit(1) + log.Fatal(err) + } + + go func() { + w := app.NewWindow( + app.Title("Volute"), + ) + if err := run(state, w); err != nil { + log.Fatal(err) + } + os.Exit(0) + }() + app.Main() +} + +func run(s App, w *app.Window) error { + var ops op.Ops + + th := material.NewTheme(gofont.Collection()) + inset := layout.UniformInset(unit.Dp(2)) + + displacement := NewFloat(th) + displacement.Set(2000.0) + + var rpm []Int + rpm = append(rpm, NewInt(th)) + rpm[0].Set(2000) + var rpmList = layout.List{Axis: layout.Horizontal} + + var duplicateButton []widget.Clickable + duplicateButton = append(duplicateButton, widget.Clickable{}) + var duplicateButtonList = layout.List{Axis: layout.Horizontal} + + var deleteButton []widget.Clickable + deleteButton = append(deleteButton, widget.Clickable{}) + var deleteButtonList = layout.List{Axis: layout.Horizontal} + + for { + e := <-w.Events() + switch e := e.(type) { + case system.DestroyEvent: + return e.Err + case system.FrameEvent: + gtx := layout.NewContext(&ops, e) + + for i := range rpm { + if duplicateButton[i].Clicked() { + rpm = slices.Insert(rpm, i, rpm[i]) + duplicateButton = slices.Insert( + duplicateButton, + i, + duplicateButton[i], + ) + deleteButton = slices.Insert( + deleteButton, + i, + deleteButton[i], + ) + break + } + if deleteButton[i].Clicked() && len(rpm) > 1 { + rpm = slices.Delete(rpm, i, i+1) + duplicateButton = slices.Delete(duplicateButton, i, i+1) + deleteButton = slices.Delete(deleteButton, i, i+1) + break + } + } + + layout.Flex{ + Axis: layout.Vertical, + }.Layout(gtx, + // Displacement + layout.Rigid( + func(gtx layout.Context) layout.Dimensions { + return inset.Layout(gtx, + func(gtx layout.Context) layout.Dimensions { + return displacement.Layout(gtx) + }, + ) + }, + ), + // Rpm + layout.Rigid( + func(gtx layout.Context) layout.Dimensions { + return rpmList.Layout(gtx, + len(rpm), + func(gtx layout.Context, index int) layout.Dimensions { + return inset.Layout(gtx, + func(gtx layout.Context) layout.Dimensions { + return rpm[index].Layout(gtx) + }, + ) + }, + ) + }, + ), + // Duplicate + layout.Rigid( + func(gtx layout.Context) layout.Dimensions { + return duplicateButtonList.Layout(gtx, + len(duplicateButton), + func(gtx layout.Context, i int) layout.Dimensions { + return material.Button(th, &duplicateButton[i], "Duplicate"). + Layout(gtx) + }, + ) + }, + ), + // Delete + layout.Rigid( + func(gtx layout.Context) layout.Dimensions { + return deleteButtonList.Layout(gtx, + len(deleteButton), + func(gtx layout.Context, i int) layout.Dimensions { + return material.Button(th, &deleteButton[i], "Delete"). + Layout(gtx) + }, + ) + }, + ), + ) + + e.Frame(gtx.Ops) + } } } -- cgit v1.2.3