Elements are now pass-scoped value handles: tests that read bounds after a frame bind a ui.Handle. pixel tells frames apart by the build pass's root, since the Tester clock no longer moves on its own. Fix the regressions the upgrade brought: - Clipboard reads in input handlers go through c.Services(). - MyGo notes an overlay's opener after building it, so AutoFocus inside lost it; pixel.AutoFocus focuses through a Handle, and archtest bans the raw call. Dialogs hand the focus back again. - Elements around a press stay hovered: Tooltip tells a press-given focus by focus arriving under the pointer. - The web host moves the Tester clock with real time, at most 500 ms a call, and gives components the real clock. The gallery's source index also accepts CRLF checkouts. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
37 lines
903 B
Go
37 lines
903 B
Go
package media
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"github.com/egoist/mygo/ui"
|
||
|
||
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel"
|
||
)
|
||
|
||
// keyboard plays C4–C5: A–K white, WETYU black.
|
||
var keyboard = [13]struct {
|
||
key ui.Key
|
||
letter string
|
||
}{
|
||
{ui.KeyA, "A"}, {ui.KeyW, "W"}, {ui.KeyS, "S"}, {ui.KeyE, "E"}, {ui.KeyD, "D"}, {ui.KeyF, "F"}, {ui.KeyT, "T"},
|
||
{ui.KeyG, "G"}, {ui.KeyY, "Y"}, {ui.KeyH, "H"}, {ui.KeyU, "U"}, {ui.KeyJ, "J"}, {ui.KeyK, "K"},
|
||
}
|
||
|
||
var names = [12]string{"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"}
|
||
|
||
// note names the semitone above C4, like "C#4".
|
||
func note(semi int) string {
|
||
return fmt.Sprintf("%s%d", names[semi%12], 4+semi/12)
|
||
}
|
||
|
||
// played are the semitones whose letters e heard this frame.
|
||
func played(e ui.Element) []int {
|
||
var out []int
|
||
for semi, kb := range keyboard {
|
||
if pixel.Shortcut(e, 0, kb.key) {
|
||
out = append(out, semi)
|
||
}
|
||
}
|
||
return out
|
||
}
|