diff --git a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
index c66be90605..9776e64855 100644
--- a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
@@ -196,6 +196,11 @@ namespace osu.Game.Screens.Edit.Compose.Components
DragBox.HandleDrag(e);
DragBox.Show();
+
+ selectionBeforeDrag.Clear();
+ if (e.ControlPressed)
+ selectionBeforeDrag.UnionWith(SelectedItems);
+
return true;
}
@@ -217,6 +222,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
}
DragBox.Hide();
+ selectionBeforeDrag.Clear();
}
protected override void Update()
@@ -227,7 +233,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
{
lastDragEvent.Target = this;
DragBox.HandleDrag(lastDragEvent);
- UpdateSelectionFromDragBox();
+ UpdateSelectionFromDragBox(selectionBeforeDrag);
}
}
@@ -472,7 +478,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
///
/// Select all blueprints in a selection area specified by .
///
- protected virtual void UpdateSelectionFromDragBox()
+ protected virtual void UpdateSelectionFromDragBox(HashSet selectionBeforeDrag)
{
var quad = DragBox.Box.ScreenSpaceDrawQuad;
@@ -482,7 +488,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
{
case SelectionState.Selected:
// Selection is preserved even after blueprint becomes dead.
- if (!quad.Contains(blueprint.ScreenSpaceSelectionPoint))
+ if (!quad.Contains(blueprint.ScreenSpaceSelectionPoint) && !selectionBeforeDrag.Contains(blueprint.Item))
blueprint.Deselect();
break;
@@ -535,6 +541,8 @@ namespace osu.Game.Screens.Edit.Compose.Components
///
private bool wasDragStarted;
+ private readonly HashSet selectionBeforeDrag = new HashSet();
+
///
/// Attempts to begin the movement of any selected blueprints.
///
diff --git a/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineBlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineBlueprintContainer.cs
index 740f0b6aac..a6af83d268 100644
--- a/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineBlueprintContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineBlueprintContainer.cs
@@ -173,7 +173,7 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
protected sealed override DragBox CreateDragBox() => new TimelineDragBox();
- protected override void UpdateSelectionFromDragBox()
+ protected override void UpdateSelectionFromDragBox(HashSet selectionBeforeDrag)
{
Composer.BlueprintContainer.CommitIfPlacementActive();
@@ -191,6 +191,9 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
bool shouldBeSelected(HitObject hitObject)
{
+ if (selectionBeforeDrag.Contains(hitObject))
+ return true;
+
double midTime = (hitObject.StartTime + hitObject.GetEndTime()) / 2;
return minTime <= midTime && midTime <= maxTime;
}