From 8231a620ba31519f3b9cb0474ff46f7c8be62478 Mon Sep 17 00:00:00 2001 From: Nicolai Henriksen Date: Fri, 13 Jan 2023 23:01:23 +0100 Subject: [PATCH 1/3] Refactor SmartHint to allow taking up allowed space Places the FloatingHintTextBox inside of a Canvas and splits the RenderTransform in 2 by applying the TranslateTransform to the Canvas (to move it) and the ScaleTransform to the FloatingHintTextBlock (to scale it down) --- MainDemo.Wpf/ComboBoxes.xaml | 2 +- MainDemo.Wpf/Fields.xaml | 2 +- .../FloatingHintTransformConverterTests.cs | 28 ++++++++++ .../FloatingHintTransformConverter.cs | 25 ++++++--- .../Themes/MaterialDesignTheme.SmartHint.xaml | 55 +++++++++++-------- 5 files changed, 80 insertions(+), 32 deletions(-) diff --git a/MainDemo.Wpf/ComboBoxes.xaml b/MainDemo.Wpf/ComboBoxes.xaml index 8ad717f90b..8101944257 100644 --- a/MainDemo.Wpf/ComboBoxes.xaml +++ b/MainDemo.Wpf/ComboBoxes.xaml @@ -237,7 +237,7 @@ diff --git a/MainDemo.Wpf/Fields.xaml b/MainDemo.Wpf/Fields.xaml index 99f99469bc..6ee2767681 100644 --- a/MainDemo.Wpf/Fields.xaml +++ b/MainDemo.Wpf/Fields.xaml @@ -299,7 +299,7 @@ (result.Children[0]); + } + + [StaTheory] + [InlineData(2.0, 1.5, 3.0, 3.0, 4.0)] + [InlineData(1.5, 2.0, 3.0, 2.0, 3.0)] + public void WhenParametersAreSpecifiedAndTranslateTransformDisabledItReturnsTransforms(double scale, double lower, double upper, double x, double y) + { + var converter = new FloatingHintTransformConverter { ApplyTranslateTransform = false }; + + var result = (TransformGroup?)converter.Convert(new object?[] { scale, lower, upper, new Point(x, y) }, typeof(Transform), null, CultureInfo.CurrentUICulture); + + Assert.NotNull(result); + Assert.Equal(1, result.Children.Count); + Assert.IsType(result.Children[0]); + } } diff --git a/MaterialDesignThemes.Wpf/Converters/FloatingHintTransformConverter.cs b/MaterialDesignThemes.Wpf/Converters/FloatingHintTransformConverter.cs index f54292a340..e48c913bfa 100644 --- a/MaterialDesignThemes.Wpf/Converters/FloatingHintTransformConverter.cs +++ b/MaterialDesignThemes.Wpf/Converters/FloatingHintTransformConverter.cs @@ -6,6 +6,9 @@ namespace MaterialDesignThemes.Wpf.Converters { internal class FloatingHintTransformConverter : IMultiValueConverter { + public bool ApplyScaleTransform { get; set; } = true; + public bool ApplyTranslateTransform { get; set; } = true; + public object? Convert(object?[]? values, Type targetType, object? parameter, CultureInfo culture) { if (values == null @@ -22,16 +25,22 @@ internal class FloatingHintTransformConverter : IMultiValueConverter double result = upper + (lower - upper) * scale; var transformGroup = new TransformGroup(); - transformGroup.Children.Add(new ScaleTransform + if (ApplyScaleTransform) { - ScaleX = result, - ScaleY = result - }); - transformGroup.Children.Add(new TranslateTransform + transformGroup.Children.Add(new ScaleTransform + { + ScaleX = result, + ScaleY = result + }); + } + if (ApplyTranslateTransform) { - X = scale * floatingOffset.X, - Y = scale * floatingOffset.Y - }); + transformGroup.Children.Add(new TranslateTransform + { + X = scale * floatingOffset.X, + Y = scale * floatingOffset.Y + }); + } return transformGroup; } diff --git a/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.SmartHint.xaml b/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.SmartHint.xaml index 056e385376..16a33eb6ae 100644 --- a/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.SmartHint.xaml +++ b/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.SmartHint.xaml @@ -1,4 +1,4 @@ - - + + 1.0 - \ No newline at end of file + From e7463d507e53738f892c76b515ef10a7795d2a74 Mon Sep 17 00:00:00 2001 From: Nicolai Henriksen Date: Fri, 13 Jan 2023 23:25:55 +0100 Subject: [PATCH 2/3] Fix CA error in unit tests --- .../Converters/FloatingHintTransformConverterTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MaterialDesignThemes.Wpf.Tests/Converters/FloatingHintTransformConverterTests.cs b/MaterialDesignThemes.Wpf.Tests/Converters/FloatingHintTransformConverterTests.cs index 5ddd597d1e..5c249dfa86 100644 --- a/MaterialDesignThemes.Wpf.Tests/Converters/FloatingHintTransformConverterTests.cs +++ b/MaterialDesignThemes.Wpf.Tests/Converters/FloatingHintTransformConverterTests.cs @@ -63,7 +63,7 @@ public void WhenParametersAreSpecifiedAndScaleTransformDisabledItReturnsTransfor var result = (TransformGroup?)converter.Convert(new object?[] { scale, lower, upper, new Point(x, y) }, typeof(Transform), null, CultureInfo.CurrentUICulture); Assert.NotNull(result); - Assert.Equal(1, result.Children.Count); + Assert.Single(result.Children); Assert.IsType(result.Children[0]); } @@ -77,7 +77,7 @@ public void WhenParametersAreSpecifiedAndTranslateTransformDisabledItReturnsTran var result = (TransformGroup?)converter.Convert(new object?[] { scale, lower, upper, new Point(x, y) }, typeof(Transform), null, CultureInfo.CurrentUICulture); Assert.NotNull(result); - Assert.Equal(1, result.Children.Count); + Assert.Single(result.Children); Assert.IsType(result.Children[0]); } } From 6742b98e6de722658052d8be8fd0d36605514ea8 Mon Sep 17 00:00:00 2001 From: Kevin Bost Date: Sun, 15 Jan 2023 14:15:55 -0800 Subject: [PATCH 3/3] Minor cleanup on the converter --- .../FloatingHintTransformConverterTests.cs | 125 +++++++++--------- .../FloatingHintTransformConverter.cs | 70 +++++----- 2 files changed, 95 insertions(+), 100 deletions(-) diff --git a/MaterialDesignThemes.Wpf.Tests/Converters/FloatingHintTransformConverterTests.cs b/MaterialDesignThemes.Wpf.Tests/Converters/FloatingHintTransformConverterTests.cs index 5c249dfa86..548586d284 100644 --- a/MaterialDesignThemes.Wpf.Tests/Converters/FloatingHintTransformConverterTests.cs +++ b/MaterialDesignThemes.Wpf.Tests/Converters/FloatingHintTransformConverterTests.cs @@ -3,84 +3,81 @@ using MaterialDesignThemes.Wpf.Converters; using Xunit; -namespace MaterialDesignThemes.Wpf.Tests.Converters +namespace MaterialDesignThemes.Wpf.Tests.Converters; + +public class FloatingHintTransformConverterTests { - public class FloatingHintTransformConverterTests - { - public static IEnumerable InvalidParameters => - new[] - { - new object?[] {null, null, null, null}, - new object?[] {1.0, null, null, null}, - new object?[] {null, 1.0, null, null}, - new object?[] {null, null, 1.0, null}, - new object?[] {null, null, null, new Point()}, - new object?[] {1.0, DependencyProperty.UnsetValue, DependencyProperty.UnsetValue, DependencyProperty.UnsetValue}, - new object?[] {DependencyProperty.UnsetValue, 1.0, DependencyProperty.UnsetValue, DependencyProperty.UnsetValue}, - new object?[] {DependencyProperty.UnsetValue, DependencyProperty.UnsetValue, 1.0, DependencyProperty.UnsetValue}, - new object?[] {DependencyProperty.UnsetValue, DependencyProperty.UnsetValue, DependencyProperty.UnsetValue, new Point() }, - }; - - [StaTheory] - [MemberData(nameof(InvalidParameters))] - public void WhenParametersAreNotSetItReturnsIdentity(object? scale, object? lower, object? upper, object? offset) + public static IEnumerable InvalidParameters => + new[] { - var converter = new FloatingHintTransformConverter(); + new object?[] {null, null, null, null}, + new object?[] {1.0, null, null, null}, + new object?[] {null, 1.0, null, null}, + new object?[] {null, null, 1.0, null}, + new object?[] {null, null, null, new Point()}, + new object?[] {1.0, DependencyProperty.UnsetValue, DependencyProperty.UnsetValue, DependencyProperty.UnsetValue}, + new object?[] {DependencyProperty.UnsetValue, 1.0, DependencyProperty.UnsetValue, DependencyProperty.UnsetValue}, + new object?[] {DependencyProperty.UnsetValue, DependencyProperty.UnsetValue, 1.0, DependencyProperty.UnsetValue}, + new object?[] {DependencyProperty.UnsetValue, DependencyProperty.UnsetValue, DependencyProperty.UnsetValue, new Point() }, + }; + + [Theory] + [MemberData(nameof(InvalidParameters))] + public void WhenParametersAreNotSetItReturnsIdentity(object? scale, object? lower, object? upper, object? offset) + { + var converter = new FloatingHintTransformConverter(); - var result = converter.Convert(new[] { scale, lower, upper, offset }, - typeof(Transform), null, CultureInfo.CurrentUICulture); + var result = converter.Convert(new[] { scale, lower, upper, offset }, + typeof(Transform), null, CultureInfo.CurrentUICulture); - Assert.Equal(Transform.Identity, result); - } + Assert.Equal(Transform.Identity, result); + } - [StaTheory] - [InlineData(2.0, 1.5, 3.0, 3.0, 4.0)] - [InlineData(1.5, 2.0, 3.0, 2.0, 3.0)] - public void WhenParametersAreSpecifiedItReturnsTransforms(double scale, double lower, double upper, double x, double y) - { - var converter = new FloatingHintTransformConverter(); + [Theory] + [InlineData(2.0, 1.5, 3.0, 3.0, 4.0)] + [InlineData(1.5, 2.0, 3.0, 2.0, 3.0)] + public void WhenParametersAreSpecifiedItReturnsTransforms(double scale, double lower, double upper, double x, double y) + { + var converter = new FloatingHintTransformConverter(); - var result = (TransformGroup?)converter.Convert(new object?[] { scale, lower, upper, new Point(x, y) }, typeof(Transform), null, CultureInfo.CurrentUICulture); + var result = (TransformGroup?)converter.Convert(new object?[] { scale, lower, upper, new Point(x, y) }, typeof(Transform), null, CultureInfo.CurrentUICulture); - Assert.NotNull(result); - var scaleTransform = (ScaleTransform)result!.Children[0]; - var translateTransform = (TranslateTransform)result.Children[1]; + Assert.NotNull(result); + var scaleTransform = (ScaleTransform)result!.Children[0]; + var translateTransform = (TranslateTransform)result.Children[1]; - Assert.Equal(upper + (lower - upper) * scale, scaleTransform.ScaleX); - Assert.Equal(upper + (lower - upper) * scale, scaleTransform.ScaleY); + Assert.Equal(upper + (lower - upper) * scale, scaleTransform.ScaleX); + Assert.Equal(upper + (lower - upper) * scale, scaleTransform.ScaleY); - Assert.Equal(scale * x, translateTransform.X); - Assert.Equal(scale * y, translateTransform.Y); - } + Assert.Equal(scale * x, translateTransform.X); + Assert.Equal(scale * y, translateTransform.Y); + } - [StaTheory] - [InlineData(2.0, 1.5, 3.0, 3.0, 4.0)] - [InlineData(1.5, 2.0, 3.0, 2.0, 3.0)] - public void WhenParametersAreSpecifiedAndScaleTransformDisabledItReturnsTransforms(double scale, double lower, double upper, double x, double y) - { - var converter = new FloatingHintTransformConverter { ApplyScaleTransform = false }; + [Theory] + [InlineData(2.0, 1.5, 3.0, 3.0, 4.0)] + [InlineData(1.5, 2.0, 3.0, 2.0, 3.0)] + public void WhenParametersAreSpecifiedAndScaleTransformDisabledItReturnsTransforms(double scale, double lower, double upper, double x, double y) + { + var converter = new FloatingHintTransformConverter { ApplyScaleTransform = false }; - var result = (TransformGroup?)converter.Convert(new object?[] { scale, lower, upper, new Point(x, y) }, typeof(Transform), null, CultureInfo.CurrentUICulture); + var result = (TransformGroup?)converter.Convert(new object?[] { scale, lower, upper, new Point(x, y) }, typeof(Transform), null, CultureInfo.CurrentUICulture); - Assert.NotNull(result); - Assert.Single(result.Children); - Assert.IsType(result.Children[0]); - } + Assert.NotNull(result); + Assert.Single(result.Children); + Assert.IsType(result.Children[0]); + } - [StaTheory] - [InlineData(2.0, 1.5, 3.0, 3.0, 4.0)] - [InlineData(1.5, 2.0, 3.0, 2.0, 3.0)] - public void WhenParametersAreSpecifiedAndTranslateTransformDisabledItReturnsTransforms(double scale, double lower, double upper, double x, double y) - { - var converter = new FloatingHintTransformConverter { ApplyTranslateTransform = false }; + [Theory] + [InlineData(2.0, 1.5, 3.0, 3.0, 4.0)] + [InlineData(1.5, 2.0, 3.0, 2.0, 3.0)] + public void WhenParametersAreSpecifiedAndTranslateTransformDisabledItReturnsTransforms(double scale, double lower, double upper, double x, double y) + { + var converter = new FloatingHintTransformConverter { ApplyTranslateTransform = false }; - var result = (TransformGroup?)converter.Convert(new object?[] { scale, lower, upper, new Point(x, y) }, typeof(Transform), null, CultureInfo.CurrentUICulture); + var result = (TransformGroup?)converter.Convert(new object?[] { scale, lower, upper, new Point(x, y) }, typeof(Transform), null, CultureInfo.CurrentUICulture); - Assert.NotNull(result); - Assert.Single(result.Children); - Assert.IsType(result.Children[0]); - } + Assert.NotNull(result); + Assert.Single(result.Children); + Assert.IsType(result.Children[0]); } - - } diff --git a/MaterialDesignThemes.Wpf/Converters/FloatingHintTransformConverter.cs b/MaterialDesignThemes.Wpf/Converters/FloatingHintTransformConverter.cs index e48c913bfa..e08f43519e 100644 --- a/MaterialDesignThemes.Wpf/Converters/FloatingHintTransformConverter.cs +++ b/MaterialDesignThemes.Wpf/Converters/FloatingHintTransformConverter.cs @@ -2,49 +2,47 @@ using System.Windows.Data; using System.Windows.Media; -namespace MaterialDesignThemes.Wpf.Converters +namespace MaterialDesignThemes.Wpf.Converters; + +internal class FloatingHintTransformConverter : IMultiValueConverter { - internal class FloatingHintTransformConverter : IMultiValueConverter - { - public bool ApplyScaleTransform { get; set; } = true; - public bool ApplyTranslateTransform { get; set; } = true; + public bool ApplyScaleTransform { get; set; } = true; + public bool ApplyTranslateTransform { get; set; } = true; - public object? Convert(object?[]? values, Type targetType, object? parameter, CultureInfo culture) + public object? Convert(object?[]? values, Type targetType, object? parameter, CultureInfo culture) + { + if (values?.Length != 4 + || values.Any(v => v == null) + || !double.TryParse(values[0]!.ToString(), out double scale) + || !double.TryParse(values[1]!.ToString(), out double lower) + || !double.TryParse(values[2]!.ToString(), out double upper) + || values[3] is not Point floatingOffset) { - if (values == null - || values.Length != 4 - || values.Any(v => v == null) - || !double.TryParse(values[0]?.ToString(), out double scale) - || !double.TryParse(values[1]?.ToString(), out double lower) - || !double.TryParse(values[2]?.ToString(), out double upper) - || !(values[3] is Point floatingOffset)) - { - return Transform.Identity; - } + return Transform.Identity; + } - double result = upper + (lower - upper) * scale; + double result = upper + (lower - upper) * scale; - var transformGroup = new TransformGroup(); - if (ApplyScaleTransform) + var transformGroup = new TransformGroup(); + if (ApplyScaleTransform) + { + transformGroup.Children.Add(new ScaleTransform { - transformGroup.Children.Add(new ScaleTransform - { - ScaleX = result, - ScaleY = result - }); - } - if (ApplyTranslateTransform) + ScaleX = result, + ScaleY = result + }); + } + if (ApplyTranslateTransform) + { + transformGroup.Children.Add(new TranslateTransform { - transformGroup.Children.Add(new TranslateTransform - { - X = scale * floatingOffset.X, - Y = scale * floatingOffset.Y - }); - } - return transformGroup; + X = scale * floatingOffset.X, + Y = scale * floatingOffset.Y + }); } - - public object?[]? ConvertBack(object? value, Type[] targetTypes, object? parameter, CultureInfo culture) - => throw new NotImplementedException(); + return transformGroup; } + + public object?[]? ConvertBack(object? value, Type[] targetTypes, object? parameter, CultureInfo culture) + => throw new NotImplementedException(); }