Closes https://github.com/ppy/osu/issues/32420.
The failure cause here is that in editor the beatmap version for the
beatmap affected (or... any beatmap, really), is 0 (ZERO). That is
probably a regression from https://github.com/ppy/osu/pull/32315, but
like... can we universally agree that calling that change "a regression"
in any capacity is dumb? Like what was that code *doing* playing dumb
reference games and copying stuff into an arbitrary instance that could
get or not get used later on? And now you have a 50/50 chance of
accessing the *correct* model's field, depending on whether you go via
`BeatmapInfo` or `Beatmap.BeatmapInfo`?
Moving the field to `IBeatmap`, i.e. what is by now - by consensus,
since https://github.com/ppy/osu/pull/28473 - supposed to be the "decoded
and materialised" beatmap, fixes this issue.
I probably should have done this as part of
https://github.com/ppy/osu/pull/28473 but it slipped my mind. Probably
for the better too because this change has rather large chances of
breaking stuff so maybe better to examine it in isolation (via diffcalc
runs or whatever).
For added humour points, you'd say that the field on `BeatmapInfo` was
not `[Ignore]`d, so this is a realm schema change, right? No. As far as
I can tell, it's not. I opened realm studio and `BeatmapVersion` *is not
a listed column` on `Beatmap` models.
I'm also not gonna get into the fact that I think `EditorBeatmap` doing
dumb games with juggling two `BeatmapInfo` references since
https://github.com/ppy/osu/pull/15075 is bad, because I don't think I
have the mental capacity to hotfix this by going down that train of
thought.
It's at a very simple stage for now:
- Tab control is no longer recreated when friends change, counts are
updated as bindables.
- All async logic removed temporarily.
- Sort and filtering happens in realtime without panel reload.
- Display modes removed for now. Need to think about this one a bit more,
and whether to retry the async path or look for a separate solution.
- Real time user presence is now considered. Not considered for sorting
by last visit time yet.
It's all a bit weird so let's just disable it for now. For instance,
this is exposed as "text" font / colour but only affects the header.
Also, no other headers are cusotmisable in similar components.
To be hoenst, this is all quite abusive but I'm not sure how to do it in
any better way. I especially dislike the fact that the screen's
bindables are disabled yet the screen itself is allowed to set their
value because they're `LeasedBindable`s.
But I feel better doing this in a central location like this
`ScreenStack` than in the rooms... Otherwise this specific behaviour
would have to be replicated in the multiplayer screen when it goes
through the same refactoring.