zntg/ui/ui.go
Sander Schobers 0f03760e66 Added Resize & SetIcon to Renderer.
Refactored Size (on Renderer) to return geom.Point instead of geom.PointF32.
Refactored Width and Height (on Texture) to return int instead of float32.

Refactored texture dimensions to be represented by ints instead of float32s.
2020-12-13 07:40:19 +01:00

68 lines
1.3 KiB
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 {
if s == nil {
s = DefaultStyle()
}
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()
overlays := ctx.Overlays()
ctx.Renderer().Refresh()
for !ctx.HasQuit() {
var size = r.Size()
var bounds = geom.RectF32(0, 0, float32(size.X), float32(size.Y))
overlays.Arrange(ctx, bounds, geom.ZeroPtF32, nil)
overlays.Render(ctx)
if ctx.HasQuit() {
return nil
}
tooltip := ctx.tooltip.Text
ctx.tooltip.Text = ""
if r.PushEvents(ctx, wait) {
if ctx.tooltip.Text != tooltip {
ctx.overlays.SetVisibility(uiDefaultTooltipOverlay, ctx.tooltip.Text != "")
}
} else {
ctx.tooltip.Text = tooltip
}
}
return nil
}