diff --git a/osu.Game.Rulesets.Mania/Edit/Blueprints/HoldNotePlacementBlueprint.cs b/osu.Game.Rulesets.Mania/Edit/Blueprints/HoldNotePlacementBlueprint.cs
index 1f92929392..a13afdfffe 100644
--- a/osu.Game.Rulesets.Mania/Edit/Blueprints/HoldNotePlacementBlueprint.cs
+++ b/osu.Game.Rulesets.Mania/Edit/Blueprints/HoldNotePlacementBlueprint.cs
@@ -82,7 +82,7 @@ public override void UpdateTimeAndPosition(SnapResult result)
{
base.UpdateTimeAndPosition(result);
- if (PlacementActive)
+ if (PlacementActive == PlacementState.Active)
{
if (result.Time is double endTime)
{
diff --git a/osu.Game.Rulesets.Mania/Edit/Blueprints/ManiaPlacementBlueprint.cs b/osu.Game.Rulesets.Mania/Edit/Blueprints/ManiaPlacementBlueprint.cs
index 5e09054667..8f25668dd0 100644
--- a/osu.Game.Rulesets.Mania/Edit/Blueprints/ManiaPlacementBlueprint.cs
+++ b/osu.Game.Rulesets.Mania/Edit/Blueprints/ManiaPlacementBlueprint.cs
@@ -52,7 +52,7 @@ public override void UpdateTimeAndPosition(SnapResult result)
{
base.UpdateTimeAndPosition(result);
- if (!PlacementActive)
+ if (PlacementActive == PlacementState.Waiting)
Column = result.Playfield as Column;
}
}
diff --git a/osu.Game.Rulesets.Taiko/Edit/Blueprints/TaikoSpanPlacementBlueprint.cs b/osu.Game.Rulesets.Taiko/Edit/Blueprints/TaikoSpanPlacementBlueprint.cs
index e53b331f46..59249e6bf4 100644
--- a/osu.Game.Rulesets.Taiko/Edit/Blueprints/TaikoSpanPlacementBlueprint.cs
+++ b/osu.Game.Rulesets.Taiko/Edit/Blueprints/TaikoSpanPlacementBlueprint.cs
@@ -72,7 +72,7 @@ public override void UpdateTimeAndPosition(SnapResult result)
{
base.UpdateTimeAndPosition(result);
- if (PlacementActive)
+ if (PlacementActive == PlacementState.Active)
{
if (result.Time is double dragTime)
{
diff --git a/osu.Game/Rulesets/Edit/PlacementBlueprint.cs b/osu.Game/Rulesets/Edit/PlacementBlueprint.cs
index bfff93e7c5..6c1cd01796 100644
--- a/osu.Game/Rulesets/Edit/PlacementBlueprint.cs
+++ b/osu.Game/Rulesets/Edit/PlacementBlueprint.cs
@@ -25,7 +25,7 @@ public abstract class PlacementBlueprint : CompositeDrawable
///
/// Whether the is currently mid-placement, but has not necessarily finished being placed.
///
- public bool PlacementActive { get; private set; }
+ public PlacementState PlacementActive { get; private set; }
///
/// The that is being placed.
@@ -72,7 +72,8 @@ private void load(IBindable beatmap)
protected void BeginPlacement(bool commitStart = false)
{
placementHandler.BeginPlacement(HitObject);
- PlacementActive |= commitStart;
+ if (commitStart)
+ PlacementActive = PlacementState.Active;
}
///
@@ -82,10 +83,19 @@ protected void BeginPlacement(bool commitStart = false)
/// Whether the object should be committed.
public void EndPlacement(bool commit)
{
- if (!PlacementActive)
- BeginPlacement();
+ switch (PlacementActive)
+ {
+ case PlacementState.Finished:
+ return;
+
+ case PlacementState.Waiting:
+ // ensure placement was started before ending to make state handling simpler.
+ BeginPlacement();
+ break;
+ }
+
placementHandler.EndPlacement(HitObject, commit);
- PlacementActive = false;
+ PlacementActive = PlacementState.Finished;
}
///
@@ -94,7 +104,7 @@ public void EndPlacement(bool commit)
/// The snap result information.
public virtual void UpdateTimeAndPosition(SnapResult result)
{
- if (!PlacementActive)
+ if (PlacementActive == PlacementState.Waiting)
HitObject.StartTime = result.Time ?? EditorClock?.CurrentTime ?? Time.Current;
}
@@ -125,5 +135,12 @@ protected override bool Handle(UIEvent e)
return false;
}
}
+
+ public enum PlacementState
+ {
+ Waiting,
+ Active,
+ Finished
+ }
}
}
diff --git a/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
index 5ab557804e..b0a6a091f0 100644
--- a/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
@@ -196,7 +196,7 @@ private Drawable getIconForSample(string sampleName)
private void refreshTool()
{
removePlacement();
- createPlacement();
+ ensurePlacementCreated();
}
private void updatePlacementPosition()
@@ -215,15 +215,26 @@ protected override void Update()
{
base.Update();
- if (Composer.CursorInPlacementArea)
- createPlacement();
- else if (currentPlacement?.PlacementActive == false)
- removePlacement();
-
if (currentPlacement != null)
{
- updatePlacementPosition();
+ switch (currentPlacement.PlacementActive)
+ {
+ case PlacementBlueprint.PlacementState.Waiting:
+ if (!Composer.CursorInPlacementArea)
+ removePlacement();
+ break;
+
+ case PlacementBlueprint.PlacementState.Finished:
+ removePlacement();
+ break;
+ }
}
+
+ if (Composer.CursorInPlacementArea)
+ ensurePlacementCreated();
+
+ if (currentPlacement != null)
+ updatePlacementPosition();
}
protected sealed override SelectionBlueprint CreateBlueprintFor(HitObject hitObject)
@@ -249,7 +260,7 @@ protected override void OnBlueprintAdded(HitObject hitObject)
NewCombo.Value = TernaryState.False;
}
- private void createPlacement()
+ private void ensurePlacementCreated()
{
if (currentPlacement != null) return;