From e700832ee075a79a1d021e4662b1f5fa7baf7b65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Pedro?= Date: Thu, 5 Sep 2019 17:27:41 +0100 Subject: [PATCH 01/32] Updated ReactiveUI to version 10.0.1. --- build/ReactiveUI.props | 2 +- build/Rx.props | 2 +- .../ViewModels/MainWindowViewModel.cs | 7 ++--- .../ViewModels/MainWindowViewModel.cs | 5 ++-- .../ViewModels/MainWindowViewModel.cs | 27 ++++++++++--------- .../AvaloniaActivationForViewFetcher.cs | 2 +- src/Avalonia.ReactiveUI/RoutedViewHost.cs | 4 +-- .../AvaloniaActivationForViewFetcherTest.cs | 8 +++--- 8 files changed, 30 insertions(+), 27 deletions(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index 1208be34b8..1292f52c4a 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - + diff --git a/build/Rx.props b/build/Rx.props index 359ce53a92..edff0af160 100644 --- a/build/Rx.props +++ b/build/Rx.props @@ -1,5 +1,5 @@  - + diff --git a/samples/BindingDemo/ViewModels/MainWindowViewModel.cs b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs index 858fb5159a..22d01e0765 100644 --- a/samples/BindingDemo/ViewModels/MainWindowViewModel.cs +++ b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs @@ -1,10 +1,11 @@ using System; using System.Collections.ObjectModel; using System.Linq; -using ReactiveUI; +using System.Reactive; using System.Reactive.Linq; using System.Threading.Tasks; using System.Threading; +using ReactiveUI; namespace BindingDemo.ViewModels { @@ -56,7 +57,7 @@ namespace BindingDemo.ViewModels public ObservableCollection Items { get; } public ObservableCollection SelectedItems { get; } - public ReactiveCommand ShuffleItems { get; } + public ReactiveCommand ShuffleItems { get; } public string BooleanString { @@ -89,7 +90,7 @@ namespace BindingDemo.ViewModels } public IObservable CurrentTimeObservable { get; } - public ReactiveCommand StringValueCommand { get; } + public ReactiveCommand StringValueCommand { get; } public DataAnnotationsErrorViewModel DataAnnotationsValidation { get; } = new DataAnnotationsErrorViewModel(); public ExceptionErrorViewModel ExceptionDataValidation { get; } = new ExceptionErrorViewModel(); diff --git a/samples/RenderDemo/ViewModels/MainWindowViewModel.cs b/samples/RenderDemo/ViewModels/MainWindowViewModel.cs index 0cb5e1b87b..d2d789a687 100644 --- a/samples/RenderDemo/ViewModels/MainWindowViewModel.cs +++ b/samples/RenderDemo/ViewModels/MainWindowViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.Reactive; using ReactiveUI; namespace RenderDemo.ViewModels @@ -26,7 +27,7 @@ namespace RenderDemo.ViewModels set { this.RaiseAndSetIfChanged(ref drawFps, value); } } - public ReactiveCommand ToggleDrawDirtyRects { get; } - public ReactiveCommand ToggleDrawFps { get; } + public ReactiveCommand ToggleDrawDirtyRects { get; } + public ReactiveCommand ToggleDrawFps { get; } } } diff --git a/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs b/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs index 93fe09a156..37c7178c56 100644 --- a/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs +++ b/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs @@ -4,10 +4,10 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reactive; using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Controls.Primitives; -using ReactiveUI.Legacy; using ReactiveUI; using Avalonia.Layout; @@ -18,7 +18,7 @@ namespace VirtualizationDemo.ViewModels private int _itemCount = 200; private string _newItemString = "New Item"; private int _newItemIndex; - private IReactiveList _items; + private AvaloniaList _items; private string _prefix = "Item"; private ScrollBarVisibility _horizontalScrollBarVisibility = ScrollBarVisibility.Auto; private ScrollBarVisibility _verticalScrollBarVisibility = ScrollBarVisibility.Auto; @@ -28,11 +28,12 @@ namespace VirtualizationDemo.ViewModels public MainWindowViewModel() { this.WhenAnyValue(x => x.ItemCount).Subscribe(ResizeItems); - RecreateCommand = ReactiveCommand.Create(() => Recreate()); - AddItemCommand = ReactiveCommand.Create(() => AddItem()); + RecreateCommand = ReactiveCommand.Create(Recreate); - RemoveItemCommand = ReactiveCommand.Create(() => Remove()); + AddItemCommand = ReactiveCommand.Create(AddItem); + + RemoveItemCommand = ReactiveCommand.Create(Remove); SelectFirstCommand = ReactiveCommand.Create(() => SelectItem(0)); @@ -54,7 +55,7 @@ namespace VirtualizationDemo.ViewModels public AvaloniaList SelectedItems { get; } = new AvaloniaList(); - public IReactiveList Items + public AvaloniaList Items { get { return _items; } private set { this.RaiseAndSetIfChanged(ref _items, value); } @@ -93,11 +94,11 @@ namespace VirtualizationDemo.ViewModels public IEnumerable VirtualizationModes => Enum.GetValues(typeof(ItemVirtualizationMode)).Cast(); - public ReactiveCommand AddItemCommand { get; private set; } - public ReactiveCommand RecreateCommand { get; private set; } - public ReactiveCommand RemoveItemCommand { get; private set; } - public ReactiveCommand SelectFirstCommand { get; private set; } - public ReactiveCommand SelectLastCommand { get; private set; } + public ReactiveCommand AddItemCommand { get; private set; } + public ReactiveCommand RecreateCommand { get; private set; } + public ReactiveCommand RemoveItemCommand { get; private set; } + public ReactiveCommand SelectFirstCommand { get; private set; } + public ReactiveCommand SelectLastCommand { get; private set; } public void RandomizeSize() { @@ -123,7 +124,7 @@ namespace VirtualizationDemo.ViewModels { var items = Enumerable.Range(0, count) .Select(x => new ItemViewModel(x)); - Items = new ReactiveList(items); + Items = new AvaloniaList(items); } else if (count > Items.Count) { @@ -162,7 +163,7 @@ namespace VirtualizationDemo.ViewModels _prefix = _prefix == "Item" ? "Recreated" : "Item"; var items = Enumerable.Range(0, _itemCount) .Select(x => new ItemViewModel(x, _prefix)); - Items = new ReactiveList(items); + Items = new AvaloniaList(items); } private void SelectItem(int index) diff --git a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs index cfa7a270be..5a4d625c41 100644 --- a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs +++ b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs @@ -27,7 +27,7 @@ namespace Avalonia.ReactiveUI /// /// Returns activation observable for activatable Avalonia view. /// - public IObservable GetActivationForView(IActivatable view) + public IObservable GetActivationForView(IActivatableView view) { if (!(view is IVisual visual)) return Observable.Return(false); if (view is WindowBase window) return GetActivationForWindowBase(window); diff --git a/src/Avalonia.ReactiveUI/RoutedViewHost.cs b/src/Avalonia.ReactiveUI/RoutedViewHost.cs index 05edeea683..5d96fd264a 100644 --- a/src/Avalonia.ReactiveUI/RoutedViewHost.cs +++ b/src/Avalonia.ReactiveUI/RoutedViewHost.cs @@ -53,7 +53,7 @@ namespace Avalonia.ReactiveUI /// ReactiveUI routing documentation website for more info. /// /// - public class RoutedViewHost : TransitioningContentControl, IActivatable, IEnableLogger + public class RoutedViewHost : TransitioningContentControl, IActivatableView, IEnableLogger { /// /// for the property. @@ -118,4 +118,4 @@ namespace Avalonia.ReactiveUI Content = viewInstance; } } -} \ No newline at end of file +} diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs index 1d85312b1a..643dd3efac 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs @@ -20,9 +20,9 @@ namespace Avalonia.ReactiveUI.UnitTests { public class AvaloniaActivationForViewFetcherTest { - public class TestUserControl : UserControl, IActivatable { } + public class TestUserControl : UserControl, IActivatableView { } - public class TestUserControlWithWhenActivated : UserControl, IActivatable + public class TestUserControlWithWhenActivated : UserControl, IActivatableView { public bool Active { get; private set; } @@ -38,7 +38,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class TestWindowWithWhenActivated : Window, IActivatable + public class TestWindowWithWhenActivated : Window, IActivatableView { public bool Active { get; private set; } @@ -54,7 +54,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class ActivatableViewModel : ISupportsActivation + public class ActivatableViewModel : IActivatableViewModel { public ViewModelActivator Activator { get; } From 570313f392896d3e3d66b24e7bda8742f1d414cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Pedro?= Date: Fri, 6 Sep 2019 16:31:56 +0100 Subject: [PATCH 02/32] Updated System.Memory to version 4.5.3. --- build/System.Memory.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/System.Memory.props b/build/System.Memory.props index b328f7fd97..b36998a780 100644 --- a/build/System.Memory.props +++ b/build/System.Memory.props @@ -1,5 +1,5 @@ - + From b6d77a7a0f531da0a2f045c47eb238e019eb4770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Pedro?= Date: Sun, 8 Sep 2019 18:58:26 +0100 Subject: [PATCH 03/32] Updated ReactiveUI to version 10.1.1. --- build/ReactiveUI.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index 1292f52c4a..7caeaf90ae 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - + From 1cf93ad393540cd81383708fbc4e16781765f932 Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Tue, 17 Sep 2019 23:04:12 -0400 Subject: [PATCH 04/32] Add ItemWidth and ItemHeight properties to WrapPanel (with unit tests) --- src/Avalonia.Controls/WrapPanel.cs | 198 +++++++++++------- .../WrapPanelTests.cs | 23 ++ 2 files changed, 150 insertions(+), 71 deletions(-) diff --git a/src/Avalonia.Controls/WrapPanel.cs b/src/Avalonia.Controls/WrapPanel.cs index 3acf341c35..418a59b64e 100644 --- a/src/Avalonia.Controls/WrapPanel.cs +++ b/src/Avalonia.Controls/WrapPanel.cs @@ -15,7 +15,7 @@ namespace Avalonia.Controls /// Positions child elements in sequential position from left to right, /// breaking content to the next line at the edge of the containing box. /// Subsequent ordering happens sequentially from top to bottom or from right to left, - /// depending on the value of the Orientation property. + /// depending on the value of the property. /// public class WrapPanel : Panel, INavigableContainer { @@ -25,6 +25,18 @@ namespace Avalonia.Controls public static readonly StyledProperty OrientationProperty = AvaloniaProperty.Register(nameof(Orientation), defaultValue: Orientation.Horizontal); + /// + /// Defines the property. + /// + public static readonly StyledProperty ItemWidthProperty = + AvaloniaProperty.Register(nameof(ItemWidth), double.NaN); + + /// + /// Defines the property. + /// + public static readonly StyledProperty ItemHeightProperty = + AvaloniaProperty.Register(nameof(ItemHeight), double.NaN); + /// /// Initializes static members of the class. /// @@ -42,6 +54,24 @@ namespace Avalonia.Controls set { SetValue(OrientationProperty, value); } } + /// + /// Gets or sets the width of all items in the WrapPanel. + /// + public double ItemWidth + { + get { return GetValue(ItemWidthProperty); } + set { SetValue(ItemWidthProperty, value); } + } + + /// + /// Gets or sets the height of all items in the WrapPanel. + /// + public double ItemHeight + { + get { return GetValue(ItemHeightProperty); } + set { SetValue(ItemHeightProperty, value); } + } + /// /// Gets the next control in the specified direction. /// @@ -51,7 +81,9 @@ namespace Avalonia.Controls /// The control. IInputElement INavigableContainer.GetControl(NavigationDirection direction, IInputElement from, bool wrap) { - var horiz = Orientation == Orientation.Horizontal; + var orientation = Orientation; + var children = Children; + bool horiz = orientation == Orientation.Horizontal; int index = Children.IndexOf((IControl)from); switch (direction) @@ -60,7 +92,7 @@ namespace Avalonia.Controls index = 0; break; case NavigationDirection.Last: - index = Children.Count - 1; + index = children.Count - 1; break; case NavigationDirection.Next: ++index; @@ -82,9 +114,9 @@ namespace Avalonia.Controls break; } - if (index >= 0 && index < Children.Count) + if (index >= 0 && index < children.Count) { - return Children[index]; + return children[index]; } else { @@ -95,40 +127,51 @@ namespace Avalonia.Controls /// protected override Size MeasureOverride(Size constraint) { - var curLineSize = new UVSize(Orientation); - var panelSize = new UVSize(Orientation); - var uvConstraint = new UVSize(Orientation, constraint.Width, constraint.Height); - - var childConstraint = new Size(constraint.Width, constraint.Height); - - for (int i = 0, count = Children.Count; i < count; i++) + double itemWidth = ItemWidth; + double itemHeight = ItemHeight; + var orientation = Orientation; + var children = Children; + var curLineSize = new UVSize(orientation); + var panelSize = new UVSize(orientation); + var uvConstraint = new UVSize(orientation, constraint.Width, constraint.Height); + bool itemWidthSet = !double.IsNaN(itemWidth); + bool itemHeightSet = !double.IsNaN(itemHeight); + + var childConstraint = new Size( + itemWidthSet ? itemWidth : constraint.Width, + itemHeightSet ? itemHeight : constraint.Height); + + for (int i = 0, count = children.Count; i < count; i++) { - var child = Children[i]; - if (child == null) continue; - - //Flow passes its own constrint to children - child.Measure(childConstraint); - - //this is the size of the child in UV space - var sz = new UVSize(Orientation, child.DesiredSize.Width, child.DesiredSize.Height); - - if (MathUtilities.GreaterThan(curLineSize.U + sz.U, uvConstraint.U)) //need to switch to another line + var child = children[i]; + if (child != null) { - panelSize.U = Max(curLineSize.U, panelSize.U); - panelSize.V += curLineSize.V; - curLineSize = sz; + //Flow passes its own constrint to children + child.Measure(childConstraint); + + //this is the size of the child in UV space + var sz = new UVSize(orientation, + itemWidthSet ? itemWidth : child.DesiredSize.Width, + itemHeightSet ? itemHeight : child.DesiredSize.Height); - if (MathUtilities.GreaterThan(sz.U, uvConstraint.U)) //the element is wider then the constrint - give it a separate line + if (MathUtilities.GreaterThan(curLineSize.U + sz.U, uvConstraint.U)) //need to switch to another line { - panelSize.U = Max(sz.U, panelSize.U); - panelSize.V += sz.V; - curLineSize = new UVSize(Orientation); + panelSize.U = Max(curLineSize.U, panelSize.U); + panelSize.V += curLineSize.V; + curLineSize = sz; + + if (MathUtilities.GreaterThan(sz.U, uvConstraint.U)) //the element is wider then the constrint - give it a separate line + { + panelSize.U = Max(sz.U, panelSize.U); + panelSize.V += sz.V; + curLineSize = new UVSize(orientation); + } + } + else //continue to accumulate a line + { + curLineSize.U += sz.U; + curLineSize.V = Max(sz.V, curLineSize.V); } - } - else //continue to accumulate a line - { - curLineSize.U += sz.U; - curLineSize.V = Max(sz.V, curLineSize.V); } } @@ -143,68 +186,81 @@ namespace Avalonia.Controls /// protected override Size ArrangeOverride(Size finalSize) { + double itemWidth = ItemWidth; + double itemHeight = ItemHeight; + var orientation = Orientation; + var children = Children; int firstInLine = 0; double accumulatedV = 0; - UVSize curLineSize = new UVSize(Orientation); - UVSize uvFinalSize = new UVSize(Orientation, finalSize.Width, finalSize.Height); - - for (int i = 0; i < Children.Count; i++) + double itemU = orientation == Orientation.Horizontal ? itemWidth : itemHeight; + var curLineSize = new UVSize(orientation); + var uvFinalSize = new UVSize(orientation, finalSize.Width, finalSize.Height); + bool itemWidthSet = !double.IsNaN(itemWidth); + bool itemHeightSet = !double.IsNaN(itemHeight); + bool useItemU = orientation == Orientation.Horizontal ? itemWidthSet : itemHeightSet; + + for (int i = 0; i < children.Count; i++) { - var child = Children[i]; - if (child == null) continue; + var child = children[i]; + if (child != null) + { + var sz = new UVSize(orientation, + itemWidthSet ? itemWidth : child.DesiredSize.Width, + itemHeightSet ? itemHeight : child.DesiredSize.Height); - var sz = new UVSize(Orientation, child.DesiredSize.Width, child.DesiredSize.Height); + if (MathUtilities.GreaterThan(curLineSize.U + sz.U, uvFinalSize.U)) //need to switch to another line + { + ArrangeLine(accumulatedV, curLineSize.V, firstInLine, i, useItemU, itemU); - if (MathUtilities.GreaterThan(curLineSize.U + sz.U, uvFinalSize.U)) //need to switch to another line - { - arrangeLine(accumulatedV, curLineSize.V, firstInLine, i); + accumulatedV += curLineSize.V; + curLineSize = sz; - accumulatedV += curLineSize.V; - curLineSize = sz; + if (MathUtilities.GreaterThan(sz.U, uvFinalSize.U)) //the element is wider then the constraint - give it a separate line + { + //switch to next line which only contain one element + ArrangeLine(accumulatedV, sz.V, i, ++i, useItemU, itemU); - if (MathUtilities.GreaterThan(sz.U, uvFinalSize.U)) //the element is wider then the constraint - give it a separate line + accumulatedV += sz.V; + curLineSize = new UVSize(orientation); + } + firstInLine = i; + } + else //continue to accumulate a line { - //switch to next line which only contain one element - arrangeLine(accumulatedV, sz.V, i, ++i); - - accumulatedV += sz.V; - curLineSize = new UVSize(Orientation); + curLineSize.U += sz.U; + curLineSize.V = Max(sz.V, curLineSize.V); } - firstInLine = i; - } - else //continue to accumulate a line - { - curLineSize.U += sz.U; - curLineSize.V = Max(sz.V, curLineSize.V); } } //arrange the last line, if any - if (firstInLine < Children.Count) + if (firstInLine < children.Count) { - arrangeLine(accumulatedV, curLineSize.V, firstInLine, Children.Count); + ArrangeLine(accumulatedV, curLineSize.V, firstInLine, children.Count, useItemU, itemU); } return finalSize; } - private void arrangeLine(double v, double lineV, int start, int end) + private void ArrangeLine(double v, double lineV, int start, int end, bool useItemU, double itemU) { + var orientation = Orientation; + var children = Children; double u = 0; - bool isHorizontal = (Orientation == Orientation.Horizontal); + bool isHorizontal = orientation == Orientation.Horizontal; for (int i = start; i < end; i++) { - var child = Children[i]; + var child = children[i]; if (child != null) { - UVSize childSize = new UVSize(Orientation, child.DesiredSize.Width, child.DesiredSize.Height); - double layoutSlotU = childSize.U; + var childSize = new UVSize(orientation, child.DesiredSize.Width, child.DesiredSize.Height); + double layoutSlotU = useItemU ? itemU : childSize.U; child.Arrange(new Rect( - (isHorizontal ? u : v), - (isHorizontal ? v : u), - (isHorizontal ? layoutSlotU : lineV), - (isHorizontal ? lineV : layoutSlotU))); + isHorizontal ? u : v, + isHorizontal ? v : u, + isHorizontal ? layoutSlotU : lineV, + isHorizontal ? lineV : layoutSlotU)); u += layoutSlotU; } } @@ -232,12 +288,12 @@ namespace Avalonia.Controls internal double Width { - get { return (_orientation == Orientation.Horizontal ? U : V); } + get { return _orientation == Orientation.Horizontal ? U : V; } set { if (_orientation == Orientation.Horizontal) U = value; else V = value; } } internal double Height { - get { return (_orientation == Orientation.Horizontal ? V : U); } + get { return _orientation == Orientation.Horizontal ? V : U; } set { if (_orientation == Orientation.Horizontal) V = value; else U = value; } } } diff --git a/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs b/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs index a0511761e4..e0fa02814a 100644 --- a/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs @@ -93,5 +93,28 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(new Rect(0, 0, 100, 50), target.Children[0].Bounds); Assert.Equal(new Rect(100, 0, 100, 50), target.Children[1].Bounds); } + + [Fact] + public void Applies_ItemWidth_And_ItemHeight_Properties() + { + var target = new WrapPanel + { + Width = 50, + ItemWidth = 20, + ItemHeight = 15, + Children = + { + new Border(), + new Border { Width = 50, Height = 50 }, + } + }; + + target.Measure(Size.Infinity); + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(new Size(50, 15), target.Bounds.Size); + Assert.Equal(new Rect(0, 0, 20, 15), target.Children[0].Bounds); + Assert.Equal(new Rect(20, 15, 20, 15), target.Children[1].Bounds); + } } } From 9cc2d777addb1d46593d87e25baf4056b6e6658a Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Tue, 17 Sep 2019 23:56:47 -0400 Subject: [PATCH 05/32] Update WrapPanelTests.cs --- .../WrapPanelTests.cs | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs b/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs index e0fa02814a..149f723458 100644 --- a/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs @@ -97,24 +97,25 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Applies_ItemWidth_And_ItemHeight_Properties() { - var target = new WrapPanel - { - Width = 50, - ItemWidth = 20, - ItemHeight = 15, - Children = - { - new Border(), - new Border { Width = 50, Height = 50 }, - } - }; + var target = new WrapPanel() + { + Orientation = Orientation.Horizontal, + Width = 50, + ItemWidth = 20, + ItemHeight = 15, + Children = + { + new Border(), + new Border { Width = 50, Height = 50 }, + } + }; target.Measure(Size.Infinity); target.Arrange(new Rect(target.DesiredSize)); Assert.Equal(new Size(50, 15), target.Bounds.Size); Assert.Equal(new Rect(0, 0, 20, 15), target.Children[0].Bounds); - Assert.Equal(new Rect(20, 15, 20, 15), target.Children[1].Bounds); + Assert.Equal(new Rect(20, 0, 20, 15), target.Children[1].Bounds); } } } From 1566c1a0689b6697149f229aee19dccde5794954 Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Wed, 18 Sep 2019 11:12:37 -0400 Subject: [PATCH 06/32] Update comments --- src/Avalonia.Controls/WrapPanel.cs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Avalonia.Controls/WrapPanel.cs b/src/Avalonia.Controls/WrapPanel.cs index 418a59b64e..7c88401615 100644 --- a/src/Avalonia.Controls/WrapPanel.cs +++ b/src/Avalonia.Controls/WrapPanel.cs @@ -146,28 +146,28 @@ namespace Avalonia.Controls var child = children[i]; if (child != null) { - //Flow passes its own constrint to children + // Flow passes its own constraint to children child.Measure(childConstraint); - //this is the size of the child in UV space + // This is the size of the child in UV space var sz = new UVSize(orientation, itemWidthSet ? itemWidth : child.DesiredSize.Width, itemHeightSet ? itemHeight : child.DesiredSize.Height); - if (MathUtilities.GreaterThan(curLineSize.U + sz.U, uvConstraint.U)) //need to switch to another line + if (MathUtilities.GreaterThan(curLineSize.U + sz.U, uvConstraint.U)) // Need to switch to another line { panelSize.U = Max(curLineSize.U, panelSize.U); panelSize.V += curLineSize.V; curLineSize = sz; - if (MathUtilities.GreaterThan(sz.U, uvConstraint.U)) //the element is wider then the constrint - give it a separate line + if (MathUtilities.GreaterThan(sz.U, uvConstraint.U)) // The element is wider then the constraint - give it a separate line { panelSize.U = Max(sz.U, panelSize.U); panelSize.V += sz.V; curLineSize = new UVSize(orientation); } } - else //continue to accumulate a line + else // Continue to accumulate a line { curLineSize.U += sz.U; curLineSize.V = Max(sz.V, curLineSize.V); @@ -175,11 +175,11 @@ namespace Avalonia.Controls } } - //the last line size, if any should be added + // The last line size, if any should be added panelSize.U = Max(curLineSize.U, panelSize.U); panelSize.V += curLineSize.V; - //go from UV space to W/H space + // Go from UV space to W/H space return new Size(panelSize.Width, panelSize.Height); } @@ -208,16 +208,16 @@ namespace Avalonia.Controls itemWidthSet ? itemWidth : child.DesiredSize.Width, itemHeightSet ? itemHeight : child.DesiredSize.Height); - if (MathUtilities.GreaterThan(curLineSize.U + sz.U, uvFinalSize.U)) //need to switch to another line + if (MathUtilities.GreaterThan(curLineSize.U + sz.U, uvFinalSize.U)) // Need to switch to another line { ArrangeLine(accumulatedV, curLineSize.V, firstInLine, i, useItemU, itemU); accumulatedV += curLineSize.V; curLineSize = sz; - if (MathUtilities.GreaterThan(sz.U, uvFinalSize.U)) //the element is wider then the constraint - give it a separate line + if (MathUtilities.GreaterThan(sz.U, uvFinalSize.U)) // The element is wider then the constraint - give it a separate line { - //switch to next line which only contain one element + // Switch to next line which only contain one element ArrangeLine(accumulatedV, sz.V, i, ++i, useItemU, itemU); accumulatedV += sz.V; @@ -225,7 +225,7 @@ namespace Avalonia.Controls } firstInLine = i; } - else //continue to accumulate a line + else // Continue to accumulate a line { curLineSize.U += sz.U; curLineSize.V = Max(sz.V, curLineSize.V); @@ -233,7 +233,7 @@ namespace Avalonia.Controls } } - //arrange the last line, if any + // Arrange the last line, if any if (firstInLine < children.Count) { ArrangeLine(accumulatedV, curLineSize.V, firstInLine, children.Count, useItemU, itemU); From 2ee5a21dd7366fa98fbf350b07b18d5d164927e1 Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Sun, 22 Sep 2019 12:51:59 -0400 Subject: [PATCH 07/32] Remove broken test for now An issue will be made after merging because it's unrelated --- tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs b/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs index 149f723458..fd93df46b8 100644 --- a/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WrapPanelTests.cs @@ -106,7 +106,7 @@ namespace Avalonia.Controls.UnitTests Children = { new Border(), - new Border { Width = 50, Height = 50 }, + new Border(), } }; From a60024400688265e189f1d5b25f2e284ddf4cf05 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 23 Sep 2019 23:24:43 +0200 Subject: [PATCH 08/32] Added failing test for #3019. --- .../Rendering/DeferredRendererTests.cs | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs index 568ccb81d8..b4743e900d 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs @@ -96,6 +96,55 @@ namespace Avalonia.Visuals.UnitTests.Rendering Assert.Equal(new List { root, decorator, border, canvas }, result); } + [Fact] + public void Should_Add_Dirty_Rect_On_Child_Remove() + { + var dispatcher = new ImmediateDispatcher(); + var loop = new Mock(); + + 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() { From 25e0ed536592e25afe2a76b78f825ddb2dc1b677 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 23 Sep 2019 23:27:41 +0200 Subject: [PATCH 09/32] Revert "Handle reparenting controls in SceneBuilder." This reverts commit db8751d71164f866d4b3acb59cd3e13900096239. The change was incorrect, it causes #3019. --- .../Rendering/DeferredRenderer.cs | 2 +- .../Rendering/SceneGraph/VisualNode.cs | 15 +++------------ .../Rendering/SceneGraph/SceneBuilderTests.cs | 4 ++-- .../Rendering/SceneGraph/VisualNodeTests.cs | 2 +- 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs index 0ff0285a04..efcc555159 100644 --- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs +++ b/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(); diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs index f079023c6d..f579bf0a62 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs @@ -174,12 +174,12 @@ namespace Avalonia.Rendering.SceneGraph /// /// Sorts the 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. /// /// The scene that the node is a part of. - 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); - } } /// diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs index dcf23e94e2..13bcd27240 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs +++ b/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); diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs index d4f7a6a142..24ba2d1c48 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/VisualNodeTests.cs @@ -99,7 +99,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph var node = new VisualNode(Mock.Of(), null); var scene = new Scene(Mock.Of()); - node.UpdateChildren(scene); + node.SortChildren(scene); } } } From c569f4b474dac17c40acd158956ea07888a5bd14 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 23 Sep 2019 23:54:21 +0200 Subject: [PATCH 10/32] Handle reparenting controls in SceneBuilder. Attempt #2 after db8751d71164f866d4b3acb59cd3e13900096239 caused issue #3019. --- .../Rendering/SceneGraph/SceneBuilder.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs index 2fcea8c205..161cbc099e 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs +++ b/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. From ec8ca19a7f427818f538459c92f39815b6dc3e57 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Sat, 28 Sep 2019 10:22:57 +0100 Subject: [PATCH 11/32] diable android builds --- dirs.proj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dirs.proj b/dirs.proj index e56320e73f..4b3b1183f0 100644 --- a/dirs.proj +++ b/dirs.proj @@ -8,7 +8,8 @@ - + + From a487b38c3319097778b5b976a1f306cdbf9afb0d Mon Sep 17 00:00:00 2001 From: danwalmsley Date: Sat, 28 Sep 2019 15:20:45 +0100 Subject: [PATCH 12/32] Revert "Updated ReactiveUI to version 10.1.1" --- build/ReactiveUI.props | 2 +- build/Rx.props | 2 +- build/System.Memory.props | 2 +- .../ViewModels/MainWindowViewModel.cs | 7 +++-- .../ViewModels/MainWindowViewModel.cs | 5 ++-- .../ViewModels/MainWindowViewModel.cs | 27 +++++++++---------- .../AvaloniaActivationForViewFetcher.cs | 2 +- src/Avalonia.ReactiveUI/RoutedViewHost.cs | 4 +-- .../AvaloniaActivationForViewFetcherTest.cs | 8 +++--- 9 files changed, 28 insertions(+), 31 deletions(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index 7caeaf90ae..1208be34b8 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - + diff --git a/build/Rx.props b/build/Rx.props index edff0af160..359ce53a92 100644 --- a/build/Rx.props +++ b/build/Rx.props @@ -1,5 +1,5 @@  - + diff --git a/build/System.Memory.props b/build/System.Memory.props index b36998a780..b328f7fd97 100644 --- a/build/System.Memory.props +++ b/build/System.Memory.props @@ -1,5 +1,5 @@ - + diff --git a/samples/BindingDemo/ViewModels/MainWindowViewModel.cs b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs index 22d01e0765..858fb5159a 100644 --- a/samples/BindingDemo/ViewModels/MainWindowViewModel.cs +++ b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs @@ -1,11 +1,10 @@ using System; using System.Collections.ObjectModel; using System.Linq; -using System.Reactive; +using ReactiveUI; using System.Reactive.Linq; using System.Threading.Tasks; using System.Threading; -using ReactiveUI; namespace BindingDemo.ViewModels { @@ -57,7 +56,7 @@ namespace BindingDemo.ViewModels public ObservableCollection Items { get; } public ObservableCollection SelectedItems { get; } - public ReactiveCommand ShuffleItems { get; } + public ReactiveCommand ShuffleItems { get; } public string BooleanString { @@ -90,7 +89,7 @@ namespace BindingDemo.ViewModels } public IObservable CurrentTimeObservable { get; } - public ReactiveCommand StringValueCommand { get; } + public ReactiveCommand StringValueCommand { get; } public DataAnnotationsErrorViewModel DataAnnotationsValidation { get; } = new DataAnnotationsErrorViewModel(); public ExceptionErrorViewModel ExceptionDataValidation { get; } = new ExceptionErrorViewModel(); diff --git a/samples/RenderDemo/ViewModels/MainWindowViewModel.cs b/samples/RenderDemo/ViewModels/MainWindowViewModel.cs index d2d789a687..0cb5e1b87b 100644 --- a/samples/RenderDemo/ViewModels/MainWindowViewModel.cs +++ b/samples/RenderDemo/ViewModels/MainWindowViewModel.cs @@ -1,5 +1,4 @@ using System; -using System.Reactive; using ReactiveUI; namespace RenderDemo.ViewModels @@ -27,7 +26,7 @@ namespace RenderDemo.ViewModels set { this.RaiseAndSetIfChanged(ref drawFps, value); } } - public ReactiveCommand ToggleDrawDirtyRects { get; } - public ReactiveCommand ToggleDrawFps { get; } + public ReactiveCommand ToggleDrawDirtyRects { get; } + public ReactiveCommand ToggleDrawFps { get; } } } diff --git a/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs b/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs index 37c7178c56..93fe09a156 100644 --- a/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs +++ b/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs @@ -4,10 +4,10 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reactive; using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Controls.Primitives; +using ReactiveUI.Legacy; using ReactiveUI; using Avalonia.Layout; @@ -18,7 +18,7 @@ namespace VirtualizationDemo.ViewModels private int _itemCount = 200; private string _newItemString = "New Item"; private int _newItemIndex; - private AvaloniaList _items; + private IReactiveList _items; private string _prefix = "Item"; private ScrollBarVisibility _horizontalScrollBarVisibility = ScrollBarVisibility.Auto; private ScrollBarVisibility _verticalScrollBarVisibility = ScrollBarVisibility.Auto; @@ -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)); @@ -55,7 +54,7 @@ namespace VirtualizationDemo.ViewModels public AvaloniaList SelectedItems { get; } = new AvaloniaList(); - public AvaloniaList Items + public IReactiveList Items { get { return _items; } private set { this.RaiseAndSetIfChanged(ref _items, value); } @@ -94,11 +93,11 @@ namespace VirtualizationDemo.ViewModels public IEnumerable VirtualizationModes => Enum.GetValues(typeof(ItemVirtualizationMode)).Cast(); - public ReactiveCommand AddItemCommand { get; private set; } - public ReactiveCommand RecreateCommand { get; private set; } - public ReactiveCommand RemoveItemCommand { get; private set; } - public ReactiveCommand SelectFirstCommand { get; private set; } - public ReactiveCommand SelectLastCommand { get; private set; } + public ReactiveCommand AddItemCommand { get; private set; } + public ReactiveCommand RecreateCommand { get; private set; } + public ReactiveCommand RemoveItemCommand { get; private set; } + public ReactiveCommand SelectFirstCommand { get; private set; } + public ReactiveCommand SelectLastCommand { get; private set; } public void RandomizeSize() { @@ -124,7 +123,7 @@ namespace VirtualizationDemo.ViewModels { var items = Enumerable.Range(0, count) .Select(x => new ItemViewModel(x)); - Items = new AvaloniaList(items); + Items = new ReactiveList(items); } else if (count > Items.Count) { @@ -163,7 +162,7 @@ namespace VirtualizationDemo.ViewModels _prefix = _prefix == "Item" ? "Recreated" : "Item"; var items = Enumerable.Range(0, _itemCount) .Select(x => new ItemViewModel(x, _prefix)); - Items = new AvaloniaList(items); + Items = new ReactiveList(items); } private void SelectItem(int index) diff --git a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs index 5a4d625c41..cfa7a270be 100644 --- a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs +++ b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs @@ -27,7 +27,7 @@ namespace Avalonia.ReactiveUI /// /// Returns activation observable for activatable Avalonia view. /// - public IObservable GetActivationForView(IActivatableView view) + public IObservable GetActivationForView(IActivatable view) { if (!(view is IVisual visual)) return Observable.Return(false); if (view is WindowBase window) return GetActivationForWindowBase(window); diff --git a/src/Avalonia.ReactiveUI/RoutedViewHost.cs b/src/Avalonia.ReactiveUI/RoutedViewHost.cs index 5d96fd264a..05edeea683 100644 --- a/src/Avalonia.ReactiveUI/RoutedViewHost.cs +++ b/src/Avalonia.ReactiveUI/RoutedViewHost.cs @@ -53,7 +53,7 @@ namespace Avalonia.ReactiveUI /// ReactiveUI routing documentation website for more info. /// /// - public class RoutedViewHost : TransitioningContentControl, IActivatableView, IEnableLogger + public class RoutedViewHost : TransitioningContentControl, IActivatable, IEnableLogger { /// /// for the property. @@ -118,4 +118,4 @@ namespace Avalonia.ReactiveUI Content = viewInstance; } } -} +} \ No newline at end of file diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs index 643dd3efac..1d85312b1a 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs @@ -20,9 +20,9 @@ namespace Avalonia.ReactiveUI.UnitTests { public class AvaloniaActivationForViewFetcherTest { - public class TestUserControl : UserControl, IActivatableView { } + public class TestUserControl : UserControl, IActivatable { } - public class TestUserControlWithWhenActivated : UserControl, IActivatableView + public class TestUserControlWithWhenActivated : UserControl, IActivatable { public bool Active { get; private set; } @@ -38,7 +38,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class TestWindowWithWhenActivated : Window, IActivatableView + public class TestWindowWithWhenActivated : Window, IActivatable { public bool Active { get; private set; } @@ -54,7 +54,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class ActivatableViewModel : IActivatableViewModel + public class ActivatableViewModel : ISupportsActivation { public ViewModelActivator Activator { get; } From 29d7ed5cf47b39a63114626c6cc086ad147edba5 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Sat, 28 Sep 2019 15:23:54 +0100 Subject: [PATCH 13/32] update reactiveui version --- build/ReactiveUI.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index 7caeaf90ae..72bc3781f7 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - + From 1f7ab3024ba4ba182d2428629c1f94e5d29b0a09 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 18:08:32 +0300 Subject: [PATCH 14/32] Use ReactiveUI 10.2.2 --- build/ReactiveUI.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index 72bc3781f7..ba356c2e9a 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - + From fd7ffbd84cbbf74a54a56ac56c18b1916739a5c3 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 18:33:14 +0300 Subject: [PATCH 15/32] Bring back the changes --- build/Rx.props | 2 +- build/System.Memory.props | 2 +- .../ViewModels/MainWindowViewModel.cs | 7 ++++--- .../ViewModels/MainWindowViewModel.cs | 5 +++-- .../ViewModels/MainWindowViewModel.cs | 20 +++++++++---------- .../AvaloniaActivationForViewFetcher.cs | 2 +- src/Avalonia.ReactiveUI/RoutedViewHost.cs | 2 +- .../AvaloniaActivationForViewFetcherTest.cs | 8 ++++---- 8 files changed, 25 insertions(+), 23 deletions(-) diff --git a/build/Rx.props b/build/Rx.props index 359ce53a92..edff0af160 100644 --- a/build/Rx.props +++ b/build/Rx.props @@ -1,5 +1,5 @@  - + diff --git a/build/System.Memory.props b/build/System.Memory.props index b328f7fd97..b36998a780 100644 --- a/build/System.Memory.props +++ b/build/System.Memory.props @@ -1,5 +1,5 @@ - + diff --git a/samples/BindingDemo/ViewModels/MainWindowViewModel.cs b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs index 858fb5159a..22d01e0765 100644 --- a/samples/BindingDemo/ViewModels/MainWindowViewModel.cs +++ b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs @@ -1,10 +1,11 @@ using System; using System.Collections.ObjectModel; using System.Linq; -using ReactiveUI; +using System.Reactive; using System.Reactive.Linq; using System.Threading.Tasks; using System.Threading; +using ReactiveUI; namespace BindingDemo.ViewModels { @@ -56,7 +57,7 @@ namespace BindingDemo.ViewModels public ObservableCollection Items { get; } public ObservableCollection SelectedItems { get; } - public ReactiveCommand ShuffleItems { get; } + public ReactiveCommand ShuffleItems { get; } public string BooleanString { @@ -89,7 +90,7 @@ namespace BindingDemo.ViewModels } public IObservable CurrentTimeObservable { get; } - public ReactiveCommand StringValueCommand { get; } + public ReactiveCommand StringValueCommand { get; } public DataAnnotationsErrorViewModel DataAnnotationsValidation { get; } = new DataAnnotationsErrorViewModel(); public ExceptionErrorViewModel ExceptionDataValidation { get; } = new ExceptionErrorViewModel(); diff --git a/samples/RenderDemo/ViewModels/MainWindowViewModel.cs b/samples/RenderDemo/ViewModels/MainWindowViewModel.cs index 0cb5e1b87b..d2d789a687 100644 --- a/samples/RenderDemo/ViewModels/MainWindowViewModel.cs +++ b/samples/RenderDemo/ViewModels/MainWindowViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.Reactive; using ReactiveUI; namespace RenderDemo.ViewModels @@ -26,7 +27,7 @@ namespace RenderDemo.ViewModels set { this.RaiseAndSetIfChanged(ref drawFps, value); } } - public ReactiveCommand ToggleDrawDirtyRects { get; } - public ReactiveCommand ToggleDrawFps { get; } + public ReactiveCommand ToggleDrawDirtyRects { get; } + public ReactiveCommand ToggleDrawFps { get; } } } diff --git a/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs b/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs index 93fe09a156..649c64ab1d 100644 --- a/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs +++ b/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs @@ -4,10 +4,10 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reactive; using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Controls.Primitives; -using ReactiveUI.Legacy; using ReactiveUI; using Avalonia.Layout; @@ -18,7 +18,7 @@ namespace VirtualizationDemo.ViewModels private int _itemCount = 200; private string _newItemString = "New Item"; private int _newItemIndex; - private IReactiveList _items; + private AvaloniaList _items; private string _prefix = "Item"; private ScrollBarVisibility _horizontalScrollBarVisibility = ScrollBarVisibility.Auto; private ScrollBarVisibility _verticalScrollBarVisibility = ScrollBarVisibility.Auto; @@ -54,7 +54,7 @@ namespace VirtualizationDemo.ViewModels public AvaloniaList SelectedItems { get; } = new AvaloniaList(); - public IReactiveList Items + public AvaloniaList Items { get { return _items; } private set { this.RaiseAndSetIfChanged(ref _items, value); } @@ -93,11 +93,11 @@ namespace VirtualizationDemo.ViewModels public IEnumerable VirtualizationModes => Enum.GetValues(typeof(ItemVirtualizationMode)).Cast(); - public ReactiveCommand AddItemCommand { get; private set; } - public ReactiveCommand RecreateCommand { get; private set; } - public ReactiveCommand RemoveItemCommand { get; private set; } - public ReactiveCommand SelectFirstCommand { get; private set; } - public ReactiveCommand SelectLastCommand { get; private set; } + public ReactiveCommand AddItemCommand { get; private set; } + public ReactiveCommand RecreateCommand { get; private set; } + public ReactiveCommand RemoveItemCommand { get; private set; } + public ReactiveCommand SelectFirstCommand { get; private set; } + public ReactiveCommand SelectLastCommand { get; private set; } public void RandomizeSize() { @@ -123,7 +123,7 @@ namespace VirtualizationDemo.ViewModels { var items = Enumerable.Range(0, count) .Select(x => new ItemViewModel(x)); - Items = new ReactiveList(items); + Items = new AvaloniaList(items); } else if (count > Items.Count) { @@ -162,7 +162,7 @@ namespace VirtualizationDemo.ViewModels _prefix = _prefix == "Item" ? "Recreated" : "Item"; var items = Enumerable.Range(0, _itemCount) .Select(x => new ItemViewModel(x, _prefix)); - Items = new ReactiveList(items); + Items = new AvaloniaList(items); } private void SelectItem(int index) diff --git a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs index cfa7a270be..5a4d625c41 100644 --- a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs +++ b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs @@ -27,7 +27,7 @@ namespace Avalonia.ReactiveUI /// /// Returns activation observable for activatable Avalonia view. /// - public IObservable GetActivationForView(IActivatable view) + public IObservable GetActivationForView(IActivatableView view) { if (!(view is IVisual visual)) return Observable.Return(false); if (view is WindowBase window) return GetActivationForWindowBase(window); diff --git a/src/Avalonia.ReactiveUI/RoutedViewHost.cs b/src/Avalonia.ReactiveUI/RoutedViewHost.cs index 05edeea683..ac5db32c14 100644 --- a/src/Avalonia.ReactiveUI/RoutedViewHost.cs +++ b/src/Avalonia.ReactiveUI/RoutedViewHost.cs @@ -53,7 +53,7 @@ namespace Avalonia.ReactiveUI /// ReactiveUI routing documentation website for more info. /// /// - public class RoutedViewHost : TransitioningContentControl, IActivatable, IEnableLogger + public class RoutedViewHost : TransitioningContentControl, IActivatableView, IEnableLogger { /// /// for the property. diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs index 1d85312b1a..643dd3efac 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs @@ -20,9 +20,9 @@ namespace Avalonia.ReactiveUI.UnitTests { public class AvaloniaActivationForViewFetcherTest { - public class TestUserControl : UserControl, IActivatable { } + public class TestUserControl : UserControl, IActivatableView { } - public class TestUserControlWithWhenActivated : UserControl, IActivatable + public class TestUserControlWithWhenActivated : UserControl, IActivatableView { public bool Active { get; private set; } @@ -38,7 +38,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class TestWindowWithWhenActivated : Window, IActivatable + public class TestWindowWithWhenActivated : Window, IActivatableView { public bool Active { get; private set; } @@ -54,7 +54,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class ActivatableViewModel : ISupportsActivation + public class ActivatableViewModel : IActivatableViewModel { public ViewModelActivator Activator { get; } From ef4c7dd86cb9fd3c4dfe383e6f560062b3472290 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 18:52:24 +0300 Subject: [PATCH 16/32] Try lower System.Memory --- build/System.Memory.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/System.Memory.props b/build/System.Memory.props index b36998a780..67b1309d6d 100644 --- a/build/System.Memory.props +++ b/build/System.Memory.props @@ -1,5 +1,5 @@ - + From 7c2207508716effbc1eca4f02326bb05cafa8b0c Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 19:12:46 +0300 Subject: [PATCH 17/32] Downgrade System.Memory --- build/System.Memory.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/System.Memory.props b/build/System.Memory.props index 67b1309d6d..b328f7fd97 100644 --- a/build/System.Memory.props +++ b/build/System.Memory.props @@ -1,5 +1,5 @@ - + From 77c98a94a9ae3031f12ac95897b3389bcb3486b0 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 19:23:17 +0300 Subject: [PATCH 18/32] Use latest System.Memory --- build/System.Memory.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/System.Memory.props b/build/System.Memory.props index b328f7fd97..b36998a780 100644 --- a/build/System.Memory.props +++ b/build/System.Memory.props @@ -1,5 +1,5 @@ - + From f11df8023d172e4ca5e5af559f85859fed930c1c Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 19:26:45 +0300 Subject: [PATCH 19/32] Bump Microsoft.Reactive.Testing --- build/Microsoft.Reactive.Testing.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Microsoft.Reactive.Testing.props b/build/Microsoft.Reactive.Testing.props index 777bc4bb53..a0ba2163bb 100644 --- a/build/Microsoft.Reactive.Testing.props +++ b/build/Microsoft.Reactive.Testing.props @@ -1,5 +1,5 @@  - + From a031b4d4707f82e870580cbc7645280fb89b49e7 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 20:06:37 +0300 Subject: [PATCH 20/32] Rollback ReactiveUI to see if System.Reactive is the cause --- build/ReactiveUI.props | 2 +- .../AvaloniaActivationForViewFetcher.cs | 2 +- src/Avalonia.ReactiveUI/RoutedViewHost.cs | 2 +- .../AvaloniaActivationForViewFetcherTest.cs | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index ba356c2e9a..b92d3ddcd6 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - + diff --git a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs index 5a4d625c41..cfa7a270be 100644 --- a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs +++ b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs @@ -27,7 +27,7 @@ namespace Avalonia.ReactiveUI /// /// Returns activation observable for activatable Avalonia view. /// - public IObservable GetActivationForView(IActivatableView view) + public IObservable GetActivationForView(IActivatable view) { if (!(view is IVisual visual)) return Observable.Return(false); if (view is WindowBase window) return GetActivationForWindowBase(window); diff --git a/src/Avalonia.ReactiveUI/RoutedViewHost.cs b/src/Avalonia.ReactiveUI/RoutedViewHost.cs index ac5db32c14..05edeea683 100644 --- a/src/Avalonia.ReactiveUI/RoutedViewHost.cs +++ b/src/Avalonia.ReactiveUI/RoutedViewHost.cs @@ -53,7 +53,7 @@ namespace Avalonia.ReactiveUI /// ReactiveUI routing documentation website for more info. /// /// - public class RoutedViewHost : TransitioningContentControl, IActivatableView, IEnableLogger + public class RoutedViewHost : TransitioningContentControl, IActivatable, IEnableLogger { /// /// for the property. diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs index 643dd3efac..1d85312b1a 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs @@ -20,9 +20,9 @@ namespace Avalonia.ReactiveUI.UnitTests { public class AvaloniaActivationForViewFetcherTest { - public class TestUserControl : UserControl, IActivatableView { } + public class TestUserControl : UserControl, IActivatable { } - public class TestUserControlWithWhenActivated : UserControl, IActivatableView + public class TestUserControlWithWhenActivated : UserControl, IActivatable { public bool Active { get; private set; } @@ -38,7 +38,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class TestWindowWithWhenActivated : Window, IActivatableView + public class TestWindowWithWhenActivated : Window, IActivatable { public bool Active { get; private set; } @@ -54,7 +54,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class ActivatableViewModel : IActivatableViewModel + public class ActivatableViewModel : ISupportsActivation { public ViewModelActivator Activator { get; } From 4bfa23243265090c9a8f6be3d8dec1882f81d12a Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 20:53:14 +0300 Subject: [PATCH 21/32] Use newest dependencies required by System.Reactive --- build/Rx.props | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/Rx.props b/build/Rx.props index edff0af160..970f60e3bc 100644 --- a/build/Rx.props +++ b/build/Rx.props @@ -1,5 +1,7 @@  + + From f1a42488bd623687e9ff7e3a6cca046d9fc5dae9 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 21:09:11 +0300 Subject: [PATCH 22/32] Typo fix --- build/Rx.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/Rx.props b/build/Rx.props index 970f60e3bc..f1526dbf8c 100644 --- a/build/Rx.props +++ b/build/Rx.props @@ -1,7 +1,7 @@  - - + + From 5fc951bc88abc65b91f859cb2f9384427505e8db Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 21:29:50 +0300 Subject: [PATCH 23/32] Bump ReactiveUI to 10.2.2 --- build/ReactiveUI.props | 2 +- .../AvaloniaActivationForViewFetcher.cs | 2 +- src/Avalonia.ReactiveUI/RoutedViewHost.cs | 2 +- .../AvaloniaActivationForViewFetcherTest.cs | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index b92d3ddcd6..ba356c2e9a 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - + diff --git a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs index cfa7a270be..5a4d625c41 100644 --- a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs +++ b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs @@ -27,7 +27,7 @@ namespace Avalonia.ReactiveUI /// /// Returns activation observable for activatable Avalonia view. /// - public IObservable GetActivationForView(IActivatable view) + public IObservable GetActivationForView(IActivatableView view) { if (!(view is IVisual visual)) return Observable.Return(false); if (view is WindowBase window) return GetActivationForWindowBase(window); diff --git a/src/Avalonia.ReactiveUI/RoutedViewHost.cs b/src/Avalonia.ReactiveUI/RoutedViewHost.cs index 05edeea683..ac5db32c14 100644 --- a/src/Avalonia.ReactiveUI/RoutedViewHost.cs +++ b/src/Avalonia.ReactiveUI/RoutedViewHost.cs @@ -53,7 +53,7 @@ namespace Avalonia.ReactiveUI /// ReactiveUI routing documentation website for more info. /// /// - public class RoutedViewHost : TransitioningContentControl, IActivatable, IEnableLogger + public class RoutedViewHost : TransitioningContentControl, IActivatableView, IEnableLogger { /// /// for the property. diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs index 1d85312b1a..643dd3efac 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs @@ -20,9 +20,9 @@ namespace Avalonia.ReactiveUI.UnitTests { public class AvaloniaActivationForViewFetcherTest { - public class TestUserControl : UserControl, IActivatable { } + public class TestUserControl : UserControl, IActivatableView { } - public class TestUserControlWithWhenActivated : UserControl, IActivatable + public class TestUserControlWithWhenActivated : UserControl, IActivatableView { public bool Active { get; private set; } @@ -38,7 +38,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class TestWindowWithWhenActivated : Window, IActivatable + public class TestWindowWithWhenActivated : Window, IActivatableView { public bool Active { get; private set; } @@ -54,7 +54,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class ActivatableViewModel : ISupportsActivation + public class ActivatableViewModel : IActivatableViewModel { public ViewModelActivator Activator { get; } From d4f9493df17270ce3ec6937faf14b667ddcaf482 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 21:46:18 +0300 Subject: [PATCH 24/32] Revert ReactiveUI upgrade to ensure this was false positive This reverts commit 5fc951bc88abc65b91f859cb2f9384427505e8db. --- build/ReactiveUI.props | 2 +- .../AvaloniaActivationForViewFetcher.cs | 2 +- src/Avalonia.ReactiveUI/RoutedViewHost.cs | 2 +- .../AvaloniaActivationForViewFetcherTest.cs | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index ba356c2e9a..b92d3ddcd6 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - + diff --git a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs index 5a4d625c41..cfa7a270be 100644 --- a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs +++ b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs @@ -27,7 +27,7 @@ namespace Avalonia.ReactiveUI /// /// Returns activation observable for activatable Avalonia view. /// - public IObservable GetActivationForView(IActivatableView view) + public IObservable GetActivationForView(IActivatable view) { if (!(view is IVisual visual)) return Observable.Return(false); if (view is WindowBase window) return GetActivationForWindowBase(window); diff --git a/src/Avalonia.ReactiveUI/RoutedViewHost.cs b/src/Avalonia.ReactiveUI/RoutedViewHost.cs index ac5db32c14..05edeea683 100644 --- a/src/Avalonia.ReactiveUI/RoutedViewHost.cs +++ b/src/Avalonia.ReactiveUI/RoutedViewHost.cs @@ -53,7 +53,7 @@ namespace Avalonia.ReactiveUI /// ReactiveUI routing documentation website for more info. /// /// - public class RoutedViewHost : TransitioningContentControl, IActivatableView, IEnableLogger + public class RoutedViewHost : TransitioningContentControl, IActivatable, IEnableLogger { /// /// for the property. diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs index 643dd3efac..1d85312b1a 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs @@ -20,9 +20,9 @@ namespace Avalonia.ReactiveUI.UnitTests { public class AvaloniaActivationForViewFetcherTest { - public class TestUserControl : UserControl, IActivatableView { } + public class TestUserControl : UserControl, IActivatable { } - public class TestUserControlWithWhenActivated : UserControl, IActivatableView + public class TestUserControlWithWhenActivated : UserControl, IActivatable { public bool Active { get; private set; } @@ -38,7 +38,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class TestWindowWithWhenActivated : Window, IActivatableView + public class TestWindowWithWhenActivated : Window, IActivatable { public bool Active { get; private set; } @@ -54,7 +54,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class ActivatableViewModel : IActivatableViewModel + public class ActivatableViewModel : ISupportsActivation { public ViewModelActivator Activator { get; } From 6a34494d6757673294673ea187eaf900d07ce2b4 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 22:54:07 +0300 Subject: [PATCH 25/32] Use latest 9.* version --- build/ReactiveUI.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index b92d3ddcd6..249eb99715 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - + From 1c417e8bfe903055d423c2df9d994b79e54db248 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 23:10:11 +0300 Subject: [PATCH 26/32] ReactiveUI 9.0.1 depends on compatibility package --- build/ReactiveUI.props | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index 249eb99715..cf41e0c57e 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,6 @@ - + + From 8947d302957eb1c479335d74b651f67a3ff581d8 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 23:15:10 +0300 Subject: [PATCH 27/32] Required code changes --- .../AvaloniaActivationForViewFetcher.cs | 2 +- src/Avalonia.ReactiveUI/RoutedViewHost.cs | 2 +- .../AvaloniaActivationForViewFetcherTest.cs | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs index cfa7a270be..5a4d625c41 100644 --- a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs +++ b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs @@ -27,7 +27,7 @@ namespace Avalonia.ReactiveUI /// /// Returns activation observable for activatable Avalonia view. /// - public IObservable GetActivationForView(IActivatable view) + public IObservable GetActivationForView(IActivatableView view) { if (!(view is IVisual visual)) return Observable.Return(false); if (view is WindowBase window) return GetActivationForWindowBase(window); diff --git a/src/Avalonia.ReactiveUI/RoutedViewHost.cs b/src/Avalonia.ReactiveUI/RoutedViewHost.cs index 05edeea683..ac5db32c14 100644 --- a/src/Avalonia.ReactiveUI/RoutedViewHost.cs +++ b/src/Avalonia.ReactiveUI/RoutedViewHost.cs @@ -53,7 +53,7 @@ namespace Avalonia.ReactiveUI /// ReactiveUI routing documentation website for more info. /// /// - public class RoutedViewHost : TransitioningContentControl, IActivatable, IEnableLogger + public class RoutedViewHost : TransitioningContentControl, IActivatableView, IEnableLogger { /// /// for the property. diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs index 1d85312b1a..643dd3efac 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs @@ -20,9 +20,9 @@ namespace Avalonia.ReactiveUI.UnitTests { public class AvaloniaActivationForViewFetcherTest { - public class TestUserControl : UserControl, IActivatable { } + public class TestUserControl : UserControl, IActivatableView { } - public class TestUserControlWithWhenActivated : UserControl, IActivatable + public class TestUserControlWithWhenActivated : UserControl, IActivatableView { public bool Active { get; private set; } @@ -38,7 +38,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class TestWindowWithWhenActivated : Window, IActivatable + public class TestWindowWithWhenActivated : Window, IActivatableView { public bool Active { get; private set; } @@ -54,7 +54,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class ActivatableViewModel : ISupportsActivation + public class ActivatableViewModel : IActivatableViewModel { public ViewModelActivator Activator { get; } From fd9cdce20277e7f0b2fd0aa783caee030df88746 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 23:44:52 +0300 Subject: [PATCH 28/32] Try 9.1.1 version --- build/ReactiveUI.props | 3 +-- .../AvaloniaActivationForViewFetcher.cs | 2 +- src/Avalonia.ReactiveUI/RoutedViewHost.cs | 2 +- .../AvaloniaActivationForViewFetcherTest.cs | 8 ++++---- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index cf41e0c57e..7932d453d9 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,6 +1,5 @@ - - + diff --git a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs index 5a4d625c41..cfa7a270be 100644 --- a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs +++ b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs @@ -27,7 +27,7 @@ namespace Avalonia.ReactiveUI /// /// Returns activation observable for activatable Avalonia view. /// - public IObservable GetActivationForView(IActivatableView view) + public IObservable GetActivationForView(IActivatable view) { if (!(view is IVisual visual)) return Observable.Return(false); if (view is WindowBase window) return GetActivationForWindowBase(window); diff --git a/src/Avalonia.ReactiveUI/RoutedViewHost.cs b/src/Avalonia.ReactiveUI/RoutedViewHost.cs index ac5db32c14..05edeea683 100644 --- a/src/Avalonia.ReactiveUI/RoutedViewHost.cs +++ b/src/Avalonia.ReactiveUI/RoutedViewHost.cs @@ -53,7 +53,7 @@ namespace Avalonia.ReactiveUI /// ReactiveUI routing documentation website for more info. /// /// - public class RoutedViewHost : TransitioningContentControl, IActivatableView, IEnableLogger + public class RoutedViewHost : TransitioningContentControl, IActivatable, IEnableLogger { /// /// for the property. diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs index 643dd3efac..1d85312b1a 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs @@ -20,9 +20,9 @@ namespace Avalonia.ReactiveUI.UnitTests { public class AvaloniaActivationForViewFetcherTest { - public class TestUserControl : UserControl, IActivatableView { } + public class TestUserControl : UserControl, IActivatable { } - public class TestUserControlWithWhenActivated : UserControl, IActivatableView + public class TestUserControlWithWhenActivated : UserControl, IActivatable { public bool Active { get; private set; } @@ -38,7 +38,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class TestWindowWithWhenActivated : Window, IActivatableView + public class TestWindowWithWhenActivated : Window, IActivatable { public bool Active { get; private set; } @@ -54,7 +54,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class ActivatableViewModel : IActivatableViewModel + public class ActivatableViewModel : ISupportsActivation { public ViewModelActivator Activator { get; } From 7d292d1908732f7376768ea0727e5281d9f6d503 Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 28 Sep 2019 23:55:58 +0300 Subject: [PATCH 29/32] Double check this wasn't false positive --- build/ReactiveUI.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index 7932d453d9..b92d3ddcd6 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - + From 00a148d0a3732e17a4d6bbc75d9b7449ecb65e99 Mon Sep 17 00:00:00 2001 From: artyom Date: Sun, 29 Sep 2019 00:39:18 +0300 Subject: [PATCH 30/32] Try with WaitForPendingFinalizers --- build/ReactiveUI.props | 2 +- .../AvaloniaActivationForViewFetcher.cs | 2 +- src/Avalonia.ReactiveUI/RoutedViewHost.cs | 2 +- .../ExpressionObserverBuilderTests_AttachedProperty.cs | 2 ++ .../AvaloniaActivationForViewFetcherTest.cs | 8 ++++---- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index b92d3ddcd6..ba356c2e9a 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - + diff --git a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs index cfa7a270be..5a4d625c41 100644 --- a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs +++ b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs @@ -27,7 +27,7 @@ namespace Avalonia.ReactiveUI /// /// Returns activation observable for activatable Avalonia view. /// - public IObservable GetActivationForView(IActivatable view) + public IObservable GetActivationForView(IActivatableView view) { if (!(view is IVisual visual)) return Observable.Return(false); if (view is WindowBase window) return GetActivationForWindowBase(window); diff --git a/src/Avalonia.ReactiveUI/RoutedViewHost.cs b/src/Avalonia.ReactiveUI/RoutedViewHost.cs index 05edeea683..ac5db32c14 100644 --- a/src/Avalonia.ReactiveUI/RoutedViewHost.cs +++ b/src/Avalonia.ReactiveUI/RoutedViewHost.cs @@ -53,7 +53,7 @@ namespace Avalonia.ReactiveUI /// ReactiveUI routing documentation website for more info. /// /// - public class RoutedViewHost : TransitioningContentControl, IActivatable, IEnableLogger + public class RoutedViewHost : TransitioningContentControl, IActivatableView, IEnableLogger { /// /// for the property. diff --git a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs index 5b97ab7ae6..ff9e259eab 100644 --- a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs +++ b/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); diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs index 1d85312b1a..643dd3efac 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AvaloniaActivationForViewFetcherTest.cs @@ -20,9 +20,9 @@ namespace Avalonia.ReactiveUI.UnitTests { public class AvaloniaActivationForViewFetcherTest { - public class TestUserControl : UserControl, IActivatable { } + public class TestUserControl : UserControl, IActivatableView { } - public class TestUserControlWithWhenActivated : UserControl, IActivatable + public class TestUserControlWithWhenActivated : UserControl, IActivatableView { public bool Active { get; private set; } @@ -38,7 +38,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class TestWindowWithWhenActivated : Window, IActivatable + public class TestWindowWithWhenActivated : Window, IActivatableView { public bool Active { get; private set; } @@ -54,7 +54,7 @@ namespace Avalonia.ReactiveUI.UnitTests } } - public class ActivatableViewModel : ISupportsActivation + public class ActivatableViewModel : IActivatableViewModel { public ViewModelActivator Activator { get; } From 06d52c7e5b1d0b84675a7c0817fd34fc0ab104a5 Mon Sep 17 00:00:00 2001 From: artyom Date: Sun, 29 Sep 2019 00:58:50 +0300 Subject: [PATCH 31/32] Try to avoid including extra packages --- build/Rx.props | 2 -- 1 file changed, 2 deletions(-) diff --git a/build/Rx.props b/build/Rx.props index f1526dbf8c..edff0af160 100644 --- a/build/Rx.props +++ b/build/Rx.props @@ -1,7 +1,5 @@  - - From a3e40b9c32f24bdd3e2d9e7b462c9ca12e1f61de Mon Sep 17 00:00:00 2001 From: artyom Date: Mon, 30 Sep 2019 15:31:27 +0300 Subject: [PATCH 32/32] Update ReactiveUI to 10.3.6 --- build/ReactiveUI.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/ReactiveUI.props b/build/ReactiveUI.props index ba356c2e9a..f827cb9a32 100644 --- a/build/ReactiveUI.props +++ b/build/ReactiveUI.props @@ -1,5 +1,5 @@ - +