To be fair, currently the test is a bit pointless (as it has no reason
to be a `SkinnableTestScene`, it gains precisely nothing from it - all
that is shown there is some generic components on song select). But that
is no worse then `master`, so look away for now.
- Checking `DrawSize != Vector2.Zero` is too specific. It could also
crash on zero-height-but-non-zero-width, or
zero-width-but-non-zero-height.
- Take the `gridCache.Validate()` call out of the zero checks, because
even if the width or height are zero, not generating anything is valid
and there is no reason to validate every frame until `gridCache` gets
invalidated again.
This was always haphazard code, but by luck it never triggered before
drawable load until now. With the recently nullability changes, this
would be triggered when `flash` is not yet constructed.
Switching to `AddOnce` seems safer to avoid multiple applications,
regardless.
Until now, the only usage of ruleset layers was where there is both a
ruleset specific and non-ruleset-specific layer present. The matching
code was making assumptions about this.
As I tried to add a new playfield layer which breaks this assumption,
non-ruleset-specifc components were not being displayed in the toolbox.
This turned out to be due to a `target` of `null` being provided due to
the weird `getTarget` matching (that happened to *just* do what we
wanted previously due to the equals implementation, but only because
there was a container without the ruleset present in the available
targets).
I've changed this to be a more appropriate lookup method, where the
target for dependency sourcing is provided separately from the ruleset
filter.
Was causing there to be two kinds of missing `TournamentBeatmap`s: one
with missing `Beatmap == null`, and one with `Beatmap == new
APIBeatmap()`. In particular, they would appear differently in UI
(either as "unknown - unknown", or the intensely enigmatic " - ").