mirror of
https://github.com/ppy/osu.git
synced 2026-05-20 02:39:53 +08:00
Fix initial song select states
The core freestyle-changed code business logic doesn't need to run on load (or maybe _should not_ be run), but some of the housekeeping code it also runs _does_ need to be run immediately. Extracting said housekeeping code fulfills both requirements.
This commit is contained in:
@@ -117,24 +117,21 @@ namespace osu.Game.Screens.OnlinePlay
|
||||
|
||||
Mods.BindValueChanged(onGlobalModsChanged);
|
||||
Ruleset.BindValueChanged(onRulesetChanged);
|
||||
Freestyle.BindValueChanged(onFreestyleChanged, true);
|
||||
Freestyle.BindValueChanged(onFreestyleChanged);
|
||||
|
||||
freeModSelectOverlayRegistration = OverlayManager?.RegisterBlockingOverlay(freeModSelect);
|
||||
|
||||
updateFooterButtons();
|
||||
updateValidMods();
|
||||
}
|
||||
|
||||
private void onFreestyleChanged(ValueChangedEvent<bool> enabled)
|
||||
{
|
||||
// Remove invalid mods and display the newly available mod panels.
|
||||
Mods.Value = Mods.Value.Where(isValidRequiredMod).ToArray();
|
||||
ModSelect.IsValidMod = isValidRequiredMod;
|
||||
FreeMods.Value = FreeMods.Value.Where(isValidAllowedMod).ToArray();
|
||||
freeModSelect.IsValidMod = isValidAllowedMod;
|
||||
updateFooterButtons();
|
||||
updateValidMods();
|
||||
|
||||
if (enabled.NewValue)
|
||||
{
|
||||
freeModsFooterButton.Enabled.Value = false;
|
||||
freeModSelect.Hide();
|
||||
|
||||
// Freestyle allows all mods to be selected as freemods. This does not play nicely for some components:
|
||||
// - We probably don't want to store a gigantic list of acronyms to the database.
|
||||
// - The mod select overlay isn't built to handle duplicate mods/mods from all rulesets being shoved into it.
|
||||
@@ -143,8 +140,6 @@ namespace osu.Game.Screens.OnlinePlay
|
||||
}
|
||||
else
|
||||
{
|
||||
freeModsFooterButton.Enabled.Value = true;
|
||||
|
||||
// When disabling freestyle, enable freemods by default.
|
||||
FreeMods.Value = freeModSelect.AllAvailableMods.Where(state => state.ValidForSelection.Value).Select(state => state.Mod).ToArray();
|
||||
}
|
||||
@@ -152,9 +147,7 @@ namespace osu.Game.Screens.OnlinePlay
|
||||
|
||||
private void onGlobalModsChanged(ValueChangedEvent<IReadOnlyList<Mod>> mods)
|
||||
{
|
||||
// Remove incompatible free mods and display the newly available mod panels.
|
||||
FreeMods.Value = FreeMods.Value.Where(isValidAllowedMod).ToArray();
|
||||
freeModSelect.IsValidMod = isValidAllowedMod;
|
||||
updateValidMods();
|
||||
}
|
||||
|
||||
private void onRulesetChanged(ValueChangedEvent<RulesetInfo> ruleset)
|
||||
@@ -163,6 +156,26 @@ namespace osu.Game.Screens.OnlinePlay
|
||||
FreeMods.Value = [];
|
||||
}
|
||||
|
||||
private void updateFooterButtons()
|
||||
{
|
||||
if (Freestyle.Value)
|
||||
{
|
||||
freeModsFooterButton.Enabled.Value = false;
|
||||
freeModSelect.Hide();
|
||||
}
|
||||
else
|
||||
freeModsFooterButton.Enabled.Value = true;
|
||||
}
|
||||
|
||||
private void updateValidMods()
|
||||
{
|
||||
// Remove invalid mods and display the newly available mod panels.
|
||||
Mods.Value = Mods.Value.Where(isValidRequiredMod).ToArray();
|
||||
ModSelect.IsValidMod = isValidRequiredMod;
|
||||
FreeMods.Value = FreeMods.Value.Where(isValidAllowedMod).ToArray();
|
||||
freeModSelect.IsValidMod = isValidAllowedMod;
|
||||
}
|
||||
|
||||
protected sealed override bool OnStart()
|
||||
{
|
||||
var item = new PlaylistItem(Beatmap.Value.BeatmapInfo)
|
||||
|
||||
Reference in New Issue
Block a user