From 0cb25c78c95dd382a8368bd422c8ec3222ceff3e Mon Sep 17 00:00:00 2001 From: Loris Bognanni Date: Thu, 26 Nov 2020 09:01:08 +0000 Subject: [PATCH 1/3] Only handle the Enter key when the DropDown is open Fixes #5106 --- src/Avalonia.Controls/AutoCompleteBox.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/AutoCompleteBox.cs b/src/Avalonia.Controls/AutoCompleteBox.cs index bfd633c947..b59fd7abde 100644 --- a/src/Avalonia.Controls/AutoCompleteBox.cs +++ b/src/Avalonia.Controls/AutoCompleteBox.cs @@ -1405,8 +1405,11 @@ namespace Avalonia.Controls break; case Key.Enter: - OnAdapterSelectionComplete(this, new RoutedEventArgs()); - e.Handled = true; + if (IsDropDownOpen) + { + OnAdapterSelectionComplete(this, new RoutedEventArgs()); + e.Handled = true; + } break; default: From 0e7e861009721dd7f0c1c964d5732d4105dab8cf Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Thu, 26 Nov 2020 12:13:58 +0100 Subject: [PATCH 2/3] Fix TransformToVisual not dealing with non-invertible transforms. --- src/Avalonia.Visuals/Matrix.cs | 25 ++++++++++++++++--- src/Avalonia.Visuals/VisualExtensions.cs | 10 +++++++- .../Avalonia.Visuals.UnitTests/VisualTests.cs | 19 ++++++++++++++ 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Visuals/Matrix.cs b/src/Avalonia.Visuals/Matrix.cs index 2ccfd43f03..ea7d0d63af 100644 --- a/src/Avalonia.Visuals/Matrix.cs +++ b/src/Avalonia.Visuals/Matrix.cs @@ -282,16 +282,16 @@ namespace Avalonia } /// - /// Inverts the Matrix. + /// Attempts to invert the Matrix. /// - /// The inverted matrix. - public Matrix Invert() + /// The inverted matrix or when matrix is not invertible. + public Matrix? TryInvert() { double d = GetDeterminant(); if (MathUtilities.IsZero(d)) { - throw new InvalidOperationException("Transform is not invertible."); + return null; } return new Matrix( @@ -303,6 +303,23 @@ namespace Avalonia ((_m12 * _m31) - (_m11 * _m32)) / d); } + /// + /// Inverts the Matrix. + /// + /// Matrix is not invertible. + /// The inverted matrix. + public Matrix Invert() + { + Matrix? inverted = TryInvert(); + + if (!inverted.HasValue) + { + throw new InvalidOperationException("Transform is not invertible."); + } + + return inverted.Value; + } + /// /// Parses a string. /// diff --git a/src/Avalonia.Visuals/VisualExtensions.cs b/src/Avalonia.Visuals/VisualExtensions.cs index 6079e5941f..6875e2c55a 100644 --- a/src/Avalonia.Visuals/VisualExtensions.cs +++ b/src/Avalonia.Visuals/VisualExtensions.cs @@ -50,7 +50,15 @@ namespace Avalonia { var thisOffset = GetOffsetFrom(common, from); var thatOffset = GetOffsetFrom(common, to); - return -thatOffset * thisOffset; + + var thatOffsetInverted = thatOffset.TryInvert(); + + if (!thatOffsetInverted.HasValue) + { + return null; + } + + return thatOffsetInverted.Value * thisOffset; } return null; diff --git a/tests/Avalonia.Visuals.UnitTests/VisualTests.cs b/tests/Avalonia.Visuals.UnitTests/VisualTests.cs index 447a68aa69..38131fbfca 100644 --- a/tests/Avalonia.Visuals.UnitTests/VisualTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/VisualTests.cs @@ -235,6 +235,25 @@ namespace Avalonia.Visuals.UnitTests Assert.Equal(new Point(100, 100), point); } + [Fact] + public void TransformToVisual_With_NonInvertible_RenderTransform_Should_Work() + { + var child = new Decorator + { + Width = 100, + Height = 100, + RenderTransform = new ScaleTransform() { ScaleX = 0, ScaleY = 0 } + }; + var root = new TestRoot() { Child = child, Width = 400, Height = 400 }; + + root.Measure(Size.Infinity); + root.Arrange(new Rect(new Point(), root.DesiredSize)); + + var tr = root.TransformToVisual(child); + + Assert.Null(tr); + } + [Fact] public void Should_Not_Log_Binding_Error_When_Not_Attached_To_Logical_Tree() { From 713d4698ee66fc524eb480e69e7f14778b682e56 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Thu, 26 Nov 2020 12:25:35 +0100 Subject: [PATCH 3/3] Use different Try convention. --- src/Avalonia.Visuals/Matrix.cs | 16 +++++++++------- src/Avalonia.Visuals/VisualExtensions.cs | 8 +++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Avalonia.Visuals/Matrix.cs b/src/Avalonia.Visuals/Matrix.cs index ea7d0d63af..8136f843df 100644 --- a/src/Avalonia.Visuals/Matrix.cs +++ b/src/Avalonia.Visuals/Matrix.cs @@ -285,22 +285,26 @@ namespace Avalonia /// Attempts to invert the Matrix. /// /// The inverted matrix or when matrix is not invertible. - public Matrix? TryInvert() + public bool TryInvert(out Matrix inverted) { double d = GetDeterminant(); if (MathUtilities.IsZero(d)) { - return null; + inverted = default; + + return false; } - return new Matrix( + inverted = new Matrix( _m22 / d, -_m12 / d, -_m21 / d, _m11 / d, ((_m21 * _m32) - (_m22 * _m31)) / d, ((_m12 * _m31) - (_m11 * _m32)) / d); + + return true; } /// @@ -310,14 +314,12 @@ namespace Avalonia /// The inverted matrix. public Matrix Invert() { - Matrix? inverted = TryInvert(); - - if (!inverted.HasValue) + if (!TryInvert(out Matrix inverted)) { throw new InvalidOperationException("Transform is not invertible."); } - return inverted.Value; + return inverted; } /// diff --git a/src/Avalonia.Visuals/VisualExtensions.cs b/src/Avalonia.Visuals/VisualExtensions.cs index 6875e2c55a..e6523a1469 100644 --- a/src/Avalonia.Visuals/VisualExtensions.cs +++ b/src/Avalonia.Visuals/VisualExtensions.cs @@ -51,14 +51,12 @@ namespace Avalonia var thisOffset = GetOffsetFrom(common, from); var thatOffset = GetOffsetFrom(common, to); - var thatOffsetInverted = thatOffset.TryInvert(); - - if (!thatOffsetInverted.HasValue) + if (!thatOffset.TryInvert(out var thatOffsetInverted)) { return null; } - - return thatOffsetInverted.Value * thisOffset; + + return thatOffsetInverted * thisOffset; } return null;