From 0189f014028b9bdcad1d1b43a3a4650294bfed96 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Tue, 22 Aug 2017 16:15:40 +0900 Subject: [PATCH] Explicitly store defaultSpeedAdjustment, and make it un-removable --- osu.Game/Rulesets/UI/ScrollingPlayfield.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/osu.Game/Rulesets/UI/ScrollingPlayfield.cs b/osu.Game/Rulesets/UI/ScrollingPlayfield.cs index e9f6b4f2ed..524665487d 100644 --- a/osu.Game/Rulesets/UI/ScrollingPlayfield.cs +++ b/osu.Game/Rulesets/UI/ScrollingPlayfield.cs @@ -154,6 +154,8 @@ namespace osu.Game.Rulesets.UI private readonly Container speedAdjustments; public IReadOnlyList SpeedAdjustments => speedAdjustments; + private readonly SpeedAdjustmentContainer defaultSpeedAdjustment; + private readonly Axes scrollingAxes; /// @@ -167,7 +169,7 @@ namespace osu.Game.Rulesets.UI AddInternal(speedAdjustments = new Container { RelativeSizeAxes = Axes.Both }); // Default speed adjustment - AddSpeedAdjustment(new SpeedAdjustmentContainer(new MultiplierControlPoint(0))); + AddSpeedAdjustment(defaultSpeedAdjustment = new SpeedAdjustmentContainer(new MultiplierControlPoint(0))); } /// @@ -208,6 +210,9 @@ namespace osu.Game.Rulesets.UI /// The to remove. public void RemoveSpeedAdjustment(SpeedAdjustmentContainer speedAdjustment) { + if (speedAdjustment == defaultSpeedAdjustment) + throw new InvalidOperationException($"The default {nameof(SpeedAdjustmentContainer)} must not be removed."); + if (!speedAdjustments.Remove(speedAdjustment)) return; @@ -232,11 +237,7 @@ namespace osu.Game.Rulesets.UI if (!(hitObject is IScrollingHitObject)) throw new InvalidOperationException($"Hit objects added to a {nameof(ScrollingHitObjectContainer)} must implement {nameof(IScrollingHitObject)}."); - var target = adjustmentContainerFor(hitObject); - if (target == null) - throw new InvalidOperationException($"A {nameof(SpeedAdjustmentContainer)} to container {hitObject} could not be found."); - - target.Add(hitObject); + adjustmentContainerFor(hitObject).Add(hitObject); } public override bool Remove(DrawableHitObject hitObject) => speedAdjustments.Any(s => s.Remove(hitObject)); @@ -248,7 +249,7 @@ namespace osu.Game.Rulesets.UI /// /// The hit object to find the active for. /// The active at 's start time. Null if there are no speed adjustments. - private SpeedAdjustmentContainer adjustmentContainerFor(DrawableHitObject hitObject) => speedAdjustments.LastOrDefault(c => c.CanContain(hitObject)) ?? speedAdjustments.FirstOrDefault(); + private SpeedAdjustmentContainer adjustmentContainerFor(DrawableHitObject hitObject) => speedAdjustments.LastOrDefault(c => c.CanContain(hitObject)) ?? defaultSpeedAdjustment; /// /// Finds the which provides the speed adjustment active at a time. @@ -256,7 +257,7 @@ namespace osu.Game.Rulesets.UI /// /// The time to find the active at. /// The active at . Null if there are no speed adjustments. - private SpeedAdjustmentContainer adjustmentContainerAt(double time) => speedAdjustments.LastOrDefault(c => c.CanContain(time)) ?? speedAdjustments.FirstOrDefault(); + private SpeedAdjustmentContainer adjustmentContainerAt(double time) => speedAdjustments.LastOrDefault(c => c.CanContain(time)) ?? defaultSpeedAdjustment; } } }