User feedback is that it's no longer possible to see the applied rate
adjust change when it's non-default without hovering. This fixes that
issue.
I've adjusted the visuals a bit so you can still get a hint at which
mods are displayed, even when they are overflowing.
This was causing the logo to not be clickable immediately after closing
the overlay, which was reported as frustrating by some user.
I hoped to fix this by unfuckulating the logo logic but it's a multi-day
excursion that I'd rather avoid for now.
Closes https://github.com/ppy/osu/issues/33542.
For a diff this simple this took much more hemming and hawing because
things are a bit annoying here from a few angles:
- The only way that is considered idiomatic right now for a skin
component to not be applicable to a screen is to require a dependency
from DI that is only provided by applicable screens.
`DrawableGameplayLeaderboard` has a few of those dependencies, but the
scope of all the usages makes it so that the only really viable one to
use here is `IGameplayLeaderboardProvider` itself (see: visual tests,
and also the usage of multiplayer spectator, where the leaderboard is
*not* under a player instance).
- The smelly part of this is that the `Player` inheritance hierarchy
must ensure that *every* non-abstract class has an
`IGameplayLeaderboardProvider` cached. It is not trivial - if not
straight up impossible - to force this via some `Player` level
abstract method, because such a method would need to somehow
accommodate all possible leaderboard providers. That however also
means that every possible future `Player` implementor *must inherently
know* to also cache a leaderboard provider lest it die at runtime. I
don't love that, but I also don't see better alternatives.
- Speaking of which, I also noticed that solo spectator and playlists
don't have gameplay leaderboards. At all. Which I don't believe to be
something that I broke with the leaderboard work - I'm pretty sure
that was the pre-existing state - however I don't see any reason why
they *couldn't* receive gameplay leaderboards. I'm not doing that
here, though, just leaving TODOs for later.
- Use constraints for better assert messages
- Use `Editor.Undo()` rather than manual input manager synthesizing
ctrl-z (ctrl-z is not a platform agnostic binding, see macOS)