Browse Source

Merge branch 'master' into master

pull/3024/head
Steven Kirk 7 years ago
committed by GitHub
parent
commit
a6ea581f54
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      build/Microsoft.Reactive.Testing.props
  2. 2
      build/ReactiveUI.props
  3. 3
      dirs.proj
  4. 7
      samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs
  5. 20
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  6. 2
      src/Avalonia.ReactiveUI/RoutedViewHost.cs
  7. 2
      src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
  8. 10
      src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs
  9. 15
      src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs
  10. 22
      tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
  11. 2
      tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs
  12. 49
      tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs
  13. 4
      tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs
  14. 2
      tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs

2
build/Microsoft.Reactive.Testing.props

@ -1,5 +1,5 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<PackageReference Include="Microsoft.Reactive.Testing" Version="4.0.0" />
<PackageReference Include="Microsoft.Reactive.Testing" Version="4.1.6" />
</ItemGroup>
</Project>

2
build/ReactiveUI.props

@ -1,5 +1,5 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<PackageReference Include="ReactiveUI" Version="10.1.1" />
<PackageReference Include="ReactiveUI" Version="10.3.6" />
</ItemGroup>
</Project>

3
dirs.proj

@ -8,7 +8,8 @@
<ProjectReference Remove="src/Markup/Avalonia.Markup.Xaml/PortableXaml/**/*.*proj" />
<ProjectReference Remove="src/Markup/Avalonia.Markup.Xaml/XamlIl/**/*.*proj" />
</ItemGroup>
<ItemGroup Condition="!Exists('$(MSBuildExtensionsPath)\Xamarin\Android')">
<!--<ItemGroup Condition="!Exists('$(MSBuildExtensionsPath)\Xamarin\Android')">-->
<ItemGroup>
<ProjectReference Remove="src/Android/**/*.*proj" />
<ProjectReference Remove="samples/ControlCatalog.Android/ControlCatalog.Android.csproj" />
</ItemGroup>

7
samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs

@ -28,12 +28,11 @@ namespace VirtualizationDemo.ViewModels
public MainWindowViewModel()
{
this.WhenAnyValue(x => x.ItemCount).Subscribe(ResizeItems);
RecreateCommand = ReactiveCommand.Create(() => Recreate());
RecreateCommand = ReactiveCommand.Create(Recreate);
AddItemCommand = ReactiveCommand.Create(() => AddItem());
AddItemCommand = ReactiveCommand.Create(AddItem);
RemoveItemCommand = ReactiveCommand.Create(Remove);
RemoveItemCommand = ReactiveCommand.Create(() => Remove());
SelectFirstCommand = ReactiveCommand.Create(() => SelectItem(0));

20
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@ -304,6 +304,11 @@ namespace Avalonia.Controls.Primitives
{
base.ItemsCollectionChanged(sender, e);
if (_updateCount > 0)
{
return;
}
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
@ -1071,13 +1076,20 @@ namespace Avalonia.Controls.Primitives
private void UpdateFinished()
{
if (_updateSelectedIndex != int.MinValue)
if (_updateSelectedItem != null)
{
SelectedIndex = _updateSelectedIndex;
SelectedItem = _updateSelectedItem;
}
else if (_updateSelectedItem != null)
else
{
SelectedItem = _updateSelectedItem;
if (ItemCount == 0 && SelectedIndex != -1)
{
SelectedIndex = -1;
}
else
{
SelectedIndex = _updateSelectedIndex != int.MinValue ? _updateSelectedIndex : 0;
}
}
}

2
src/Avalonia.ReactiveUI/RoutedViewHost.cs

@ -118,4 +118,4 @@ namespace Avalonia.ReactiveUI
Content = viewInstance;
}
}
}
}

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

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

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

@ -53,6 +53,16 @@ namespace Avalonia.Rendering.SceneGraph
if (visual.VisualRoot != null)
{
if (node?.Parent != null &&
visual.VisualParent != null &&
node.Parent.Visual != visual.VisualParent)
{
// The control has changed parents. Remove the node and recurse into the new parent node.
((VisualNode)node.Parent).RemoveChild(node);
Deindex(scene, node);
node = (VisualNode)scene.FindNode(visual.VisualParent);
}
if (visual.IsVisible)
{
// If the node isn't yet part of the scene, find the nearest ancestor that is.

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

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

22
tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs

@ -109,6 +109,28 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.True(items[1].IsSelected);
}
[Fact]
public void Setting_SelectedIndex_During_Initialize_Should_Select_Item_When_AlwaysSelected_Is_Used()
{
var listBox = new ListBox
{
SelectionMode = SelectionMode.Single | SelectionMode.AlwaysSelected
};
listBox.BeginInit();
listBox.SelectedIndex = 1;
var items = new AvaloniaList<string>();
listBox.Items = items;
items.Add("A");
items.Add("B");
items.Add("C");
listBox.EndInit();
Assert.Equal("B", listBox.SelectedItem);
}
[Fact]
public void Setting_SelectedIndex_Before_ApplyTemplate_Should_Set_Item_IsSelected_True()
{

2
tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs

@ -120,6 +120,8 @@ namespace Avalonia.Markup.UnitTests.Parsers
var result = run();
result.Item1.Subscribe(x => { });
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Assert.Null(result.Item2.Target);

49
tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs

@ -96,6 +96,55 @@ namespace Avalonia.Visuals.UnitTests.Rendering
Assert.Equal(new List<IVisual> { root, decorator, border, canvas }, result);
}
[Fact]
public void Should_Add_Dirty_Rect_On_Child_Remove()
{
var dispatcher = new ImmediateDispatcher();
var loop = new Mock<IRenderLoop>();
Decorator decorator;
Border border;
var root = new TestRoot
{
Width = 100,
Height= 100,
Child = decorator = new Decorator
{
Child = border = new Border
{
Width = 50,
Height = 50,
Background = Brushes.Red,
},
}
};
root.Measure(Size.Infinity);
root.Arrange(new Rect(root.DesiredSize));
var sceneBuilder = new SceneBuilder();
var target = new DeferredRenderer(
root,
loop.Object,
sceneBuilder: sceneBuilder,
dispatcher: dispatcher);
root.Renderer = target;
target.Start();
RunFrame(target);
decorator.Child = null;
RunFrame(target);
var scene = target.UnitTestScene();
var stackNode = scene.FindNode(decorator);
var dirty = scene.Layers[0].Dirty.ToList();
Assert.Equal(1, dirty.Count);
Assert.Equal(new Rect(25, 25, 50, 50), dirty[0]);
}
[Fact]
public void Should_Update_VisualNode_Order_On_Child_Remove_Insert()
{

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

@ -521,8 +521,8 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
moveFromNode = (VisualNode)scene.FindNode(moveFrom);
moveToNode = (VisualNode)scene.FindNode(moveTo);
moveFromNode.UpdateChildren(scene);
moveToNode.UpdateChildren(scene);
moveFromNode.SortChildren(scene);
moveToNode.SortChildren(scene);
sceneBuilder.Update(scene, moveFrom);
sceneBuilder.Update(scene, moveTo);
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 scene = new Scene(Mock.Of<IVisual>());
node.UpdateChildren(scene);
node.SortChildren(scene);
}
}
}

Loading…
Cancel
Save