hold shift to adjust velocity instead of duration

This commit is contained in:
OliBomby 2024-07-22 11:34:07 +02:00
parent c1414f332e
commit 9fb9a54a4d
1 changed files with 38 additions and 9 deletions

View File

@ -227,10 +227,19 @@ protected override bool OnMouseDown(MouseDownEvent e)
}
private Vector2 lengthAdjustMouseOffset;
private double oldDuration;
private double oldVelocity;
private double desiredDistance;
private bool isAdjustingLength;
private bool adjustVelocityMomentary;
private void startAdjustingLength(DragStartEvent e)
{
isAdjustingLength = true;
adjustVelocityMomentary = e.ShiftPressed;
lengthAdjustMouseOffset = ToLocalSpace(e.ScreenSpaceMouseDownPosition) - HitObject.Position - HitObject.Path.PositionAt(1);
oldDuration = HitObject.Path.Distance / HitObject.SliderVelocityMultiplier;
oldVelocity = HitObject.SliderVelocityMultiplier;
changeHandler?.BeginChange();
}
@ -238,22 +247,27 @@ private void endAdjustLength()
{
trimExcessControlPoints(HitObject.Path);
changeHandler?.EndChange();
isAdjustingLength = false;
}
private void adjustLength(MouseEvent e)
private void adjustLength(MouseEvent e) => adjustLength(findClosestPathDistance(e), e.ShiftPressed);
private void adjustLength(double proposedDistance, bool adjustVelocity)
{
double oldDistance = HitObject.Path.Distance;
double proposedDistance = findClosestPathDistance(e);
desiredDistance = proposedDistance;
proposedDistance = MathHelper.Clamp(proposedDistance, 1, HitObject.Path.CalculatedDistance);
double proposedVelocity = oldVelocity;
proposedDistance = MathHelper.Clamp(proposedDistance, 0, HitObject.Path.CalculatedDistance);
proposedDistance = MathHelper.Clamp(proposedDistance,
0.1 * oldDistance / HitObject.SliderVelocityMultiplier,
10 * oldDistance / HitObject.SliderVelocityMultiplier);
if (adjustVelocity)
{
proposedDistance = MathHelper.Clamp(proposedDistance, 0.1 * oldDuration, 10 * oldDuration);
proposedVelocity = proposedDistance / oldDuration;
}
if (Precision.AlmostEquals(proposedDistance, oldDistance))
if (Precision.AlmostEquals(proposedDistance, HitObject.Path.Distance) && Precision.AlmostEquals(proposedVelocity, HitObject.SliderVelocityMultiplier))
return;
HitObject.SliderVelocityMultiplier *= proposedDistance / oldDistance;
HitObject.SliderVelocityMultiplier = proposedVelocity;
HitObject.Path.ExpectedDistance.Value = proposedDistance;
editorBeatmap?.Update(HitObject);
}
@ -374,9 +388,24 @@ protected override bool OnKeyDown(KeyDownEvent e)
return true;
}
if (isAdjustingLength && e.ShiftPressed != adjustVelocityMomentary)
{
adjustVelocityMomentary = e.ShiftPressed;
adjustLength(desiredDistance, adjustVelocityMomentary);
return true;
}
return false;
}
protected override void OnKeyUp(KeyUpEvent e)
{
if (!IsSelected || !isAdjustingLength || e.ShiftPressed == adjustVelocityMomentary) return;
adjustVelocityMomentary = e.ShiftPressed;
adjustLength(desiredDistance, adjustVelocityMomentary);
}
private PathControlPoint addControlPoint(Vector2 position)
{
position -= HitObject.Position;