diff --git a/osu.Game/Rulesets/Edit/SelectionBlueprint.cs b/osu.Game/Rulesets/Edit/SelectionBlueprint.cs
index 4abdbfc244..f3816f6218 100644
--- a/osu.Game/Rulesets/Edit/SelectionBlueprint.cs
+++ b/osu.Game/Rulesets/Edit/SelectionBlueprint.cs
@@ -120,6 +120,11 @@ namespace osu.Game.Rulesets.Edit
///
public void Deselect() => State = SelectionState.NotSelected;
+ ///
+ /// Toggles the selection state of this .
+ ///
+ public void ToggleSelection() => State = IsSelected ? SelectionState.NotSelected : SelectionState.Selected;
+
public bool IsSelected => State == SelectionState.Selected;
///
diff --git a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
index 7751df29cf..5ac360d029 100644
--- a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
@@ -298,13 +298,6 @@ namespace osu.Game.Screens.Edit.Compose.Components
{
Debug.Assert(!clickSelectionBegan);
- // Deselections are only allowed for control + left clicks
- bool allowDeselection = e.ControlPressed && e.Button == MouseButton.Left;
-
- // Todo: This is probably incorrectly disallowing multiple selections on stacked objects
- if (!allowDeselection && SelectionHandler.SelectedBlueprints.Any(s => s.IsHovered))
- return;
-
foreach (SelectionBlueprint blueprint in SelectionBlueprints.AliveChildren)
{
if (blueprint.IsHovered)
diff --git a/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs b/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs
index 4caceedc5a..01e23bafc5 100644
--- a/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/SelectionHandler.cs
@@ -24,6 +24,7 @@ using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Drawables;
using osu.Game.Rulesets.Objects.Types;
using osuTK;
+using osuTK.Input;
namespace osu.Game.Screens.Edit.Compose.Components
{
@@ -224,21 +225,21 @@ namespace osu.Game.Screens.Edit.Compose.Components
/// The input state at the point of selection.
internal void HandleSelectionRequested(SelectionBlueprint blueprint, InputState state)
{
- if (state.Keyboard.ControlPressed)
- {
- if (blueprint.IsSelected)
- blueprint.Deselect();
- else
- blueprint.Select();
- }
+ if (state.Keyboard.ShiftPressed && state.Mouse.IsPressed(MouseButton.Right))
+ EditorBeatmap.Remove(blueprint.HitObject);
+ else if (state.Keyboard.ControlPressed && state.Mouse.IsPressed(MouseButton.Left))
+ blueprint.ToggleSelection();
else
- {
- if (blueprint.IsSelected)
- return;
+ ensureSelected(blueprint);
+ }
- DeselectAll?.Invoke();
- blueprint.Select();
- }
+ private void ensureSelected(SelectionBlueprint blueprint)
+ {
+ if (blueprint.IsSelected)
+ return;
+
+ DeselectAll?.Invoke();
+ blueprint.Select();
}
private void deleteSelected()