From e6bd7d5e0189c9cecc2333bab3bd71347ca4f414 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Wed, 10 Feb 2021 00:33:56 -0500 Subject: [PATCH 01/12] Remove Maximum setter from Fluent ProgressBar --- src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml b/src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml index 036595b61c..53eca197d3 100644 --- a/src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml +++ b/src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml @@ -12,7 +12,6 @@ - From 3417cebae1b8fe44b3ff54fc7cd34b1f0dd8cf22 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Wed, 10 Feb 2021 00:34:52 -0500 Subject: [PATCH 02/12] Update progress bar samples to include Maximum/Minimum examples --- samples/ControlCatalog/Pages/ProgressBarPage.xaml | 7 +++++++ src/Avalonia.Themes.Default/ProgressBar.xaml | 5 ++++- src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml | 5 ++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/samples/ControlCatalog/Pages/ProgressBarPage.xaml b/samples/ControlCatalog/Pages/ProgressBarPage.xaml index 2ec0b48c76..da8ef6cf07 100644 --- a/samples/ControlCatalog/Pages/ProgressBarPage.xaml +++ b/samples/ControlCatalog/Pages/ProgressBarPage.xaml @@ -15,6 +15,13 @@ + + + + + + + diff --git a/src/Avalonia.Themes.Default/ProgressBar.xaml b/src/Avalonia.Themes.Default/ProgressBar.xaml index d9c407245b..fb4b23b9ad 100644 --- a/src/Avalonia.Themes.Default/ProgressBar.xaml +++ b/src/Avalonia.Themes.Default/ProgressBar.xaml @@ -1,8 +1,11 @@ - + + + + diff --git a/src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml b/src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml index 53eca197d3..0dfd3e414a 100644 --- a/src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml +++ b/src/Avalonia.Themes.Fluent/Controls/ProgressBar.xaml @@ -1,8 +1,11 @@ - + + + + From 4554884728145741a4369350ff56dc5812b0400b Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Mon, 15 Feb 2021 23:01:59 +0100 Subject: [PATCH 03/12] Parse classes during XAML compilation. --- .../AvaloniaXamlIlLanguageParseIntrinsics.cs | 9 +++++++++ .../Transformers/AvaloniaXamlIlWellKnownTypes.cs | 2 ++ 2 files changed, 11 insertions(+) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs index 7c4cc8d28b..616a811a84 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs @@ -198,6 +198,15 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions return ConvertDefinitionList(node, text, types, types.RowDefinitions, types.RowDefinition, "row definitions", out result); } + if (type.Equals(types.Classes)) + { + var classes = text.Split(' '); + var classNodes = classes.Select(c => new XamlConstantNode(node, types.XamlIlTypes.String, c)).ToArray(); + + result = new AvaloniaXamlIlAvaloniaListConstantAstNode(node, types, types.Classes, types.XamlIlTypes.String, classNodes); + return true; + } + result = null; return false; } diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs index 125701ca9e..34aae2c5ed 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs @@ -77,6 +77,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public IXamlType RowDefinitions { get; } public IXamlType ColumnDefinition { get; } public IXamlType ColumnDefinitions { get; } + public IXamlType Classes { get; } public AvaloniaXamlIlWellKnownTypes(TransformerConfiguration cfg) { @@ -166,6 +167,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers ColumnDefinitions = cfg.TypeSystem.GetType("Avalonia.Controls.ColumnDefinitions"); RowDefinition = cfg.TypeSystem.GetType("Avalonia.Controls.RowDefinition"); RowDefinitions = cfg.TypeSystem.GetType("Avalonia.Controls.RowDefinitions"); + Classes = cfg.TypeSystem.GetType("Avalonia.Controls.Classes"); } } From 4f96de0e6b27235f5cc45d5c3d8b63cdb37ef35b Mon Sep 17 00:00:00 2001 From: luthfiampas Date: Tue, 16 Feb 2021 10:32:27 +0700 Subject: [PATCH 04/12] fix slow/delay TextBox selection --- src/Avalonia.Controls/Presenters/TextPresenter.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Presenters/TextPresenter.cs b/src/Avalonia.Controls/Presenters/TextPresenter.cs index 6bbb1c13bf..3bec46a9ac 100644 --- a/src/Avalonia.Controls/Presenters/TextPresenter.cs +++ b/src/Avalonia.Controls/Presenters/TextPresenter.cs @@ -80,7 +80,9 @@ namespace Avalonia.Controls.Presenters static TextPresenter() { AffectsRender(SelectionBrushProperty, TextBlock.ForegroundProperty, - SelectionForegroundBrushProperty, CaretBrushProperty); + SelectionForegroundBrushProperty, CaretBrushProperty, + SelectionStartProperty, SelectionEndProperty); + AffectsMeasure(TextProperty, PasswordCharProperty, RevealPasswordProperty, TextAlignmentProperty, TextWrappingProperty, TextBlock.FontSizeProperty, TextBlock.FontStyleProperty, TextBlock.FontWeightProperty, TextBlock.FontFamilyProperty); From 8d90e8b9197a77278d59238f39fd4fde8812dab0 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Tue, 16 Feb 2021 10:43:58 +0100 Subject: [PATCH 05/12] Update XamlX --- src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github index ea80a607c5..f3ca2028f4 160000 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github @@ -1 +1 @@ -Subproject commit ea80a607c5e9d8f000160dbbb48c27ed4cfafbc9 +Subproject commit f3ca2028f4f64be3556a6afd22f192902de095e5 From b460a5f1208fa9b430ef41656607306cc00f4d2b Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Tue, 16 Feb 2021 15:18:27 +0100 Subject: [PATCH 06/12] Use text node instead. --- .../CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs index 616a811a84..90d596b584 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs @@ -201,7 +201,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions if (type.Equals(types.Classes)) { var classes = text.Split(' '); - var classNodes = classes.Select(c => new XamlConstantNode(node, types.XamlIlTypes.String, c)).ToArray(); + var classNodes = classes.Select(c => new XamlAstTextNode(node, c)).ToArray(); result = new AvaloniaXamlIlAvaloniaListConstantAstNode(node, types, types.Classes, types.XamlIlTypes.String, classNodes); return true; From 8eb9afa815a5bfb8f48a335538e0596d593e534e Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Tue, 16 Feb 2021 19:39:50 +0100 Subject: [PATCH 07/12] Specify string type directly. --- .../CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs index 90d596b584..059b5650cb 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs @@ -201,7 +201,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions if (type.Equals(types.Classes)) { var classes = text.Split(' '); - var classNodes = classes.Select(c => new XamlAstTextNode(node, c)).ToArray(); + var classNodes = classes.Select(c => new XamlAstTextNode(node, c, types.XamlIlTypes.String)).ToArray(); result = new AvaloniaXamlIlAvaloniaListConstantAstNode(node, types, types.Classes, types.XamlIlTypes.String, classNodes); return true; From aa737fbd5806d127356417091214497dc3e74003 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 17 Feb 2021 17:01:44 +0100 Subject: [PATCH 08/12] Dispose the frame returned from BitmapDecoder.GetFrame. Fixes #975. --- .../Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs index 90592ea806..cac35aa4ae 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs @@ -42,8 +42,9 @@ namespace Avalonia.Direct2D1.Media public WicBitmapImpl(string fileName) { using (var decoder = new BitmapDecoder(Direct2D1Platform.ImagingFactory, fileName, DecodeOptions.CacheOnDemand)) + using (var frame = decoder.GetFrame(0)) { - WicImpl = new Bitmap(Direct2D1Platform.ImagingFactory, decoder.GetFrame(0), BitmapCreateCacheOption.CacheOnDemand); + WicImpl = new Bitmap(Direct2D1Platform.ImagingFactory, frame, BitmapCreateCacheOption.CacheOnDemand); Dpi = new Vector(96, 96); } } @@ -63,7 +64,8 @@ namespace Avalonia.Direct2D1.Media // https://stackoverflow.com/questions/48982749/decoding-image-from-stream-using-wic/48982889#48982889 _decoder = new BitmapDecoder(Direct2D1Platform.ImagingFactory, stream, DecodeOptions.CacheOnLoad); - WicImpl = new Bitmap(Direct2D1Platform.ImagingFactory, _decoder.GetFrame(0), BitmapCreateCacheOption.CacheOnLoad); + using var frame = _decoder.GetFrame(0); + WicImpl = new Bitmap(Direct2D1Platform.ImagingFactory, frame, BitmapCreateCacheOption.CacheOnLoad); Dpi = new Vector(96, 96); } @@ -120,7 +122,7 @@ namespace Avalonia.Direct2D1.Media { _decoder = new BitmapDecoder(Direct2D1Platform.ImagingFactory, stream, DecodeOptions.CacheOnLoad); - var frame = _decoder.GetFrame(0); + using var frame = _decoder.GetFrame(0); // now scale that to the size that we want var realScale = horizontal ? ((double)frame.Size.Height / frame.Size.Width) : ((double)frame.Size.Width / frame.Size.Height); From 11e2d9250c3f967d44f2d99f230677a852b6a542 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Sun, 21 Feb 2021 21:12:45 +0100 Subject: [PATCH 09/12] Reduce memory pressure when using bindings. --- src/Avalonia.Base/Data/BindingOperations.cs | 28 ++++++++++++++++++- .../Reactive/AvaloniaPropertyObservable.cs | 5 ++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Base/Data/BindingOperations.cs b/src/Avalonia.Base/Data/BindingOperations.cs index dc8421fb35..42f941da0c 100644 --- a/src/Avalonia.Base/Data/BindingOperations.cs +++ b/src/Avalonia.Base/Data/BindingOperations.cs @@ -45,7 +45,7 @@ namespace Avalonia.Data case BindingMode.OneWay: return target.Bind(property, binding.Observable ?? binding.Subject, binding.Priority); case BindingMode.TwoWay: - return new CompositeDisposable( + return new TwoWayBindingDisposable( target.Bind(property, binding.Subject, binding.Priority), target.GetObservable(property).Subscribe(binding.Subject)); case BindingMode.OneTime: @@ -88,6 +88,32 @@ namespace Avalonia.Data throw new ArgumentException("Invalid binding mode."); } } + + private sealed class TwoWayBindingDisposable : IDisposable + { + private readonly IDisposable _first; + private readonly IDisposable _second; + private bool _isDisposed; + + public TwoWayBindingDisposable(IDisposable first, IDisposable second) + { + _first = first; + _second = second; + } + + public void Dispose() + { + if (_isDisposed) + { + return; + } + + _first.Dispose(); + _second.Dispose(); + + _isDisposed = true; + } + } } public sealed class DoNothingType diff --git a/src/Avalonia.Base/Reactive/AvaloniaPropertyObservable.cs b/src/Avalonia.Base/Reactive/AvaloniaPropertyObservable.cs index 238aba5c96..6a3f9b0b30 100644 --- a/src/Avalonia.Base/Reactive/AvaloniaPropertyObservable.cs +++ b/src/Avalonia.Base/Reactive/AvaloniaPropertyObservable.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace Avalonia.Reactive { @@ -55,9 +56,9 @@ namespace Avalonia.Reactive newValue = (T)e.Sender.GetValue(e.Property); } - if (!Equals(newValue, _value)) + if (!EqualityComparer.Default.Equals(newValue, _value)) { - _value = (T)newValue; + _value = newValue; PublishNext(_value); } } From 52de38d8a1c1c28b848b37f735c2347daf90986c Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 22 Feb 2021 21:58:42 +0000 Subject: [PATCH 10/12] fix handling of becomeKeyWindow on OSX. --- native/Avalonia.Native/src/OSX/window.mm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 9d49025398..7fa6614d4d 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -2068,17 +2068,17 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent -(void)becomeKeyWindow { + [self showWindowMenuWithAppMenu]; + if([self activateAppropriateChild: true]) { - [self showWindowMenuWithAppMenu]; - if(_parent != nullptr) { _parent->BaseEvents->Activated(); } - - [super becomeKeyWindow]; } + + [super becomeKeyWindow]; } -(void) restoreParentWindow; From 52a3b6ef19e9b74983264f019d2f7184d418659c Mon Sep 17 00:00:00 2001 From: Jeffrey Ye Date: Mon, 22 Feb 2021 23:50:14 -0800 Subject: [PATCH 11/12] Fix #5541 --- src/Avalonia.Dialogs/ManagedFileChooserSources.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Avalonia.Dialogs/ManagedFileChooserSources.cs b/src/Avalonia.Dialogs/ManagedFileChooserSources.cs index 0dc024c4dd..5f2bd7a9cd 100644 --- a/src/Avalonia.Dialogs/ManagedFileChooserSources.cs +++ b/src/Avalonia.Dialogs/ManagedFileChooserSources.cs @@ -71,6 +71,10 @@ namespace Avalonia.Dialogs { return null; } + catch (DirectoryNotFoundException _) + { + return null; + } return new ManagedFileChooserNavigationItem { From ad6b76be7f9eb11a5bfcb32087296e0b9362299d Mon Sep 17 00:00:00 2001 From: Jeffrey Ye Date: Tue, 23 Feb 2021 00:26:46 -0800 Subject: [PATCH 12/12] ignore all exceptions --- src/Avalonia.Dialogs/ManagedFileChooserSources.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Avalonia.Dialogs/ManagedFileChooserSources.cs b/src/Avalonia.Dialogs/ManagedFileChooserSources.cs index 5f2bd7a9cd..050d618ce1 100644 --- a/src/Avalonia.Dialogs/ManagedFileChooserSources.cs +++ b/src/Avalonia.Dialogs/ManagedFileChooserSources.cs @@ -67,11 +67,7 @@ namespace Avalonia.Dialogs { Directory.GetFiles(x.VolumePath); } - catch (UnauthorizedAccessException _) - { - return null; - } - catch (DirectoryNotFoundException _) + catch (Exception _) { return null; }