From 6330fa5dc5f2300e2b48244a91e2d59ec79d202c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 22 Dec 2021 10:03:58 +0100 Subject: [PATCH] Select newly created control point --- .../Components/PathControlPointVisualiser.cs | 22 +++++++++++----- .../Sliders/SliderSelectionBlueprint.cs | 26 +++++++++++-------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs index e06fc1510c..b72e2d786b 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs @@ -92,7 +92,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components Pieces.Add(new PathControlPointPiece(slider, point).With(d => { if (allowSelection) - d.RequestSelection = selectPiece; + d.RequestSelection = selectionRequested; d.DragStarted = dragStarted; d.DragInProgress = dragInProgress; @@ -128,6 +128,9 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components protected override bool OnClick(ClickEvent e) { + if (Pieces.Any(piece => piece.IsHovered)) + return false; + foreach (var piece in Pieces) { piece.IsSelected.Value = false; @@ -151,15 +154,22 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components { } - private void selectPiece(PathControlPointPiece piece, MouseButtonEvent e) + private void selectionRequested(PathControlPointPiece piece, MouseButtonEvent e) { if (e.Button == MouseButton.Left && inputManager.CurrentState.Keyboard.ControlPressed) piece.IsSelected.Toggle(); else - { - foreach (var p in Pieces) - p.IsSelected.Value = p == piece; - } + SetSelectionTo(piece.ControlPoint); + } + + /// + /// Selects the corresponding to the given , + /// and deselects all other s. + /// + public void SetSelectionTo(PathControlPoint pathControlPoint) + { + foreach (var p in Pieces) + p.IsSelected.Value = p.ControlPoint == pathControlPoint; } /// diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs index 17a62fc61c..de8c0d3b78 100644 --- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs +++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/SliderSelectionBlueprint.cs @@ -140,7 +140,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders case MouseButton.Left: if (e.ControlPressed && IsSelected) { - placementControlPointIndex = addControlPoint(e.MousePosition); + placementControlPoint = addControlPoint(e.MousePosition); + ControlPointVisualiser?.SetSelectionTo(placementControlPoint); return true; // Stop input from being handled and modifying the selection } @@ -150,11 +151,12 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders return false; } - private int? placementControlPointIndex; + [CanBeNull] + private PathControlPoint placementControlPoint; protected override bool OnDragStart(DragStartEvent e) { - if (placementControlPointIndex != null) + if (placementControlPoint != null) { changeHandler?.BeginChange(); return true; @@ -165,16 +167,16 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders protected override void OnDrag(DragEvent e) { - Debug.Assert(placementControlPointIndex != null); + Debug.Assert(placementControlPoint != null); - HitObject.Path.ControlPoints[placementControlPointIndex.Value].Position = e.MousePosition - HitObject.Position; + placementControlPoint.Position = e.MousePosition - HitObject.Position; } protected override void OnDragEnd(DragEndEvent e) { - if (placementControlPointIndex != null) + if (placementControlPoint != null) { - placementControlPointIndex = null; + placementControlPoint = null; changeHandler?.EndChange(); } } @@ -193,7 +195,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders return false; } - private int addControlPoint(Vector2 position) + private PathControlPoint addControlPoint(Vector2 position) { position -= HitObject.Position; @@ -211,10 +213,12 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders } } - // Move the control points from the insertion index onwards to make room for the insertion - controlPoints.Insert(insertionIndex, new PathControlPoint { Position = position }); + var pathControlPoint = new PathControlPoint { Position = position }; - return insertionIndex; + // Move the control points from the insertion index onwards to make room for the insertion + controlPoints.Insert(insertionIndex, pathControlPoint); + + return pathControlPoint; } private void removeControlPoints(List toRemove)