Files
8bitMyGoUI/feedback/spinner.go
T

45 lines
1.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package feedback
import (
"github.com/egoist/mygo/ui"
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel"
)
type SpinnerOptions struct {
// Scale is 1–4; zero means 1.
Scale int
}
// ring is where the spinner's eight beads sit, by hand.
var ring = [8][2]int{{5, 1}, {8, 2}, {9, 5}, {8, 8}, {5, 9}, {2, 8}, {1, 5}, {2, 2}}
// Spinner turns through eight frames, even under Reduce Motion.
func Spinner(c *ui.Context, text string, o SpinnerOptions) *ui.Element {
k := pixel.K(c)
s := pixel.Or("Spinner Scale", o.Scale, 1)
if s > 4 {
panic("feedback: Spinner Scale past 4")
}
return ui.Box(c).Role(ui.RoleProgress).Label(text).Size(k.D(12*s), k.D(12*s)).Draw(func(p *ui.Painter, r ui.Rect) {
beads(k.Canvas(p, r), 0, 0, s)
})
}
// beads draws the spinner ring at x, y, scaled s.
func beads(g pixel.Canvas, x, y, s int) {
head := g.Busy(10) % 8
for i, at := range ring {
ink := pixel.Shade
switch (head - i + 8) % 8 {
case 0:
ink = pixel.Accent
case 1:
ink = pixel.AccentLit
case 2:
ink = pixel.Faint
}
g.Rect(x+at[0]*s, y+at[1]*s, 2*s, 2*s, ink)
}
}