package main import ( "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 ( gasConstant = 8.314472 airMolarMass = 0.0289647 // kg/mol ) func main() { state, err := NewApp() if err != nil { 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) } } }