Add display components 041-065; move Icon into display; QR via rsc.io/qr

This commit is contained in:
ZacharyZhang-NY committed 2026-10-11 18:37:54 -04:00
1 parent 59fde4096d
commit 0247a130f5
41 files changed
+2152 -44

No files matched your search

+93
View File
@@ -0,0 +1,93 @@
package display
import (
"fmt"
"log/slog"
"github.com/egoist/mygo/ui"
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel"
)
type SignpostOptions struct {
Disabled bool
}
type SignpostResult struct {
Element *ui.Element
// Clicked is the board clicked this frame, or -1.
Clicked int
}
// Signpost is a post with one to three arrow boards.
func Signpost(c *ui.Context, boards []string, o SignpostOptions) SignpostResult {
if len(boards) < 1 || len(boards) > 3 {
panic(fmt.Sprintf("display: Signpost needs 1–3 boards, got %d", len(boards)))
}
k := pixel.K(c)
w := 0
for _, b := range boards {
w = max(w, pixel.Measure(b))
}
w += 18
res := SignpostResult{Clicked: -1}
res.Element = ui.Column(c).Width(k.D(w+8)).Gap(k.D(3)).AlignItems(ui.Center).Padding(0, 0, k.D(20), 0).Role(ui.RoleGroup).FocusGroup(ui.Vertical).Draw(func(p *ui.Painter, r ui.Rect) {
g := k.Canvas(p, r)
g.Rect(g.W/2-2, 2, 4, g.H-2, pixel.Shade)
g.VLine(g.W/2-2, 2, g.H-2, pixel.Edge)
g.VLine(g.W/2+1, 2, g.H-2, pixel.Edge)
}).Children(func() {
for i, b := range boards {
if board(c, k, b, w, i%2 == 1, o.Disabled) {
res.Clicked = i
}
}
})
if res.Clicked >= 0 {
slog.Debug("8bit: signpost", "board", boards[res.Clicked])
}
return res
}
// board is one wooden arrow, pointing left if asked.
func board(c *ui.Context, k pixel.Kit, label string, w int, left, disabled bool) bool {
shell, base, st := pixel.Shell(c, func() *ui.Element { return ui.ButtonBase(c).Label(label).Disabled(disabled) })
h := pixel.LineHeight + 2
shell.Size(k.D(w), k.D(h)).Draw(func(p *ui.Painter, r ui.Rect) {
g := k.Canvas(p, r)
dy := 0
if st.Press {
dy = 1
}
for j := range h - dy {
cut := abs(j - (h-1)/2)
x0, x1 := 0, w-cut
if left {
x0, x1 = cut, w
}
fill := pixel.Warn
if j == 0 || j == h-1-dy {
fill = pixel.Edge
}
g.HLine(x0, j+dy, x1-x0, fill)
g.Dot(x0, j+dy, pixel.Edge)
g.Dot(x1-1, j+dy, pixel.Edge)
}
g.Veil(1, 1+dy, w-2, h-3, pixel.Shade, 4)
tx := 6
if left {
tx = w - 6 - pixel.Measure(label)
}
g.Text(tx, 1+dy, label, pixel.Ink, 1)
if st.Hover {
g.Veil(1, 1+dy, w-2, h-3, pixel.Lit, 4)
}
if st.Disabled {
g.Checker(0, 0, w, h, pixel.Face)
}
if st.Focus {
g.FocusMark(0, 0, w, h)
}
})
return base.Clicked()
}