Skip to content

Commit

Permalink
Merge pull request #1106 from AvaloniaUI/fixes/1096-popup-scene-not-u…
Browse files Browse the repository at this point in the history
…pdating

Clear scene for invisible root visuals.
  • Loading branch information
grokys authored Aug 20, 2017
2 parents d6c9fb6 + bbd585e commit 67959ee
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 45 deletions.
42 changes: 24 additions & 18 deletions src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using System.IO;
using Avalonia.Media.Immutable;
using System.Threading;
using System.Linq;

namespace Avalonia.Rendering
{
Expand Down Expand Up @@ -58,7 +59,6 @@ public DeferredRenderer(
_dispatcher = dispatcher ?? Dispatcher.UIThread;
_root = root;
_sceneBuilder = sceneBuilder ?? new SceneBuilder();
_scene = new Scene(root);
_layerFactory = layerFactory ?? new DefaultRenderLayerFactory();
_layers = new RenderLayers(_layerFactory);
_renderLoop = renderLoop;
Expand Down Expand Up @@ -86,7 +86,6 @@ public DeferredRenderer(
_root = root;
_renderTarget = renderTarget;
_sceneBuilder = sceneBuilder ?? new SceneBuilder();
_scene = new Scene(root);
_layerFactory = layerFactory ?? new DefaultRenderLayerFactory();
_layers = new RenderLayers(_layerFactory);
}
Expand Down Expand Up @@ -122,7 +121,7 @@ public IEnumerable<IVisual> HitTest(Point p, Func<IVisual, bool> filter)
UpdateScene();
}

return _scene.HitTest(p, filter);
return _scene?.HitTest(p, filter) ?? Enumerable.Empty<IVisual>();
}

/// <inheritdoc/>
Expand Down Expand Up @@ -186,7 +185,7 @@ private void Render(Scene scene)
_dirtyRectsDisplay.Tick();
}

if (scene.Size != Size.Empty)
if (scene != null && scene.Size != Size.Empty)
{
if (scene.Generation != _lastSceneId)
{
Expand Down Expand Up @@ -366,25 +365,32 @@ private void UpdateScene()

try
{
var scene = _scene.Clone();

if (_dirty == null)
{
_dirty = new DirtyVisuals();
_sceneBuilder.UpdateAll(scene);
}
else if (_dirty.Count > 0)
if (_root.IsVisible)
{
foreach (var visual in _dirty)
var scene = _scene?.Clone() ?? new Scene(_root);

if (_dirty == null)
{
_sceneBuilder.Update(scene, visual);
_dirty = new DirtyVisuals();
_sceneBuilder.UpdateAll(scene);
}
else if (_dirty.Count > 0)
{
foreach (var visual in _dirty)
{
_sceneBuilder.Update(scene, visual);
}
}
}

Interlocked.Exchange(ref _scene, scene);
Interlocked.Exchange(ref _scene, scene);

_dirty.Clear();
(_root as IRenderRoot)?.Invalidate(new Rect(scene.Size));
_dirty.Clear();
(_root as IRenderRoot)?.Invalidate(new Rect(scene.Size));
}
else
{
Interlocked.Exchange(ref _scene, null);
}
}
finally
{
Expand Down
6 changes: 6 additions & 0 deletions src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,14 @@ public bool Update(Scene scene, IVisual visual)
{
Contract.Requires<ArgumentNullException>(scene != null);
Contract.Requires<ArgumentNullException>(visual != null);

Dispatcher.UIThread.VerifyAccess();

if (!scene.Root.Visual.IsVisible)
{
throw new AvaloniaInternalException("Cannot update the scene for an invisible root visual.");
}

var node = (VisualNode)scene.FindNode(visual);

if (visual == scene.Root.Visual)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,32 +273,5 @@ public void GeometryClip_Should_Affect_Child_Layers()
((MockStreamGeometryImpl)borderLayer.GeometryClip).Transform);
}
}

[Fact]
public void Hiding_Root_Should_Not_Remove_Root_Layer()
{
using (TestApplication())
{
Border border;
var tree = new TestRoot
{
Child = border = new Border()
};

var layout = AvaloniaLocator.Current.GetService<ILayoutManager>();
layout.ExecuteInitialLayoutPass(tree);

var scene = new Scene(tree);
var sceneBuilder = new SceneBuilder();
sceneBuilder.UpdateAll(scene);

tree.IsVisible = false;

scene = scene.Clone();
sceneBuilder.Update(scene, tree);

Assert.Equal(1, scene.Layers.Count);
}
}
}
}

0 comments on commit 67959ee

Please sign in to comment.