Skip to content

Commit

Permalink
Merge pull request #6160 from smoogipoo/fix-nested-absolute-sequences
Browse files Browse the repository at this point in the history
Fix nested absolute sequences
  • Loading branch information
peppy authored Jan 29, 2024
2 parents 7b4f3b4 + b2b890e commit a1585bf
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 5 deletions.
21 changes: 21 additions & 0 deletions osu.Framework.Tests/Visual/Drawables/TestSceneTransformSequence.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,27 @@ public void TestValidation()
AddStep("zero child size", () => Assert.Throws<ArgumentException>(() => boxes[0].TransformRelativeChildSizeTo(Vector2.Zero)));
}

[Test]
public void TestNestedAbsoluteSequence()
{
AddStep("Animate", () =>
{
setup();
animate();
});

AddStep("start absolute sequence", () =>
{
using (BeginAbsoluteSequence(0))
{
using (boxes[0].BeginAbsoluteSequence(Time.Current))
{
boxes[0].FadeInFromZero(1000);
}
}
});
}

private void setup()
{
finalizeTriggered = false;
Expand Down
18 changes: 13 additions & 5 deletions osu.Framework/Graphics/Containers/CompositeDrawable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1323,19 +1323,27 @@ public override IDisposable BeginAbsoluteSequence(double newTransformStartTime,
absoluteSequenceActions ??= new List<AbsoluteSequenceSender>();
absoluteSequenceActions.EnsureCapacity(internalChildren.Count + 1);

base.CollectAbsoluteSequenceActionsFromSubTree(newTransformStartTime, absoluteSequenceActions);
int startCount = absoluteSequenceActions.Count;

base.CollectAbsoluteSequenceActionsFromSubTree(newTransformStartTime, absoluteSequenceActions);
foreach (var c in internalChildren)
c.CollectAbsoluteSequenceActionsFromSubTree(newTransformStartTime, absoluteSequenceActions);

return new ValueInvokeOnDisposal<List<AbsoluteSequenceSender>>(absoluteSequenceActions, actions =>
int sequenceLength = absoluteSequenceActions.Count - startCount;

return new ValueInvokeOnDisposal<AbsoluteSequenceRange>(new AbsoluteSequenceRange(absoluteSequenceActions, sequenceLength), static range =>
{
foreach (var a in actions)
a.Dispose();
actions.Clear();
int startIndex = range.Sequence.Count - range.Length;
for (int i = startIndex; i < range.Sequence.Count; i++)
range.Sequence[i].Dispose();
range.Sequence.RemoveRange(startIndex, range.Length);
});
}

private readonly record struct AbsoluteSequenceRange(List<AbsoluteSequenceSender> Sequence, int Length);

internal override void CollectAbsoluteSequenceActionsFromSubTree(double newTransformStartTime, List<AbsoluteSequenceSender> actions)
{
base.CollectAbsoluteSequenceActionsFromSubTree(newTransformStartTime, actions);
Expand Down

0 comments on commit a1585bf

Please sign in to comment.