1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-14 14:32:55 +08:00

Hide the corresponding rotation handle when holding scale handle

This commit is contained in:
Salman Ahmed 2021-05-04 07:31:52 +03:00
parent b2a0c2b563
commit 8abff4881b
2 changed files with 31 additions and 8 deletions

View File

@ -6,6 +6,7 @@ using NUnit.Framework;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Testing; using osu.Framework.Testing;
using osu.Framework.Threading;
using osu.Game.Screens.Edit.Compose.Components; using osu.Game.Screens.Edit.Compose.Components;
using osuTK; using osuTK;
using osuTK.Input; using osuTK.Input;
@ -40,6 +41,7 @@ namespace osu.Game.Tests.Visual.Editing
}; };
InputManager.MoveMouseTo(selectionBox); InputManager.MoveMouseTo(selectionBox);
InputManager.ReleaseButton(MouseButton.Left);
}); });
private bool handleScale(Vector2 amount, Anchor reference) private bool handleScale(Vector2 amount, Anchor reference)
@ -127,26 +129,41 @@ namespace osu.Game.Tests.Visual.Editing
} }
[Test] [Test]
public void TestDraggingScaleHandleKeepsCorrespondingRotationHandleShown() public void TestHoldingScaleHandleHidesCorrespondingRotationHandle()
{ {
SelectionBoxRotationHandle rotationHandle = null; SelectionBoxRotationHandle rotationHandle = null;
AddStep("retrieve rotation handle", () => rotationHandle = this.ChildrenOfType<SelectionBoxRotationHandle>().First()); AddStep("retrieve rotation handle", () => rotationHandle = this.ChildrenOfType<SelectionBoxRotationHandle>().First());
AddAssert("rotation handle hidden", () => rotationHandle.Alpha == 0); AddAssert("rotation handle hidden", () => rotationHandle.Alpha == 0);
AddStep("hover over and hold closest scale handle", () => AddStep("hover over closest scale handle", () =>
{ {
InputManager.MoveMouseTo(this.ChildrenOfType<SelectionBoxScaleHandle>().Single(s => s.Anchor == rotationHandle.Anchor)); InputManager.MoveMouseTo(this.ChildrenOfType<SelectionBoxScaleHandle>().Single(s => s.Anchor == rotationHandle.Anchor));
InputManager.PressButton(MouseButton.Left);
}); });
AddUntilStep("rotation handle shown", () => rotationHandle.Alpha == 1); AddUntilStep("rotation handle shown", () => rotationHandle.Alpha == 1);
AddStep("hold scale handle", () => InputManager.PressButton(MouseButton.Left));
AddUntilStep("rotation handle hidden", () => rotationHandle.Alpha == 0);
AddStep("drag to centre", () => InputManager.MoveMouseTo(selectionBox)); int i;
AddAssert("rotation handle still shown", () => rotationHandle.Alpha > 0); ScheduledDelegate mouseMove = null;
AddStep("start dragging", () =>
{
i = 0;
mouseMove = Scheduler.AddDelayed(() =>
{
InputManager.MoveMouseTo(selectionBox.ScreenSpaceDrawQuad.TopLeft + Vector2.One * (5 * ++i));
}, 100, true);
});
AddAssert("rotation handle still hidden", () => rotationHandle.Alpha == 0);
AddStep("end dragging", () => mouseMove.Cancel());
AddAssert("rotation handle still hidden", () => rotationHandle.Alpha == 0);
AddStep("unhold left", () => InputManager.ReleaseButton(MouseButton.Left)); AddStep("unhold left", () => InputManager.ReleaseButton(MouseButton.Left));
AddUntilStep("rotation handle shown", () => rotationHandle.Alpha == 1);
AddStep("move mouse away", () => InputManager.MoveMouseTo(selectionBox, new Vector2(20))); AddStep("move mouse away", () => InputManager.MoveMouseTo(selectionBox, new Vector2(20)));
AddUntilStep("handle hidden", () => rotationHandle.Alpha == 0); AddUntilStep("rotation handle hidden", () => rotationHandle.Alpha == 0);
} }
} }
} }

View File

@ -72,13 +72,19 @@ namespace osu.Game.Screens.Edit.Compose.Components
private void updateRotationHandlesVisibility() private void updateRotationHandlesVisibility()
{ {
if (activeHandle?.IsHeld == true || activeHandle?.IsHovered == true) // if the active handle is a rotation handle and is held or hovered,
// then no need to perform any updates to the rotation handles visibility.
if (activeHandle is SelectionBoxRotationHandle && (activeHandle?.IsHeld == true || activeHandle?.IsHovered == true))
return; return;
displayedRotationHandle?.FadeOut(SelectionBoxControl.TRANSFORM_DURATION, Easing.OutQuint); displayedRotationHandle?.FadeOut(SelectionBoxControl.TRANSFORM_DURATION, Easing.OutQuint);
displayedRotationHandle = null; displayedRotationHandle = null;
activeHandle = allDragHandles.SingleOrDefault(h => h.IsHeld); // if the active handle is not a rotation handle but is held, then keep the rotation handle hidden.
if (activeHandle?.IsHeld == true)
return;
activeHandle = rotationHandles.SingleOrDefault(h => h.IsHeld || h.IsHovered);
activeHandle ??= allDragHandles.SingleOrDefault(h => h.IsHovered); activeHandle ??= allDragHandles.SingleOrDefault(h => h.IsHovered);
if (activeHandle != null) if (activeHandle != null)