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 := &context{r: r, style: s, view: view, ims: NewImages()} root, ok := view.(RootControl) if ok { root.Init(ctx) } anim := time.NewTicker(30 * time.Millisecond) go func() { for range anim.C { if ctx.animate && !ctx.quit { r.Refresh() } ctx.animate = false } }() ctx.Renderer().Refresh() for !ctx.quit { var size = r.Size() var bounds = geom.RectF32(0, 0, size.X, size.Y) view.Arrange(ctx, bounds, geom.ZeroPtF32) view.Render(ctx) if ctx.quit { return nil } r.PushEvents(ctx, wait) } anim.Stop() return nil }