Per-widget and per-state skins, looked up by name - the data-driven half of what GUI2 puts in
data/gui/*.cfg, and the thing the one global Theme has no room for.
A lookup walks a fixed chain so a caller never gets undefined: the widget's own state, its
idle look, the wildcard widget's state, the wildcard's idle look, then an empty skin. That is
what lets a game define a shared * skin once and override only the two widgets it cares about,
and what makes a state a widget never defined fall back rather than disappear.
Builds a registry from plain data - the shape a config file would parse into. An entry with
any state key is read as one look per state; anything else is that widget's idle look.
Per-widget and per-state skins, looked up by name - the data-driven half of what GUI2 puts in
data/gui/*.cfg, and the thing the one globalThemehas no room for.A lookup walks a fixed chain so a caller never gets
undefined: the widget's own state, its idle look, the wildcard widget's state, the wildcard's idle look, then an empty skin. That is what lets a game define a shared*skin once and override only the two widgets it cares about, and what makes a state a widget never defined fall back rather than disappear.Example