From 2a5a5d229f6e8935bbb62b6be0e3f90e62dcc71d Mon Sep 17 00:00:00 2001 From: Tom Edwards Date: Sun, 19 Mar 2023 15:13:42 +0100 Subject: [PATCH] Fix tests --- .../Presenters/ScrollContentPresenter.cs | 41 +++++++++++++------ src/Avalonia.Controls/Primitives/ScrollBar.cs | 18 ++++---- src/Avalonia.Controls/ScrollViewer.cs | 8 ++++ .../ScrollViewerTests.cs | 6 +-- 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs index 0cde765f76..6552ee6dbd 100644 --- a/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs @@ -98,6 +98,7 @@ namespace Avalonia.Controls.Presenters private double _verticalSnapPointOffset; private double _horizontalSnapPointOffset; private CompositeDisposable? _ownerSubscriptions; + private ScrollViewer? _owner; /// /// Initializes static members of the class. @@ -305,7 +306,7 @@ namespace Avalonia.Controls.Presenters { _ownerSubscriptions?.Dispose(); - var owner = this.FindAncestorOfType(); + var owner = _owner = this.FindAncestorOfType(); if (owner == null) { @@ -314,17 +315,11 @@ namespace Avalonia.Controls.Presenters var subscriptionDisposables = new IDisposable?[] { - IfUnset(CanHorizontallyScrollProperty, p => Bind(p, owner.GetObservable(ScrollViewer.HorizontalScrollBarVisibilityProperty).Select(NotDisabled), Data.BindingPriority.Template)), - IfUnset(CanVerticallyScrollProperty, p => Bind(p, owner.GetObservable(ScrollViewer.VerticalScrollBarVisibilityProperty).Select(NotDisabled), Data.BindingPriority.Template)), - IfUnset(OffsetProperty, p => new CompositeDisposable( - Bind(p, owner.GetBindingObservable(ScrollViewer.OffsetProperty), Data.BindingPriority.Template), - this.GetObservable(OffsetProperty).Subscribe(v => owner.SetCurrentValue(OffsetProperty, v)))), + IfUnset(CanHorizontallyScrollProperty, p => Bind(p, owner.GetObservable(ScrollViewer.HorizontalScrollBarVisibilityProperty, NotDisabled), Data.BindingPriority.Template)), + IfUnset(CanVerticallyScrollProperty, p => Bind(p, owner.GetObservable(ScrollViewer.VerticalScrollBarVisibilityProperty, NotDisabled), Data.BindingPriority.Template)), + IfUnset(OffsetProperty, p => Bind(p, owner.GetBindingObservable(ScrollViewer.OffsetProperty), Data.BindingPriority.Template)), IfUnset(IsScrollChainingEnabledProperty, p => Bind(p, owner.GetBindingObservable(ScrollViewer.IsScrollChainingEnabledProperty), Data.BindingPriority.Template)), IfUnset(ContentProperty, p => Bind(p, owner.GetBindingObservable(ContentProperty), Data.BindingPriority.Template)), - - // read-only properties on ScrollViewer with internal setters: - this.GetObservable(ExtentProperty).Subscribe(v => owner.Extent = v), - this.GetObservable(ViewportProperty).Subscribe(v => owner.Viewport = v) }.Where(d => d != null).Cast().ToArray(); _ownerSubscriptions = new CompositeDisposable(subscriptionDisposables); @@ -338,6 +333,7 @@ namespace Avalonia.Controls.Presenters protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) { _ownerSubscriptions?.Dispose(); + _owner = null; base.OnDetachedFromVisualTree(e); } @@ -670,9 +666,14 @@ namespace Avalonia.Controls.Presenters protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { - if (change.Property == OffsetProperty && !_arranging) + if (change.Property == OffsetProperty) { - InvalidateArrange(); + if (!_arranging) + { + InvalidateArrange(); + } + + _owner?.SetCurrentValue(OffsetProperty, change.GetNewValue()); } else if (change.Property == ContentProperty) { @@ -699,6 +700,22 @@ namespace Avalonia.Controls.Presenters { UpdateSnapPoints(); } + else if (change.Property == ExtentProperty) + { + if (_owner != null) + { + _owner.Extent = change.GetNewValue(); + } + CoerceValue(OffsetProperty); + } + else if (change.Property == ViewportProperty && _owner != null) + { + if (_owner != null) + { + _owner.Viewport = change.GetNewValue(); + } + CoerceValue(OffsetProperty); + } base.OnPropertyChanged(change); } diff --git a/src/Avalonia.Controls/Primitives/ScrollBar.cs b/src/Avalonia.Controls/Primitives/ScrollBar.cs index df69baae0a..29775f4526 100644 --- a/src/Avalonia.Controls/Primitives/ScrollBar.cs +++ b/src/Avalonia.Controls/Primitives/ScrollBar.cs @@ -84,6 +84,7 @@ namespace Avalonia.Controls.Primitives private DispatcherTimer? _timer; private bool _isExpanded; private CompositeDisposable? _ownerSubscriptions; + private ScrollViewer? _owner; /// /// Initializes static members of the class. @@ -203,7 +204,7 @@ namespace Avalonia.Controls.Primitives { _ownerSubscriptions?.Dispose(); - var owner = this.FindAncestorOfType(); + var owner = _owner = this.FindAncestorOfType(); if (owner == null) { @@ -214,11 +215,9 @@ namespace Avalonia.Controls.Primitives var subscriptionDisposables = new IDisposable?[] { - IfUnset(MaximumProperty, p => Bind(p, owner.GetObservable(ScrollViewer.ScrollBarMaximumProperty).Select(ExtractOrdinate), BindingPriority.Template)), - IfUnset(ValueProperty, p => new CompositeDisposable( - Bind(p, owner.GetObservable(ScrollViewer.OffsetProperty).Select(ExtractOrdinate), BindingPriority.Template), - this.GetObservable(ValueProperty).Subscribe(v => SetScrollViewerOffset(owner, v)))), - IfUnset(ViewportSizeProperty, p => Bind(p, owner.GetObservable(ScrollViewer.ViewportProperty).Select(ExtractOrdinate), BindingPriority.Template)), + IfUnset(MaximumProperty, p => Bind(p, owner.GetObservable(ScrollViewer.ScrollBarMaximumProperty, ExtractOrdinate), BindingPriority.Template)), + IfUnset(ValueProperty, p => Bind(p, owner.GetObservable(ScrollViewer.OffsetProperty, ExtractOrdinate), BindingPriority.Template)), + IfUnset(ViewportSizeProperty, p => Bind(p, owner.GetObservable(ScrollViewer.ViewportProperty, ExtractOrdinate), BindingPriority.Template)), IfUnset(VisibilityProperty, p => Bind(p, owner.GetObservable(visibilitySource), BindingPriority.Template)), IfUnset(AllowAutoHideProperty, p => Bind(p, owner.GetObservable(ScrollViewer.AllowAutoHideProperty), BindingPriority.Template)), IfUnset(LargeChangeProperty, p => Bind(p, owner.GetObservable(ScrollViewer.LargeChangeProperty).Select(ExtractOrdinate), BindingPriority.Template)), @@ -232,11 +231,11 @@ namespace Avalonia.Controls.Primitives private double ExtractOrdinate(Vector v) => Orientation == Orientation.Horizontal ? v.X : v.Y; private double ExtractOrdinate(Size v) => Orientation == Orientation.Horizontal ? v.Width : v.Height; - private void SetScrollViewerOffset(ScrollViewer viewer, double value) => viewer.SetCurrentValue(ScrollViewer.OffsetProperty, Orientation == Orientation.Horizontal ? viewer.Offset.WithX(value) : viewer.Offset.WithY(value)); protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) { _ownerSubscriptions?.Dispose(); + _owner = null; base.OnDetachedFromVisualTree(e); } @@ -267,6 +266,11 @@ namespace Avalonia.Controls.Primitives { UpdateIsExpandedState(); } + else if (change.Property == ValueProperty) + { + var value = change.GetNewValue(); + _owner?.SetCurrentValue(ScrollViewer.OffsetProperty, Orientation == Orientation.Horizontal ? _owner.Offset.WithX(value) : _owner.Offset.WithY(value)); + } else { if (change.Property == MinimumProperty || diff --git a/src/Avalonia.Controls/ScrollViewer.cs b/src/Avalonia.Controls/ScrollViewer.cs index f469e4948d..26b2a030c5 100644 --- a/src/Avalonia.Controls/ScrollViewer.cs +++ b/src/Avalonia.Controls/ScrollViewer.cs @@ -683,6 +683,14 @@ namespace Avalonia.Controls { CalculatedPropertiesChanged(); } + else if (change.Property == ExtentProperty) + { + CoerceValue(OffsetProperty); + } + else if (change.Property == ViewportProperty) + { + CoerceValue(OffsetProperty); + } } protected override void OnKeyDown(KeyEventArgs e) diff --git a/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs b/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs index 407bd40c37..a7bde551e9 100644 --- a/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs @@ -225,8 +225,8 @@ namespace Avalonia.Controls.UnitTests var root = new TestRoot(target); var raised = 0; - target.SetValue(ScrollViewer.ExtentProperty, new Size(100, 100)); - target.SetValue(ScrollViewer.ViewportProperty, new Size(50, 50)); + target.Extent = new (100, 100); + target.Viewport = new(50, 50); target.Offset = new Vector(50, 50); root.LayoutManager.ExecuteInitialLayoutPass(); @@ -239,7 +239,7 @@ namespace Avalonia.Controls.UnitTests ++raised; }; - target.SetValue(ScrollViewer.ExtentProperty, new Size(70, 70)); + target.Extent = new(70, 70); Assert.Equal(0, raised);