zntg/ui/ui.go

47 lines
950 B
Go

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(r)}
root, ok := view.(RootControl)
if ok {
err := root.Init(ctx)
if err != nil {
return err
}
}
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, nil)
view.Render(ctx)
if ctx.quit {
return nil
}
r.PushEvents(ctx, wait)
}
anim.Stop()
return nil
}