From d8615643dd9b0ec242c943da22c88372e0fb8b02 Mon Sep 17 00:00:00 2001 From: Karnah Date: Thu, 21 Jun 2018 12:47:38 +0500 Subject: [PATCH 1/7] Fixed NullReferenceException for ImageBush with null Source --- .../Media/DrawingContextImpl.cs | 2 +- .../Media/ImageBrushTests.cs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs index bdbbdab2b9..479db51be4 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs @@ -394,7 +394,7 @@ namespace Avalonia.Direct2D1.Media { return new RadialGradientBrushImpl(radialGradientBrush, _renderTarget, destinationSize); } - else if (imageBrush != null) + else if (imageBrush?.Source != null) { return new ImageBrushImpl( imageBrush, diff --git a/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs b/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs index 0107002274..d1f51a1a0c 100644 --- a/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs +++ b/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs @@ -32,6 +32,23 @@ namespace Avalonia.Direct2D1.RenderTests.Media get { return System.IO.Path.Combine(OutputPath, "github_icon_small.png"); } } + [Fact] + public async Task ImageBrush_NullSource() + { + Decorator target = new Decorator + { + Width = 200, + Height = 200, + Child = new Rectangle + { + Margin = new Thickness(8), + Fill = new ImageBrush() + } + }; + + await RenderToFile(target); + } + [Fact] public async Task ImageBrush_Tile_Fill() { From 48dd3b94d1ad0d1ea8dbc2c4e6c859196862c821 Mon Sep 17 00:00:00 2001 From: Karnah Date: Tue, 26 Jun 2018 11:28:45 +0500 Subject: [PATCH 2/7] Using transparent brush when image source is null --- src/Skia/Avalonia.Skia/DrawingContextImpl.cs | 4 ++++ .../Avalonia.RenderTests/Media/ImageBrushTests.cs | 1 + .../ImageBrush/ImageBrush_NullSource.expected.png | Bin 0 -> 250 bytes .../ImageBrush/ImageBrush_NullSource.expected.png | Bin 0 -> 250 bytes 4 files changed, 5 insertions(+) create mode 100644 tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NullSource.expected.png create mode 100644 tests/TestFiles/Skia/Media/ImageBrush/ImageBrush_NullSource.expected.png diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index b7ce6eedc4..d2c4bd0aa1 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -491,6 +491,10 @@ namespace Avalonia.Skia { ConfigureTileBrush(ref paintWrapper, targetSize, tileBrush, tileBrushImage); } + else + { + paint.Color = new SKColor(255, 255, 255, 0); + } return paintWrapper; } diff --git a/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs b/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs index d1f51a1a0c..3a41585d04 100644 --- a/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs +++ b/tests/Avalonia.RenderTests/Media/ImageBrushTests.cs @@ -47,6 +47,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media }; await RenderToFile(target); + CompareImages(); } [Fact] diff --git a/tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NullSource.expected.png b/tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NullSource.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9409ee63e2d96335b03121247027d66340b190 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu@pObhHwBu4M$1`kiXH>#WAE} r&f9~Gj6hzK!vFPo9u6SpAO$s&h0homeHw~bKo0bD^>bP0l+XkKkl+`x literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Media/ImageBrush/ImageBrush_NullSource.expected.png b/tests/TestFiles/Skia/Media/ImageBrush/ImageBrush_NullSource.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9409ee63e2d96335b03121247027d66340b190 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu@pObhHwBu4M$1`kiXH>#WAE} r&f9~Gj6hzK!vFPo9u6SpAO$s&h0homeHw~bKo0bD^>bP0l+XkKkl+`x literal 0 HcmV?d00001 From 6d4694b471a7f2a38520d7ac8540c5cb4df78b28 Mon Sep 17 00:00:00 2001 From: CommonGuy Date: Mon, 2 Jul 2018 09:00:32 +0200 Subject: [PATCH 3/7] Add checks for null in Windows SystemDialogImpl --- src/Windows/Avalonia.Win32/SystemDialogImpl.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Windows/Avalonia.Win32/SystemDialogImpl.cs b/src/Windows/Avalonia.Win32/SystemDialogImpl.cs index d555e93a88..8a5617789b 100644 --- a/src/Windows/Avalonia.Win32/SystemDialogImpl.cs +++ b/src/Windows/Avalonia.Win32/SystemDialogImpl.cs @@ -37,13 +37,16 @@ namespace Avalonia.Win32 var defaultExtension = (dialog as SaveFileDialog)?.DefaultExtension ?? ""; frm.SetDefaultExtension(defaultExtension); frm.SetFileName(dialog.InitialFileName ?? ""); - frm.SetTitle(dialog.Title); + frm.SetTitle(dialog.Title ?? ""); var filters = new List(); - foreach (var filter in dialog.Filters) + if (dialog.Filters != null) { - var extMask = string.Join(";", filter.Extensions.Select(e => "*." + e)); - filters.Add(new UnmanagedMethods.COMDLG_FILTERSPEC { pszName = filter.Name, pszSpec = extMask }); + foreach (var filter in dialog.Filters) + { + var extMask = string.Join(";", filter.Extensions.Select(e => "*." + e)); + filters.Add(new UnmanagedMethods.COMDLG_FILTERSPEC { pszName = filter.Name, pszSpec = extMask }); + } } if (filters.Count == 0) filters.Add(new UnmanagedMethods.COMDLG_FILTERSPEC { pszName = "All files", pszSpec = "*.*" }); From 54a919a7284894f6ed99e28097ea97d45721ce7f Mon Sep 17 00:00:00 2001 From: CommonGuy Date: Mon, 2 Jul 2018 09:16:45 +0200 Subject: [PATCH 4/7] Ensure that selected items in Windows FileDialog are filesystem items --- src/Windows/Avalonia.Win32/SystemDialogImpl.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Windows/Avalonia.Win32/SystemDialogImpl.cs b/src/Windows/Avalonia.Win32/SystemDialogImpl.cs index 8a5617789b..020e6aa0ea 100644 --- a/src/Windows/Avalonia.Win32/SystemDialogImpl.cs +++ b/src/Windows/Avalonia.Win32/SystemDialogImpl.cs @@ -13,6 +13,9 @@ namespace Avalonia.Win32 class SystemDialogImpl : ISystemDialogImpl { + private const UnmanagedMethods.FOS DefaultDialogOptions = UnmanagedMethods.FOS.FOS_PICKFOLDERS | UnmanagedMethods.FOS.FOS_FORCEFILESYSTEM | UnmanagedMethods.FOS.FOS_NOVALIDATE | + UnmanagedMethods.FOS.FOS_NOTESTFILECREATE | UnmanagedMethods.FOS.FOS_DONTADDTORECENT; + public unsafe Task ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent) { var hWnd = parent?.Handle?.Handle ?? IntPtr.Zero; @@ -29,7 +32,7 @@ namespace Avalonia.Win32 uint options; frm.GetOptions(out options); - options |= (uint)(UnmanagedMethods.FOS.FOS_NOVALIDATE | UnmanagedMethods.FOS.FOS_NOTESTFILECREATE | UnmanagedMethods.FOS.FOS_DONTADDTORECENT); + options |= (uint)(DefaultDialogOptions); if (openDialog?.AllowMultiple == true) options |= (uint)UnmanagedMethods.FOS.FOS_ALLOWMULTISELECT; frm.SetOptions(options); @@ -109,7 +112,7 @@ namespace Avalonia.Win32 var frm = (UnmanagedMethods.IFileDialog)unk; uint options; frm.GetOptions(out options); - options |= (uint)(UnmanagedMethods.FOS.FOS_PICKFOLDERS | UnmanagedMethods.FOS.FOS_FORCEFILESYSTEM | UnmanagedMethods.FOS.FOS_NOVALIDATE | UnmanagedMethods.FOS.FOS_NOTESTFILECREATE | UnmanagedMethods.FOS.FOS_DONTADDTORECENT); + options |= (uint)(UnmanagedMethods.FOS.FOS_PICKFOLDERS | DefaultDialogOptions); frm.SetOptions(options); if (dialog.InitialDirectory != null) From 8ab89b1c3581eccd041fe652e2b87c1cb1bcb5bd Mon Sep 17 00:00:00 2001 From: CommonGuy Date: Mon, 2 Jul 2018 17:24:57 +0200 Subject: [PATCH 5/7] FOS_PICKFOLDERS should not be a default options for Windows SystemDialogs --- src/Windows/Avalonia.Win32/SystemDialogImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Win32/SystemDialogImpl.cs b/src/Windows/Avalonia.Win32/SystemDialogImpl.cs index 020e6aa0ea..dec5e3a544 100644 --- a/src/Windows/Avalonia.Win32/SystemDialogImpl.cs +++ b/src/Windows/Avalonia.Win32/SystemDialogImpl.cs @@ -13,7 +13,7 @@ namespace Avalonia.Win32 class SystemDialogImpl : ISystemDialogImpl { - private const UnmanagedMethods.FOS DefaultDialogOptions = UnmanagedMethods.FOS.FOS_PICKFOLDERS | UnmanagedMethods.FOS.FOS_FORCEFILESYSTEM | UnmanagedMethods.FOS.FOS_NOVALIDATE | + private const UnmanagedMethods.FOS DefaultDialogOptions = UnmanagedMethods.FOS.FOS_FORCEFILESYSTEM | UnmanagedMethods.FOS.FOS_NOVALIDATE | UnmanagedMethods.FOS.FOS_NOTESTFILECREATE | UnmanagedMethods.FOS.FOS_DONTADDTORECENT; public unsafe Task ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent) From 09892554c49e8ad74d8aa7ba72f9b563dd53aaa9 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 17 Jul 2018 19:43:31 +0100 Subject: [PATCH 6/7] dont clear textbox selection when right clicking. --- src/Avalonia.Controls/TextBox.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 2ea9319194..5b09fbfb51 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -557,7 +557,7 @@ namespace Avalonia.Controls var index = CaretIndex = _presenter.GetCaretIndex(point); var text = Text; - if (text != null) + if (text != null && e.MouseButton == MouseButton.Left) { switch (e.ClickCount) { From 70544b44abfc1875e13f4b589cb9bfb8618aec92 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 18 Jul 2018 23:28:14 +0200 Subject: [PATCH 7/7] Allow BindingMode.Default in Setter bindings. Fixes #1754. --- src/Avalonia.Styling/Styling/Setter.cs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Styling/Styling/Setter.cs b/src/Avalonia.Styling/Styling/Setter.cs index 1a78e0f4d7..31b685f6b1 100644 --- a/src/Avalonia.Styling/Styling/Setter.cs +++ b/src/Avalonia.Styling/Styling/Setter.cs @@ -158,18 +158,11 @@ namespace Avalonia.Styling var activated = new ActivatedObservable(activator, sourceInstance.Observable, description); return InstancedBinding.OneWay(activated, BindingPriority.StyleTrigger); } - case BindingMode.OneWayToSource: - { - var activated = new ActivatedSubject(activator, sourceInstance.Subject, description); - return InstancedBinding.OneWayToSource(activated, BindingPriority.StyleTrigger); - } - case BindingMode.TwoWay: + default: { var activated = new ActivatedSubject(activator, sourceInstance.Subject, description); - return InstancedBinding.TwoWay(activated, BindingPriority.StyleTrigger); + return new InstancedBinding(activated, sourceInstance.Mode, BindingPriority.StyleTrigger); } - default: - throw new NotSupportedException("Unsupported BindingMode."); } }