diff --git a/osu.Desktop/OsuGameDesktop.cs b/osu.Desktop/OsuGameDesktop.cs
index a495d7048d..844db4a80f 100644
--- a/osu.Desktop/OsuGameDesktop.cs
+++ b/osu.Desktop/OsuGameDesktop.cs
@@ -12,6 +12,7 @@ using osu.Framework.Platform;
using osu.Game;
using OpenTK.Input;
using Microsoft.Win32;
+using osu.Framework.Platform.Windows;
namespace osu.Desktop
{
@@ -40,7 +41,7 @@ namespace osu.Desktop
///
/// A method of accessing an osu-stable install in a controlled fashion.
///
- private class StableStorage : DesktopStorage
+ private class StableStorage : WindowsStorage
{
protected override string LocateBasePath()
{
diff --git a/osu.Game/Beatmaps/BeatmapManager.cs b/osu.Game/Beatmaps/BeatmapManager.cs
index abc0351a82..efc0279aa0 100644
--- a/osu.Game/Beatmaps/BeatmapManager.cs
+++ b/osu.Game/Beatmaps/BeatmapManager.cs
@@ -242,7 +242,13 @@ namespace osu.Game.Beatmaps
/// Returns a list of all usable s.
///
/// A list of available .
- public List GetAllUsableBeatmapSets() => beatmaps.ConsumableItems.Where(s => !s.DeletePending && !s.Protected).ToList();
+ public List GetAllUsableBeatmapSets() => GetAllUsableBeatmapSetsEnumerable().ToList();
+
+ ///
+ /// Returns a list of all usable s.
+ ///
+ /// A list of available .
+ public IQueryable GetAllUsableBeatmapSetsEnumerable() => beatmaps.ConsumableItems.Where(s => !s.DeletePending && !s.Protected);
///
/// Perform a lookup query on available s.
diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs
index 8b88204ed0..f212bfabf3 100644
--- a/osu.Game/Screens/Menu/ButtonSystem.cs
+++ b/osu.Game/Screens/Menu/ButtonSystem.cs
@@ -254,9 +254,6 @@ namespace osu.Game.Screens.Menu
backButton.ContractStyle = 0;
settingsButton.ContractStyle = 0;
- if (state == MenuState.TopLevel)
- buttonArea.FinishTransforms(true);
-
updateLogoState(lastState);
using (buttonArea.BeginDelayedSequence(lastState == MenuState.Initial ? 150 : 0, true))
@@ -325,16 +322,15 @@ namespace osu.Game.Screens.Menu
{
if (logo == null) return;
- logoDelayedAction?.Cancel();
-
switch (state)
{
case MenuState.Exit:
case MenuState.Initial:
- logoTracking = false;
-
+ logoDelayedAction?.Cancel();
logoDelayedAction = Scheduler.AddDelayed(() =>
{
+ logoTracking = false;
+
hideOverlaysOnEnter.Value = true;
allowOpeningOverlays.Value = false;
@@ -343,34 +339,40 @@ namespace osu.Game.Screens.Menu
logo.MoveTo(new Vector2(0.5f), 800, Easing.OutExpo);
logo.ScaleTo(1, 800, Easing.OutExpo);
- }, 150);
-
+ }, buttonArea.Alpha * 150);
break;
case MenuState.TopLevel:
case MenuState.Play:
- logo.ClearTransforms(targetMember: nameof(Position));
- logo.RelativePositionAxes = Axes.None;
-
switch (lastState)
{
case MenuState.TopLevel: // coming from toplevel to play
+ break;
case MenuState.Initial:
- logoTracking = false;
- logo.ScaleTo(0.5f, 200, Easing.In);
+ logo.ClearTransforms(targetMember: nameof(Position));
+ logo.RelativePositionAxes = Axes.None;
+
+ bool impact = logo.Scale.X > 0.6f;
+
+ if (lastState == MenuState.Initial)
+ logo.ScaleTo(0.5f, 200, Easing.In);
logo.MoveTo(logoTrackingPosition, lastState == MenuState.EnteringMode ? 0 : 200, Easing.In);
+ logoDelayedAction?.Cancel();
logoDelayedAction = Scheduler.AddDelayed(() =>
{
logoTracking = true;
- logo.Impact();
+ if (impact)
+ logo.Impact();
hideOverlaysOnEnter.Value = false;
allowOpeningOverlays.Value = true;
}, 200);
break;
default:
+ logo.ClearTransforms(targetMember: nameof(Position));
+ logo.RelativePositionAxes = Axes.None;
logoTracking = true;
logo.ScaleTo(0.5f, 200, Easing.OutQuint);
break;
diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs
index cd9cbe119f..db9807b9ab 100644
--- a/osu.Game/Screens/OsuScreen.cs
+++ b/osu.Game/Screens/OsuScreen.cs
@@ -231,7 +231,10 @@ namespace osu.Game.Screens
private void applyArrivingDefaults(bool isResuming)
{
- logo.AppendAnimatingAction(() => LogoArriving(logo, isResuming), true);
+ logo.AppendAnimatingAction(() =>
+ {
+ if (IsCurrentScreen) LogoArriving(logo, isResuming);
+ }, true);
if (backgroundParallaxContainer != null)
backgroundParallaxContainer.ParallaxAmount = ParallaxContainer.DEFAULT_PARALLAX_AMOUNT * BackgroundParallaxAmount;
diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs
index 9c8961498a..2d5bc889c3 100644
--- a/osu.Game/Screens/Play/PlayerLoader.cs
+++ b/osu.Game/Screens/Play/PlayerLoader.cs
@@ -209,8 +209,11 @@ namespace osu.Game.Screens.Play
{
base.Dispose(isDisposing);
- // if the player never got pushed, we should explicitly dispose it.
- loadTask?.ContinueWith(_ => player.Dispose());
+ if (isDisposing)
+ {
+ // if the player never got pushed, we should explicitly dispose it.
+ loadTask?.ContinueWith(_ => player.Dispose());
+ }
}
private class BeatmapMetadataDisplay : Container
diff --git a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs
index f39952dc31..c5996327b9 100644
--- a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs
+++ b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs
@@ -51,7 +51,7 @@ namespace osu.Game.Screens.Select.Carousel
if (songSelect != null)
{
- startRequested = songSelect.FinaliseSelection;
+ startRequested = b => songSelect.FinaliseSelection(b);
editRequested = songSelect.Edit;
}
diff --git a/osu.Game/Screens/Select/EditSongSelect.cs b/osu.Game/Screens/Select/EditSongSelect.cs
index bca009e2c1..e1d71fdd05 100644
--- a/osu.Game/Screens/Select/EditSongSelect.cs
+++ b/osu.Game/Screens/Select/EditSongSelect.cs
@@ -7,7 +7,7 @@ namespace osu.Game.Screens.Select
{
protected override bool ShowFooter => false;
- protected override bool OnSelectionFinalised()
+ protected override bool OnStart()
{
Exit();
return true;
diff --git a/osu.Game/Screens/Select/MatchSongSelect.cs b/osu.Game/Screens/Select/MatchSongSelect.cs
index 3ffac591f3..a0c96d0cee 100644
--- a/osu.Game/Screens/Select/MatchSongSelect.cs
+++ b/osu.Game/Screens/Select/MatchSongSelect.cs
@@ -5,7 +5,7 @@ namespace osu.Game.Screens.Select
{
public class MatchSongSelect : SongSelect
{
- protected override bool OnSelectionFinalised()
+ protected override bool OnStart()
{
Schedule(() =>
{
diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs
index 7992930c45..8ce40fcfa0 100644
--- a/osu.Game/Screens/Select/PlaySongSelect.cs
+++ b/osu.Game/Screens/Select/PlaySongSelect.cs
@@ -137,7 +137,7 @@ namespace osu.Game.Screens.Select
return false;
}
- protected override bool OnSelectionFinalised()
+ protected override bool OnStart()
{
if (player != null) return false;
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index 4ffa9e2a90..e1271aebc4 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
-using System.Threading;
using OpenTK;
using OpenTK.Input;
using osu.Framework.Allocation;
@@ -63,8 +62,6 @@ namespace osu.Game.Screens.Select
private SampleChannel sampleChangeDifficulty;
private SampleChannel sampleChangeBeatmap;
- private CancellationTokenSource initialAddSetsTask;
-
private DependencyContainer dependencies;
protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent) => dependencies = new DependencyContainer(parent);
@@ -207,9 +204,7 @@ namespace osu.Game.Screens.Select
sampleChangeDifficulty = audio.Sample.Get(@"SongSelect/select-difficulty");
sampleChangeBeatmap = audio.Sample.Get(@"SongSelect/select-expand");
- initialAddSetsTask = new CancellationTokenSource();
-
- Carousel.BeatmapSets = this.beatmaps.GetAllUsableBeatmapSets();
+ Carousel.BeatmapSets = this.beatmaps.GetAllUsableBeatmapSetsEnumerable();
Beatmap.DisabledChanged += disabled => Carousel.AllowSelection = !disabled;
Beatmap.TriggerChange();
@@ -227,7 +222,8 @@ namespace osu.Game.Screens.Select
/// Call to make a selection and perform the default action for this SongSelect.
///
/// An optional beatmap to override the current carousel selection.
- public void FinaliseSelection(BeatmapInfo beatmap = null)
+ /// Whether to trigger .
+ public void FinaliseSelection(BeatmapInfo beatmap = null, bool performStartAction = true)
{
// if we have a pending filter operation, we want to run it now.
// it could change selection (ie. if the ruleset has been changed).
@@ -243,14 +239,15 @@ namespace osu.Game.Screens.Select
selectionChangedDebounce = null;
}
- OnSelectionFinalised();
+ if (performStartAction)
+ OnStart();
}
///
/// Called when a selection is made.
///
/// If a resultant action occurred that takes the user away from SongSelect.
- protected abstract bool OnSelectionFinalised();
+ protected abstract bool OnStart();
private ScheduledDelegate selectionChangedDebounce;
@@ -395,7 +392,7 @@ namespace osu.Game.Screens.Select
protected override bool OnExiting(Screen next)
{
- FinaliseSelection();
+ FinaliseSelection(performStartAction: false);
beatmapInfoWedge.State = Visibility.Hidden;
@@ -417,8 +414,6 @@ namespace osu.Game.Screens.Select
beatmaps.BeatmapHidden -= onBeatmapHidden;
beatmaps.BeatmapRestored -= onBeatmapRestored;
}
-
- initialAddSetsTask?.Cancel();
}
///