Browse Source

Implement indexed sort for visual children.

pull/6271/head
Dariusz Komosinski 5 years ago
parent
commit
0c80f885b7
  1. 20
      src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs

20
src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.Platform; using Avalonia.Platform;
using Avalonia.Threading; using Avalonia.Threading;
@ -258,14 +259,25 @@ namespace Avalonia.Rendering.SceneGraph
} }
else if (visualChildren.Count > 1) else if (visualChildren.Count > 1)
{ {
var sortedChildren = new IVisual[visualChildren.Count]; var count = visualChildren.Count;
visualChildren.CopyTo(sortedChildren, 0); var sortedChildren = new (IVisual visual, int index)[count];
Array.Sort(sortedChildren, ZIndexComparer.ComparisonInstance); for (var i = 0; i < count; i++)
{
sortedChildren[i] = (visualChildren[i], i);
}
// Regular Array.Sort is unstable, we need to provide indices as well to avoid reshuffling elements.
Array.Sort(sortedChildren, (lhs, rhs) =>
{
var result = ZIndexComparer.Instance.Compare(lhs.visual, rhs.visual);
return result == 0 ? lhs.index.CompareTo(rhs.index) : result;
});
foreach (var child in sortedChildren) foreach (var child in sortedChildren)
{ {
var childNode = GetOrCreateChildNode(scene, child, node); var childNode = GetOrCreateChildNode(scene, child.Item1, node);
Update(context, scene, (VisualNode)childNode, clip, forceRecurse); Update(context, scene, (VisualNode)childNode, clip, forceRecurse);
} }
} }

Loading…
Cancel
Save