diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs index dd1a2d69fb..d219fb0b2d 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointPiece.cs @@ -135,6 +135,10 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components updateMarkerDisplay(); } + // Used to pair up mouse down events which caused this piece to be selected + // with their corresponding mouse up events. + private bool selectionPerformed; + protected override bool OnMouseDown(MouseDownEvent e) { if (RequestSelection == null) @@ -143,7 +147,12 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components switch (e.Button) { case MouseButton.Left: - RequestSelection.Invoke(this, e); + if (!IsSelected.Value) + { + RequestSelection.Invoke(this, e); + selectionPerformed = true; + } + return true; case MouseButton.Right: @@ -155,6 +164,18 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components return false; } + protected override void OnMouseUp(MouseUpEvent e) + { + base.OnMouseUp(e); + + // ctrl+click deselects this piece, but only if this event + // wasn't immediately preceded by a matching mouse down. + if (IsSelected.Value && e.ControlPressed && !selectionPerformed) + IsSelected.Value = false; + + selectionPerformed = false; + } + protected override bool OnClick(ClickEvent e) => RequestSelection != null; protected override bool OnDragStart(DragStartEvent e)