diff --git a/osu.Game/Rulesets/Objects/SliderPath.cs b/osu.Game/Rulesets/Objects/SliderPath.cs
index bbeb03992e..6ad5d2f1c3 100644
--- a/osu.Game/Rulesets/Objects/SliderPath.cs
+++ b/osu.Game/Rulesets/Objects/SliderPath.cs
@@ -16,6 +16,13 @@ namespace osu.Game.Rulesets.Objects
{
public class SliderPath
{
+ ///
+ /// The current version of this . Updated when any change to the path occurs.
+ ///
+ public IBindable Version => version;
+
+ private readonly Bindable version = new Bindable();
+
///
/// The user-set distance of the path. If non-null, will match this value,
/// and the path will be shortened/lengthened to match this length.
@@ -39,25 +46,23 @@ namespace osu.Game.Rulesets.Objects
///
public SliderPath()
{
- ExpectedDistance.ValueChanged += _ => pathCache.Invalidate();
+ ExpectedDistance.ValueChanged += _ => invalidate();
ControlPoints.ItemsAdded += items =>
{
foreach (var c in items)
- c.Changed += onControlPointChanged;
+ c.Changed += invalidate;
- onControlPointChanged();
+ invalidate();
};
ControlPoints.ItemsRemoved += items =>
{
foreach (var c in items)
- c.Changed -= onControlPointChanged;
+ c.Changed -= invalidate;
- onControlPointChanged();
+ invalidate();
};
-
- void onControlPointChanged() => pathCache.Invalidate();
}
///
@@ -141,6 +146,12 @@ namespace osu.Game.Rulesets.Objects
return interpolateVertices(indexOfDistance(d), d);
}
+ private void invalidate()
+ {
+ pathCache.Invalidate();
+ version.Value++;
+ }
+
private void ensureValid()
{
if (pathCache.IsValid)