From a4c08adeb79e8188badc45b14c5b168f7cffda7e Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Sat, 26 Sep 2020 11:41:23 +0200 Subject: [PATCH 1/7] fixes Issue #3428 : ComboBox should react on PointerReleasedEvent instead of PointerPressedEvent --- src/Avalonia.Controls/ComboBox.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs index 27313b0b4c..02a9daee75 100644 --- a/src/Avalonia.Controls/ComboBox.cs +++ b/src/Avalonia.Controls/ComboBox.cs @@ -257,7 +257,7 @@ namespace Avalonia.Controls } /// - protected override void OnPointerPressed(PointerPressedEventArgs e) + protected override void OnPointerReleased(PointerReleasedEventArgs e) { if (!e.Handled) { @@ -276,7 +276,7 @@ namespace Avalonia.Controls } } - base.OnPointerPressed(e); + base.OnPointerReleased(e); } /// From 9425ca8420cb23f63e4cc2683d17d208aa5f0ee3 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Sat, 26 Sep 2020 12:49:40 +0200 Subject: [PATCH 2/7] fixed test --- tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs b/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs index 3ae91c8bba..783215fb5d 100644 --- a/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs @@ -2,7 +2,6 @@ using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; using Avalonia.Controls.Shapes; using Avalonia.Controls.Templates; -using Avalonia.Input; using Avalonia.LogicalTree; using Avalonia.Media; using Avalonia.UnitTests; @@ -27,6 +26,7 @@ namespace Avalonia.Controls.UnitTests Assert.True(target.IsDropDownOpen); _helper.Down(target); + _helper.Up(target); Assert.False(target.IsDropDownOpen); } From c6fbe25aefdfbf29e5508853bf2f3c5ec6391141 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Sat, 26 Sep 2020 13:01:05 +0200 Subject: [PATCH 3/7] CalendarDatePicker should react on PointerReleasedEvent instead of PointerPressedEvent --- src/Avalonia.Controls/Calendar/CalendarDatePicker.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs b/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs index 046b55d49a..7c259f0a09 100644 --- a/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs +++ b/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs @@ -420,7 +420,7 @@ namespace Avalonia.Controls _calendar.DayButtonMouseUp -= Calendar_DayButtonMouseUp; _calendar.DisplayDateChanged -= Calendar_DisplayDateChanged; _calendar.SelectedDatesChanged -= Calendar_SelectedDatesChanged; - _calendar.PointerPressed -= Calendar_PointerPressed; + _calendar.PointerReleased -= Calendar_PointerReleased; _calendar.KeyDown -= Calendar_KeyDown; } _calendar = e.NameScope.Find(ElementCalendar); @@ -435,7 +435,7 @@ namespace Avalonia.Controls _calendar.DayButtonMouseUp += Calendar_DayButtonMouseUp; _calendar.DisplayDateChanged += Calendar_DisplayDateChanged; _calendar.SelectedDatesChanged += Calendar_SelectedDatesChanged; - _calendar.PointerPressed += Calendar_PointerPressed; + _calendar.PointerReleased += Calendar_PointerReleased; _calendar.KeyDown += Calendar_KeyDown; //_calendar.SizeChanged += new SizeChangedEventHandler(Calendar_SizeChanged); //_calendar.IsTabStop = true; @@ -831,9 +831,10 @@ namespace Avalonia.Controls } } } - private void Calendar_PointerPressed(object sender, PointerPressedEventArgs e) + private void Calendar_PointerReleased(object sender, PointerReleasedEventArgs e) { - if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) + + if (e.InitialPressMouseButton == MouseButton.Left) { e.Handled = true; } From dfe3b55de802cfef25fae53fe3e968a198f638ad Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 28 Sep 2020 19:28:24 -0400 Subject: [PATCH 4/7] DataGrid :empty-rows and :empty-columns pseudoclasses --- src/Avalonia.Controls.DataGrid/DataGrid.cs | 24 +++++++++++- .../DataGridDataConnection.cs | 39 ++++++++++--------- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/Avalonia.Controls.DataGrid/DataGrid.cs b/src/Avalonia.Controls.DataGrid/DataGrid.cs index 7c57ea3db9..5bb2763566 100644 --- a/src/Avalonia.Controls.DataGrid/DataGrid.cs +++ b/src/Avalonia.Controls.DataGrid/DataGrid.cs @@ -31,7 +31,7 @@ namespace Avalonia.Controls /// /// Displays data in a customizable grid. /// - [PseudoClasses(":invalid")] + [PseudoClasses(":invalid", ":empty-rows", ":empty-columns")] public partial class DataGrid : TemplatedControl { private const string DATAGRID_elementRowsPresenterName = "PART_RowsPresenter"; @@ -711,6 +711,7 @@ namespace Avalonia.Controls DisplayData = new DataGridDisplayData(this); ColumnsInternal = CreateColumnsInstance(); + ColumnsInternal.CollectionChanged += ColumnsInternal_CollectionChanged; RowHeightEstimate = DATAGRID_defaultRowHeight; RowDetailsHeightEstimate = 0; @@ -727,6 +728,8 @@ namespace Avalonia.Controls CurrentCellCoordinates = new DataGridCellCoordinates(-1, -1); RowGroupHeaderHeightEstimate = DATAGRID_defaultRowHeight; + + UpdatePseudoClasses(); } private void SetValueNoCallback(AvaloniaProperty property, T value, BindingPriority priority = BindingPriority.LocalValue) @@ -851,9 +854,27 @@ namespace Avalonia.Controls // can be set when the DataGrid is not part of the visual tree _measured = false; InvalidateMeasure(); + + UpdatePseudoClasses(); } } + private void ColumnsInternal_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + if (e.Action == NotifyCollectionChangedAction.Add + || e.Action == NotifyCollectionChangedAction.Remove + || e.Action == NotifyCollectionChangedAction.Reset) + { + UpdatePseudoClasses(); + } + } + + internal void UpdatePseudoClasses() + { + PseudoClasses.Set(":empty-columns", !ColumnsInternal.GetVisibleColumns().Any()); + PseudoClasses.Set(":empty-rows", !DataConnection.Any()); + } + private void OnSelectedIndexChanged(AvaloniaPropertyChangedEventArgs e) { if (!_areHandlersSuspended) @@ -1348,7 +1369,6 @@ namespace Avalonia.Controls internal DataGridColumnCollection ColumnsInternal { get; - private set; } internal int AnchorSlot diff --git a/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs b/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs index 19539bf032..a94acdec57 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs @@ -77,24 +77,7 @@ namespace Avalonia.Controls private set; } - public int Count - { - get - { - IList list = List; - if (list != null) - { - return list.Count; - } - - if(DataSource is DataGridCollectionView cv) - { - return cv.Count; - } - - return DataSource?.Cast().Count() ?? 0; - } - } + public int Count => GetCount(true); public bool DataIsPrimitive { @@ -210,6 +193,24 @@ namespace Avalonia.Controls } } + internal bool Any() + { + return GetCount(false) > 0; + } + + /// When "allowSlow" is false, method will not use Linq.Count() method and will return 0 or 1 instead. + private int GetCount(bool allowSlow) + { + return DataSource switch + { + ICollection collection => collection.Count, + DataGridCollectionView cv => cv.Count, + IEnumerable enumerable when allowSlow => enumerable.Cast().Count(), + IEnumerable enumerable when !allowSlow => enumerable.Cast().Any() ? 1 : 0, + _ => 0 + }; + } + /// /// Puts the entity into editing mode if possible /// @@ -675,6 +676,8 @@ namespace Avalonia.Controls } break; } + + _owner.UpdatePseudoClasses(); } private void UpdateDataProperties() From f56e63599d6039a990b5d26c53fa422c08340e60 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 28 Sep 2020 19:29:07 -0400 Subject: [PATCH 5/7] Handle :empty-columns pseudoclass to hide empty presenter with separator lines --- .../Themes/Fluent.xaml | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml b/src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml index 30e33c2b2d..998198cc1c 100644 --- a/src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml +++ b/src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml @@ -588,18 +588,11 @@ - - + Fill="{DynamicResource DataGridGridLinesBrush}" /> + + + + From 21b0a468fb44d29d3b223a4dc2cd63ebf5e6ef0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20Komosi=C5=84ski?= Date: Wed, 30 Sep 2020 12:35:43 +0200 Subject: [PATCH 6/7] Parse key splines using invariant culture. --- src/Avalonia.Animation/KeySplineTypeConverter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Animation/KeySplineTypeConverter.cs b/src/Avalonia.Animation/KeySplineTypeConverter.cs index cd7427a37d..b026206e5f 100644 --- a/src/Avalonia.Animation/KeySplineTypeConverter.cs +++ b/src/Avalonia.Animation/KeySplineTypeConverter.cs @@ -19,7 +19,7 @@ namespace Avalonia.Animation public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { - return KeySpline.Parse((string)value, culture); + return KeySpline.Parse((string)value, CultureInfo.InvariantCulture); } } } From d4cb11be47618e14089cdb5fa6779011256a80c6 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 30 Sep 2020 15:27:49 +0200 Subject: [PATCH 7/7] Bind ScrollViewer scrollbar visibility properties. And disable the horizontal scrollbar on the default theme (this was already being done in fluent theme). Fixes #4768. --- src/Avalonia.Themes.Default/ComboBox.xaml | 4 +++- src/Avalonia.Themes.Fluent/ComboBox.xaml | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Themes.Default/ComboBox.xaml b/src/Avalonia.Themes.Default/ComboBox.xaml index cced76e850..67151731a8 100644 --- a/src/Avalonia.Themes.Default/ComboBox.xaml +++ b/src/Avalonia.Themes.Default/ComboBox.xaml @@ -26,6 +26,7 @@ + - + - +