Browse Source

Handle reparenting controls in SceneBuilder.

Renamed `VisualNode.SortChildren` -> `UpdateChildren` and make it remove nodes for controls that are no longer children.
pull/3004/head
Steven Kirk 7 years ago
parent
commit
db8751d711
  1. 2
      src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
  2. 15
      src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs
  3. 4
      tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs
  4. 2
      tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs

2
src/Avalonia.Visuals/Rendering/DeferredRenderer.cs

@ -540,7 +540,7 @@ namespace Avalonia.Rendering
foreach (var visual in _recalculateChildren) foreach (var visual in _recalculateChildren)
{ {
var node = scene.FindNode(visual); var node = scene.FindNode(visual);
((VisualNode)node)?.SortChildren(scene); ((VisualNode)node)?.UpdateChildren(scene);
} }
_recalculateChildren.Clear(); _recalculateChildren.Clear();

15
src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs

@ -174,12 +174,12 @@ namespace Avalonia.Rendering.SceneGraph
/// <summary> /// <summary>
/// Sorts the <see cref="Children"/> collection according to the order of the visual's /// Sorts the <see cref="Children"/> collection according to the order of the visual's
/// children and their z-index. /// children and their z-index and removes controls that are no longer children.
/// </summary> /// </summary>
/// <param name="scene">The scene that the node is a part of.</param> /// <param name="scene">The scene that the node is a part of.</param>
public void SortChildren(Scene scene) public void UpdateChildren(Scene scene)
{ {
if (_children == null || _children.Count <= 1) if (_children == null || _children.Count == 0)
{ {
return; return;
} }
@ -193,9 +193,12 @@ namespace Avalonia.Rendering.SceneGraph
keys.Add(((long)zIndex << 32) + i); keys.Add(((long)zIndex << 32) + i);
} }
var toRemove = _children.ToList();
keys.Sort(); keys.Sort();
_children.Clear(); _children.Clear();
foreach (var i in keys) foreach (var i in keys)
{ {
var child = Visual.VisualChildren[(int)(i & 0xffffffff)]; var child = Visual.VisualChildren[(int)(i & 0xffffffff)];
@ -204,8 +207,14 @@ namespace Avalonia.Rendering.SceneGraph
if (node != null) if (node != null)
{ {
_children.Add(node); _children.Add(node);
toRemove.Remove(node);
} }
} }
foreach (var node in toRemove)
{
scene.Remove(node);
}
} }
/// <summary> /// <summary>

4
tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs

@ -521,8 +521,8 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
moveFromNode = (VisualNode)scene.FindNode(moveFrom); moveFromNode = (VisualNode)scene.FindNode(moveFrom);
moveToNode = (VisualNode)scene.FindNode(moveTo); moveToNode = (VisualNode)scene.FindNode(moveTo);
moveFromNode.SortChildren(scene); moveFromNode.UpdateChildren(scene);
moveToNode.SortChildren(scene); moveToNode.UpdateChildren(scene);
sceneBuilder.Update(scene, moveFrom); sceneBuilder.Update(scene, moveFrom);
sceneBuilder.Update(scene, moveTo); sceneBuilder.Update(scene, moveTo);
sceneBuilder.Update(scene, moveMe); sceneBuilder.Update(scene, moveMe);

2
tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs

@ -99,7 +99,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
var node = new VisualNode(Mock.Of<IVisual>(), null); var node = new VisualNode(Mock.Of<IVisual>(), null);
var scene = new Scene(Mock.Of<IVisual>()); var scene = new Scene(Mock.Of<IVisual>());
node.SortChildren(scene); node.UpdateChildren(scene);
} }
} }
} }

Loading…
Cancel
Save