Files
Sylpheed/crates
MechaCat02 af0796c835 viewer: UI Screens and Save File browsers (View menu)
Two new floating browsers, both fed only by static data — the disc for screens,
a savedata file for saves — following the existing Game Data / Ships pattern
(request event → worker thread → IsoLoaderMsg → draw system).

UI Screens
  Pick a screen pak and one of its builds (a build = one context × language
  variant; GP_PAUSE_MENU holds six) and see the screen reassembled at 1280×720
  beside the element list it was derived from, so a wrong placement shows up as
  a wrong picture and the row next to it says why. Per-element visibility
  toggles, focused-state and loop-animation toggles, and an inspector showing
  each element's sprite, parent link, kind flags, pivot and keyframe count.

  Compositing decodes ~30 T8aD sprites, which is far too slow for the UI
  thread, so it runs on a worker under the same generation gate the XPR path
  uses — a toggle mid-decode discards the stale result rather than racing it.

  The panel deliberately surfaces two things it would be easy to hide: sprites
  that named a child the bundle does not hold, and builds recovered through the
  .rat fallback (where elements without a record are simply absent).

Save File
  Opens a savedata file (it lives in the emulator's content tree, not on the
  disc, so this is a file dialog rather than a disc path). Shows the container,
  the GHAD block with every field coloured by its actual confidence, the
  Arsenal develop blob, the per-stage SHAB records, and the header summary.

  Three things the panel states rather than glosses: the byte-identical
  round-trip, which is the check the whole layout rests on; that SHAB records
  are per-stage results and NOT the UI's save slots; and that the header
  summary is what the Details panel reads, so a payload edit that leaves it
  stale proves nothing about the field that was edited. Fields tested and
  refuted (+36, +56) are shown as refuted rather than dropped.

Also gates draw_game_data_ui / draw_ships_ui at their registration site. Both
are #[cfg(not(wasm32))] but were registered unconditionally, so the wasm leg of
`just ci` failed on an undefined name. NOTE: that leg still does not build, for
a pre-existing and unrelated reason — the workspace pins tokio with features =
["full"], which pulls mio, which refuses to compile for wasm32. Fixing that
means restructuring tokio's features per target and is left alone here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 19:15:15 +02:00
..