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

remove Validating event and instead call validation explicitly on edits

This commit is contained in:
OliBomby 2024-01-13 22:39:09 +01:00
parent da4d83f8ca
commit 39908f5425
4 changed files with 14 additions and 16 deletions

View File

@ -76,23 +76,12 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
controlPoints.CollectionChanged += onControlPointsChanged;
controlPoints.BindTo(hitObject.Path.ControlPoints);
// schedule ensure that updates are only applied after all operations from a single frame are applied.
// this avoids inadvertently changing the hit object path type for batch operations.
hitObject.Path.Validating += ensureValidPathTypes;
}
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
hitObject.Path.Validating -= ensureValidPathTypes;
}
/// <summary>
/// Handles correction of invalid path types.
/// </summary>
private void ensureValidPathTypes()
public void EnsureValidPathTypes()
{
List<PathControlPoint> pointsInCurrentSegment = new List<PathControlPoint>();
@ -113,6 +102,9 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
private void ensureValidPathType(IReadOnlyList<PathControlPoint> segment)
{
if (segment.Count == 0)
return;
var first = segment[0];
if (first.Type != PathType.PERFECT_CURVE)
@ -394,6 +386,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
// Maintain the path types in case they got defaulted to bezier at some point during the drag.
for (int i = 0; i < hitObject.Path.ControlPoints.Count; i++)
hitObject.Path.ControlPoints[i].Type = dragPathTypes[i];
EnsureValidPathTypes();
}
public void DragEnded() => changeHandler?.EndChange();
@ -467,6 +461,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
{
foreach (var p in Pieces.Where(p => p.IsSelected.Value))
updatePathType(p, type);
EnsureValidPathTypes();
});
if (countOfState == totalCount)

View File

@ -316,6 +316,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
private void updateSlider()
{
controlPointVisualiser.EnsureValidPathTypes();
if (state == SliderPlacementState.Drawing)
HitObject.Path.ExpectedDistance.Value = (float)HitObject.Path.CalculatedDistance;
else

View File

@ -254,6 +254,8 @@ 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, pathControlPoint);
ControlPointVisualiser?.EnsureValidPathTypes();
HitObject.SnapTo(distanceSnapProvider);
return pathControlPoint;
@ -275,6 +277,8 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
controlPoints.Remove(c);
}
ControlPointVisualiser?.EnsureValidPathTypes();
// Snap the slider to the current beat divisor before checking length validity.
HitObject.SnapTo(distanceSnapProvider);

View File

@ -25,8 +25,6 @@ namespace osu.Game.Rulesets.Objects
private readonly Bindable<int> version = new Bindable<int>();
public event Action? Validating;
/// <summary>
/// The user-set distance of the path. If non-null, <see cref="Distance"/> will match this value,
/// and the path will be shortened/lengthened to match this length.
@ -235,8 +233,6 @@ namespace osu.Game.Rulesets.Objects
if (pathCache.IsValid)
return;
Validating?.Invoke();
calculatePath();
calculateLength();