package ui import ( "time" "opslag.de/schobers/geom" ) // Run runs the application loop. func Run(r Renderer, s *Style, view Control) error { return RunWait(r, s, view, false) } // RunWait runs the application loop and conditionally waits on events before rendering. func RunWait(r Renderer, s *Style, view Control, wait bool) error { ctx := newContext(r, s, view) defer ctx.Destroy() root, ok := view.(RootControl) if ok { err := root.Init(ctx) if err != nil { return err } } anim := time.NewTicker(30 * time.Millisecond) go func() { for { select { case <-anim.C: case <-ctx.quit: return } if ctx.animate { r.Refresh() } ctx.animate = false } }() defer anim.Stop() ctx.Renderer().Refresh() for !ctx.HasQuit() { var size = r.Size() var bounds = geom.RectF32(0, 0, size.X, size.Y) view.Arrange(ctx, bounds, geom.ZeroPtF32, nil) view.Render(ctx) if ctx.HasQuit() { return nil } r.PushEvents(ctx, wait) } return nil }