From f47f71c08da60c2294eb5467f42b47d6ac6563a8 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Fri, 14 Oct 2022 03:41:06 -0400 Subject: [PATCH 1/5] Remove AlternatingRowBackground from the API --- .../ControlCatalog/Pages/DataGridPage.xaml | 3 +-- src/Avalonia.Controls.DataGrid/DataGrid.cs | 25 +++---------------- .../Themes/Fluent.xaml | 7 +----- .../Themes/Simple.xaml | 5 ---- 4 files changed, 6 insertions(+), 34 deletions(-) diff --git a/samples/ControlCatalog/Pages/DataGridPage.xaml b/samples/ControlCatalog/Pages/DataGridPage.xaml index 27272a9ff7..bc8252a3a4 100644 --- a/samples/ControlCatalog/Pages/DataGridPage.xaml +++ b/samples/ControlCatalog/Pages/DataGridPage.xaml @@ -45,8 +45,7 @@ + RowBackground="#1000"> diff --git a/src/Avalonia.Controls.DataGrid/DataGrid.cs b/src/Avalonia.Controls.DataGrid/DataGrid.cs index c6cc9bf278..c23bca1810 100644 --- a/src/Avalonia.Controls.DataGrid/DataGrid.cs +++ b/src/Avalonia.Controls.DataGrid/DataGrid.cs @@ -246,23 +246,6 @@ namespace Avalonia.Controls set { SetValue(ColumnWidthProperty, value); } } - public static readonly StyledProperty AlternatingRowBackgroundProperty = - AvaloniaProperty.Register(nameof(AlternatingRowBackground)); - - /// - /// Gets or sets the that is used to paint the background of odd-numbered rows. - /// - /// - /// The brush that is used to paint the background of odd-numbered rows. The default is a - /// with a - /// value of white (ARGB value #00FFFFFF). - /// - public IBrush AlternatingRowBackground - { - get { return GetValue(AlternatingRowBackgroundProperty); } - set { SetValue(AlternatingRowBackgroundProperty, value); } - } - public static readonly StyledProperty FrozenColumnCountProperty = AvaloniaProperty.Register( nameof(FrozenColumnCount), @@ -2058,7 +2041,7 @@ namespace Avalonia.Controls forceHorizontalScroll: true); } } - + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) { base.OnAttachedToVisualTree(e); @@ -2167,7 +2150,7 @@ namespace Avalonia.Controls return desiredSize; } - + /// protected override void OnDataContextBeginUpdate() { @@ -2183,7 +2166,7 @@ namespace Avalonia.Controls NotifyDataContextPropertyForAllRowCells(GetAllRows(), false); } - + /// /// Raises the BeginningEdit event. /// @@ -4575,7 +4558,7 @@ namespace Avalonia.Controls dataGridCell.Content = element; } - + } private void PreparingCellForEditPrivate(Control editingElement) diff --git a/src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml b/src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml index b4bae02b9b..3019e3d158 100644 --- a/src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml +++ b/src/Avalonia.Controls.DataGrid/Themes/Fluent.xaml @@ -232,7 +232,7 @@ - + @@ -337,10 +337,6 @@ - - - - - - - A control for displaying and interacting with a data source. @@ -58,6 +42,24 @@ MinWidth="200" IsVisible="{Binding #ShowGDP.IsChecked}"/> + + + + + + + + + + + + + + @@ -70,6 +72,20 @@ + + + + + + + + diff --git a/src/Avalonia.Controls.DataGrid/DataGrid.cs b/src/Avalonia.Controls.DataGrid/DataGrid.cs index c23bca1810..a9f2e889b9 100644 --- a/src/Avalonia.Controls.DataGrid/DataGrid.cs +++ b/src/Avalonia.Controls.DataGrid/DataGrid.cs @@ -26,6 +26,7 @@ using Avalonia.Controls.Utils; using Avalonia.Layout; using Avalonia.Controls.Metadata; using Avalonia.Input.GestureRecognizers; +using Avalonia.Styling; namespace Avalonia.Controls { @@ -237,6 +238,66 @@ namespace Avalonia.Controls public static readonly StyledProperty ColumnWidthProperty = AvaloniaProperty.Register(nameof(ColumnWidth), defaultValue: DataGridLength.Auto); + /// + /// Identifies the dependency property. + /// + public static readonly StyledProperty RowThemeProperty = + AvaloniaProperty.Register(nameof(RowTheme)); + + /// + /// Gets or sets the theme applied to all rows. + /// + public ControlTheme RowTheme + { + get { return GetValue(RowThemeProperty); } + set { SetValue(RowThemeProperty, value); } + } + + /// + /// Identifies the dependency property. + /// + public static readonly StyledProperty CellThemeProperty = + AvaloniaProperty.Register(nameof(CellTheme)); + + /// + /// Gets or sets the theme applied to all cells. + /// + public ControlTheme CellTheme + { + get { return GetValue(CellThemeProperty); } + set { SetValue(CellThemeProperty, value); } + } + + /// + /// Identifies the dependency property. + /// + public static readonly StyledProperty ColumnHeaderThemeProperty = + AvaloniaProperty.Register(nameof(ColumnHeaderTheme)); + + /// + /// Gets or sets the theme applied to all column headers. + /// + public ControlTheme ColumnHeaderTheme + { + get { return GetValue(ColumnHeaderThemeProperty); } + set { SetValue(ColumnHeaderThemeProperty, value); } + } + + /// + /// Identifies the dependency property. + /// + public static readonly StyledProperty RowGroupThemeProperty = + AvaloniaProperty.Register(nameof(RowGroupTheme)); + + /// + /// Gets or sets the theme applied to all row groups. + /// + public ControlTheme RowGroupTheme + { + get { return GetValue(RowGroupThemeProperty); } + set { SetValue(RowGroupThemeProperty, value); } + } + /// /// Gets or sets the standard width or automatic sizing mode of columns in the control. /// @@ -3225,7 +3286,6 @@ namespace Avalonia.Controls } } - //TODO Styles private void AddNewCellPrivate(DataGridRow row, DataGridColumn column) { DataGridCell newCell = new DataGridCell(); @@ -3238,8 +3298,11 @@ namespace Avalonia.Controls { newCell.OwningColumn = column; newCell.IsVisible = column.IsVisible; + if (row.OwningGrid.CellTheme is {} cellTheme) + { + newCell.SetValue(ThemeProperty, cellTheme, BindingPriority.TemplatedParent); + } } - //newCell.EnsureStyle(null); row.Cells.Insert(column.Index, newCell); } @@ -4520,7 +4583,6 @@ namespace Avalonia.Controls FlushCurrentCellChanged(); } - //TODO Styles private void PopulateCellContent(bool isCellEdited, DataGridColumn dataGridColumn, DataGridRow dataGridRow, diff --git a/src/Avalonia.Controls.DataGrid/DataGridColumn.cs b/src/Avalonia.Controls.DataGrid/DataGridColumn.cs index fbdb979e24..191c3fc5b1 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridColumn.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridColumn.cs @@ -231,7 +231,7 @@ namespace Avalonia.Controls } /// - /// Gets or sets a value that indicates whether the user can change the column display position by + /// Gets or sets a value that indicates whether the user can change the column display position by /// dragging the column header. /// /// @@ -260,15 +260,15 @@ namespace Avalonia.Controls /// public bool CanUserResize { - get + get { return CanUserResizeInternal ?? OwningGrid?.CanUserResizeColumns ?? DataGrid.DATAGRID_defaultCanUserResizeColumns; } - set - { + set + { CanUserResizeInternal = value; OwningGrid?.OnColumnCanUserResizeChanged(this); } @@ -321,16 +321,16 @@ namespace Avalonia.Controls /// /// /// When setting this property, the specified value is less than -1 or equal to . - /// + /// /// -or- - /// + /// /// When setting this property on a column in a , the specified value is less than zero or greater than or equal to the number of columns in the . /// /// /// When setting this property, the is already making adjustments. For example, this exception is thrown when you attempt to set in a event handler. - /// + /// /// -or- - /// + /// /// When setting this property, the specified value would result in a frozen column being displayed in the range of unfrozen columns, or an unfrozen column being displayed in the range of frozen columns. /// public int DisplayIndex @@ -401,7 +401,7 @@ namespace Avalonia.Controls } } } - + /// /// Backing field for CellTheme property. /// @@ -412,7 +412,7 @@ namespace Avalonia.Controls (o, v) => o.CellTheme = v); /// - /// Gets or sets the cell theme. + /// Gets or sets the cell theme. /// public ControlTheme CellTheme { @@ -430,14 +430,14 @@ namespace Avalonia.Controls (o, v) => o.Header = v); /// - /// Gets or sets the content + /// Gets or sets the content /// public object Header { get { return _header; } set { SetAndRaise(HeaderProperty, ref _header, value); } } - + /// /// Backing field for Header property /// @@ -455,7 +455,7 @@ namespace Avalonia.Controls get { return _headerTemplate; } set { SetAndRaise(HeaderTemplateProperty, ref _headerTemplate, value); } } - + public bool IsAutoGenerated { get; @@ -750,7 +750,7 @@ namespace Avalonia.Controls protected abstract IControl GenerateEditingElement(DataGridCell cell, object dataItem, out ICellEditBinding binding); /// - /// When overridden in a derived class, gets a read-only element that is bound to the column's + /// When overridden in a derived class, gets a read-only element that is bound to the column's /// property value. /// /// @@ -765,7 +765,7 @@ namespace Avalonia.Controls protected abstract IControl GenerateElement(DataGridCell cell, object dataItem); /// - /// Called by a specific column type when one of its properties changed, + /// Called by a specific column type when one of its properties changed, /// and its current cells need to be updated. /// /// Indicates which property changed and caused this call @@ -882,9 +882,8 @@ namespace Avalonia.Controls { LayoutRoundedWidth = ActualWidth; } - } + } - //TODO Styles internal virtual DataGridColumnHeader CreateHeader() { var result = new DataGridColumnHeader @@ -893,8 +892,10 @@ namespace Avalonia.Controls }; result[!ContentControl.ContentProperty] = this[!HeaderProperty]; result[!ContentControl.ContentTemplateProperty] = this[!HeaderTemplateProperty]; - - //result.EnsureStyle(null); + if (OwningGrid.ColumnHeaderTheme is {} columnTheme) + { + result.SetValue(StyledElement.ThemeProperty, columnTheme, BindingPriority.TemplatedParent); + } return result; } diff --git a/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs b/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs index d3bd968d62..740e3516f6 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs @@ -76,7 +76,7 @@ namespace Avalonia.Controls } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// //TODO Implement public DataGridColumnHeader() @@ -267,7 +267,7 @@ namespace Avalonia.Controls else { newSort = sort; - } + } // changing direction should not affect sort order, so we replace this column's // sort description instead of just adding it to the end of the collection @@ -603,7 +603,7 @@ namespace Avalonia.Controls } /// - /// Returns true if the mouse is + /// Returns true if the mouse is /// - to the left of the element, or within the left half of the element /// and /// - within the vertical range of the element, or ignoreVertical == true @@ -663,16 +663,19 @@ namespace Avalonia.Controls IsMouseOver = false; } - //TODO Styles DragIndicator private void OnMouseMove_BeginReorder(Point mousePosition) { - DataGridColumnHeader dragIndicator = new DataGridColumnHeader + var dragIndicator = new DataGridColumnHeader { OwningColumn = OwningColumn, IsEnabled = false, Content = Content, ContentTemplate = ContentTemplate }; + if (OwningGrid.ColumnHeaderTheme is {} columnHeaderTheme) + { + dragIndicator.SetValue(ThemeProperty, columnHeaderTheme, BindingPriority.TemplatedParent); + } dragIndicator.PseudoClasses.Add(":dragIndicator"); @@ -720,7 +723,7 @@ namespace Avalonia.Controls { return; } - + //handle entry into reorder mode if (_dragMode == DragMode.MouseDown && _dragColumn == null && _lastMousePositionHeaders != null && (distanceFromRight > DATAGRIDCOLUMNHEADER_resizeRegionWidth && distanceFromLeft > DATAGRIDCOLUMNHEADER_resizeRegionWidth)) { diff --git a/src/Avalonia.Controls.DataGrid/DataGridRow.cs b/src/Avalonia.Controls.DataGrid/DataGridRow.cs index 1559763a1b..cd22934ac0 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridRow.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridRow.cs @@ -89,7 +89,7 @@ namespace Avalonia.Controls o => o.IsValid); /// - /// Gets a value that indicates whether the data in a row is valid. + /// Gets a value that indicates whether the data in a row is valid. /// public bool IsValid { @@ -130,7 +130,7 @@ namespace Avalonia.Controls } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// public DataGridRow() { @@ -240,7 +240,6 @@ namespace Avalonia.Controls private set; } - //TODO Styles internal DataGridCell FillerCell { get @@ -252,7 +251,10 @@ namespace Avalonia.Controls IsVisible = false, OwningRow = this }; - //_fillerCell.EnsureStyle(null); + if (OwningGrid.CellTheme is {} cellTheme) + { + _fillerCell.SetValue(ThemeProperty, cellTheme, BindingPriority.TemplatedParent); + } if (_cellsElement != null) { _cellsElement.Children.Add(_fillerCell); @@ -506,7 +508,7 @@ namespace Avalonia.Controls } /// - /// Measures the children of a to + /// Measures the children of a to /// prepare for arranging them during the pass. /// /// @@ -709,8 +711,6 @@ namespace Avalonia.Controls } } - // Set the proper style for the Header by walking up the Style hierarchy - //TODO Styles internal void EnsureHeaderStyleAndVisibility(Styling.Style previousStyle) { if (_headerElement != null && OwningGrid != null) @@ -785,7 +785,7 @@ namespace Avalonia.Controls OwningGrid?.OnRowDetailsChanged(); } - // Returns the actual template that should be sued for Details: either explicity set on this row + // Returns the actual template that should be sued for Details: either explicity set on this row // or inherited from the DataGrid private IDataTemplate ActualDetailsTemplate { @@ -890,7 +890,7 @@ namespace Avalonia.Controls //TODO Cleanup double? _previousDetailsHeight = null; - //TODO Animation + //TODO Animation private void DetailsContent_HeightChanged(double newValue) { if (_previousDetailsHeight.HasValue) @@ -907,7 +907,7 @@ namespace Avalonia.Controls _detailsElement.ContentHeight = newValue; - // Calling this when details are not visible invalidates during layout when we have no work + // Calling this when details are not visible invalidates during layout when we have no work // to do. In certain scenarios, this could cause a layout cycle OnRowDetailsChanged(); } @@ -1060,7 +1060,7 @@ namespace Avalonia.Controls } } } - + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { @@ -1084,7 +1084,4 @@ namespace Avalonia.Controls } } - - //TODO Styles - } diff --git a/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs b/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs index 69e6766bfd..c746b19cc7 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs @@ -53,7 +53,7 @@ namespace Avalonia.Controls AvaloniaProperty.Register(nameof(PropertyName)); /// - /// Gets or sets the name of the property that this row is bound to. + /// Gets or sets the name of the property that this row is bound to. /// public string PropertyName { @@ -85,8 +85,8 @@ namespace Avalonia.Controls } /// - /// Gets or sets a value that indicates the amount that the - /// children of the are indented. + /// Gets or sets a value that indicates the amount that the + /// children of the are indented. /// public double SublevelIndent { @@ -327,9 +327,9 @@ namespace Avalonia.Controls { double xClip = Math.Round(frozenLeftEdge - childLeftEdge); var rg = new RectangleGeometry(); - rg.Rect = - new Rect(xClip, 0, - Math.Max(0, child.Bounds.Width - xClip), + rg.Rect = + new Rect(xClip, 0, + Math.Max(0, child.Bounds.Width - xClip), child.Bounds.Height); child.Clip = rg; } @@ -348,8 +348,6 @@ namespace Avalonia.Controls } } - //TODO Styles - //internal void EnsureHeaderStyleAndVisibility(Style previousStyle) internal void EnsureHeaderVisibility() { if (_headerElement != null && OwningGrid != null) diff --git a/src/Avalonia.Controls.DataGrid/DataGridRows.cs b/src/Avalonia.Controls.DataGrid/DataGridRows.cs index f3afe2c42d..17a7eab2e0 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridRows.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridRows.cs @@ -14,6 +14,9 @@ using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; using System.Linq; +using Avalonia.Data; +using Avalonia.Styling; +using JetBrains.Annotations; namespace Avalonia.Controls { @@ -117,7 +120,7 @@ namespace Avalonia.Controls detailsCount += GetDetailsCountInclusive(DisplayData.LastScrollingSlot + 1, SlotCount - 1); } - // + // double totalDetailsHeight = detailsCount * RowDetailsHeightEstimate; return totalRowsHeight + totalDetailsHeight; @@ -163,7 +166,7 @@ namespace Avalonia.Controls } /// - /// Clears the entire selection except the indicated row. Displayed rows are deselected explicitly to + /// Clears the entire selection except the indicated row. Displayed rows are deselected explicitly to /// visualize potential transition effects. The row indicated is selected if it is not already. /// internal void ClearRowSelection(int slotException, bool setAnchorSlot) @@ -270,10 +273,10 @@ namespace Avalonia.Controls bool isRow = rowIndex != -1; if (isCollapsed) { - InsertElement(slot, - element: null, + InsertElement(slot, + element: null, updateVerticalScrollBarOnly: true, - isCollapsed: true, + isCollapsed: true, isRow: isRow); } else if (SlotIsDisplayed(slot)) @@ -285,18 +288,18 @@ namespace Avalonia.Controls } else { - InsertElement(slot, GenerateRowGroupHeader(slot, groupInfo), + InsertElement(slot, GenerateRowGroupHeader(slot, groupInfo), updateVerticalScrollBarOnly: false, - isCollapsed: false, + isCollapsed: false, isRow: isRow); } } else { - InsertElement(slot, + InsertElement(slot, element: null, updateVerticalScrollBarOnly: _vScrollBar == null || _vScrollBar.IsVisible, - isCollapsed: false, + isCollapsed: false, isRow: isRow); } } @@ -417,7 +420,7 @@ namespace Avalonia.Controls if (scrolledHorizontally && DisplayData.FirstScrollingSlot <= slot && DisplayData.LastScrollingSlot >= slot) { // If the slot is displayed and we scrolled horizontally, column virtualization could cause the rows to grow. - // As a result we need to force measure on the rows we're displaying and recalculate our First and Last slots + // As a result we need to force measure on the rows we're displaying and recalculate our First and Last slots // so they're accurate foreach (DataGridRow row in DisplayData.GetScrollingRows()) { @@ -455,7 +458,7 @@ namespace Avalonia.Controls deltaY -= GetSlotElementsHeight(slot, firstFullSlot); if (DisplayData.FirstScrollingSlot - slot > 1) { - // + // ResetDisplayedRows(); } @@ -519,7 +522,7 @@ namespace Avalonia.Controls _verticalOffset = NegVerticalOffset; } - // + // Debug.Assert(MathUtilities.LessThanOrClose(NegVerticalOffset, _verticalOffset)); SetVerticalOffset(_verticalOffset); @@ -1025,6 +1028,10 @@ namespace Avalonia.Controls dataGridRow.Slot = slot; dataGridRow.OwningGrid = this; dataGridRow.DataContext = dataContext; + if (RowTheme is {} rowTheme) + { + dataGridRow.SetValue(ThemeProperty, rowTheme, BindingPriority.TemplatedParent); + } CompleteCellsCollection(dataGridRow); OnLoadingRow(new DataGridRowEventArgs(dataGridRow)); @@ -1104,7 +1111,7 @@ namespace Avalonia.Controls /// /// Checks if the row for the provided dataContext has been generated and is present - /// in either the loaded rows, pre-fetched rows, or editing row. + /// in either the loaded rows, pre-fetched rows, or editing row. /// The displayed rows are *not* searched. Returns null if the row does not belong to those 3 categories. /// private DataGridRow GetGeneratedRow(object dataContext) @@ -1152,8 +1159,8 @@ namespace Avalonia.Controls } else { - // If we're grouping, the GroupLevel needs to be fixed later by methods calling this - // which end up inserting rows. We don't do it here because elements could be inserted + // If we're grouping, the GroupLevel needs to be fixed later by methods calling this + // which end up inserting rows. We don't do it here because elements could be inserted // from top to bottom or bottom to up so it's better to do in one pass slotElement = GenerateRow(RowIndexFromSlot(slot), slot); } @@ -1161,7 +1168,6 @@ namespace Avalonia.Controls return slotElement; } - //TODO Styles private void InsertDisplayedElement(int slot, Control element, bool wasNewlyAdded, bool updateSlotInformation) { // We can only support creating new rows that are adjacent to the currently visible rows @@ -1479,7 +1485,6 @@ namespace Avalonia.Controls } } - //TODO Styles // Makes sure the row shows the proper visuals for selection, currency, details, etc. private void LoadRowVisualsForDisplay(DataGridRow row) { @@ -1694,7 +1699,7 @@ namespace Avalonia.Controls { // Figure out what row we've scrolled down to and update the value for NegVerticalOffset NegVerticalOffset = 0; - // + // if (height > 2 * CellsHeight && (RowDetailsVisibilityMode != DataGridRowDetailsVisibilityMode.VisibleWhenSelected || RowDetailsTemplate == null)) { @@ -1755,7 +1760,7 @@ namespace Avalonia.Controls // Figure out what row we've scrolled up to and update the value for NegVerticalOffset deltaY = -NegVerticalOffset; NegVerticalOffset = 0; - // + // if (height < -2 * CellsHeight && (RowDetailsVisibilityMode != DataGridRowDetailsVisibilityMode.VisibleWhenSelected || RowDetailsTemplate == null)) @@ -1813,7 +1818,7 @@ namespace Avalonia.Controls if (MathUtilities.GreaterThanOrClose(0, newVerticalOffset) && newFirstScrollingSlot != 0) { // We've scrolled to the top of the ScrollBar, automatically place the user at the very top - // of the DataGrid. If this produces very odd behavior, evaluate the RowHeight estimate. + // of the DataGrid. If this produces very odd behavior, evaluate the RowHeight estimate. // strategy. For most data, this should be unnoticeable. ResetDisplayedRows(); NegVerticalOffset = 0; @@ -1994,7 +1999,6 @@ namespace Avalonia.Controls VisibleSlotCount = 0; } - //TODO Styles private void UnloadRow(DataGridRow dataGridRow) { Debug.Assert(dataGridRow != null); @@ -2010,16 +2014,13 @@ namespace Avalonia.Controls OnUnloadingRow(new DataGridRowEventArgs(dataGridRow)); bool recycleRow = CurrentSlot != dataGridRow.Index; - // Don't recycle if the row has a custom Style set - //recycleRow &= (dataGridRow.Style == null || dataGridRow.Style == RowStyle); - if (recycleRow) { DisplayData.AddRecyclableRow(dataGridRow); } else { - // + // _rowsPresenter.Children.Remove(dataGridRow); dataGridRow.DetachFromDataGrid(false); } @@ -2240,10 +2241,10 @@ namespace Avalonia.Controls group.Items.CollectionChanged += CollectionViewGroup_CollectionChanged; } var newGroupInfo = new DataGridRowGroupInfo(group, true, parentGroupInfo.Level + 1, insertSlot, insertSlot); - InsertElementAt(insertSlot, - rowIndex: -1, - item: null, - groupInfo: newGroupInfo, + InsertElementAt(insertSlot, + rowIndex: -1, + item: null, + groupInfo: newGroupInfo, isCollapsed: isCollapsed); RowGroupHeadersTable.AddValue(insertSlot, newGroupInfo); } @@ -2256,9 +2257,9 @@ namespace Avalonia.Controls { AutoGenerateColumnsPrivate(); } - InsertElementAt(insertSlot, rowIndex, + InsertElementAt(insertSlot, rowIndex, item: e.NewItems[0], - groupInfo: null, + groupInfo: null, isCollapsed: isCollapsed); } @@ -2448,13 +2449,12 @@ namespace Avalonia.Controls VisibleSlotCount = SlotCount; } - //TODO Styles private void RefreshRowGroupHeaders() { if (DataConnection.CollectionView != null && DataConnection.CollectionView.CanGroup && DataConnection.CollectionView.Groups != null - && DataConnection.CollectionView.IsGrouping + && DataConnection.CollectionView.IsGrouping && DataConnection.CollectionView.GroupingDepth > 0) { // Initialize our array for the height of the RowGroupHeaders by Level. @@ -2476,7 +2476,7 @@ namespace Avalonia.Controls double indent; for (int i = 0; i < groupLevelCount; i++) { - indent = DATAGRID_defaultRowGroupSublevelIndent; + indent = DATAGRID_defaultRowGroupSublevelIndent; RowGroupSublevelIndents[i] = indent; if (i > 0) { @@ -2742,6 +2742,10 @@ namespace Avalonia.Controls groupHeader.RowGroupInfo = rowGroupInfo; groupHeader.DataContext = rowGroupInfo.CollectionViewGroup; groupHeader.Level = rowGroupInfo.Level; + if (RowGroupTheme is {} rowGroupTheme) + { + groupHeader.SetValue(ThemeProperty, rowGroupTheme, BindingPriority.TemplatedParent); + } // Set the RowGroupHeader's PropertyName. Unfortunately, CollectionViewGroup doesn't have this // so we have to set it manually From 05d3786116b27049a39098bd1338b48f36ef6548 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 21 Nov 2022 13:05:57 +0100 Subject: [PATCH 3/5] *Web* projects were renamed to *Browser*. --- ...3.ncrunchproject => Avalonia.Browser.Blazor.v3.ncrunchproject} | 0 ...a.Web.v3.ncrunchproject => Avalonia.Browser.v3.ncrunchproject} | 0 ...nchproject => ControlCatalog.Browser.Blazor.v3.ncrunchproject} | 0 ...v3.ncrunchproject => ControlCatalog.Browser.v3.ncrunchproject} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename .ncrunch/{Avalonia.Web.Blazor.v3.ncrunchproject => Avalonia.Browser.Blazor.v3.ncrunchproject} (100%) rename .ncrunch/{Avalonia.Web.v3.ncrunchproject => Avalonia.Browser.v3.ncrunchproject} (100%) rename .ncrunch/{ControlCatalog.Blazor.Web.v3.ncrunchproject => ControlCatalog.Browser.Blazor.v3.ncrunchproject} (100%) rename .ncrunch/{ControlCatalog.Web.v3.ncrunchproject => ControlCatalog.Browser.v3.ncrunchproject} (100%) diff --git a/.ncrunch/Avalonia.Web.Blazor.v3.ncrunchproject b/.ncrunch/Avalonia.Browser.Blazor.v3.ncrunchproject similarity index 100% rename from .ncrunch/Avalonia.Web.Blazor.v3.ncrunchproject rename to .ncrunch/Avalonia.Browser.Blazor.v3.ncrunchproject diff --git a/.ncrunch/Avalonia.Web.v3.ncrunchproject b/.ncrunch/Avalonia.Browser.v3.ncrunchproject similarity index 100% rename from .ncrunch/Avalonia.Web.v3.ncrunchproject rename to .ncrunch/Avalonia.Browser.v3.ncrunchproject diff --git a/.ncrunch/ControlCatalog.Blazor.Web.v3.ncrunchproject b/.ncrunch/ControlCatalog.Browser.Blazor.v3.ncrunchproject similarity index 100% rename from .ncrunch/ControlCatalog.Blazor.Web.v3.ncrunchproject rename to .ncrunch/ControlCatalog.Browser.Blazor.v3.ncrunchproject diff --git a/.ncrunch/ControlCatalog.Web.v3.ncrunchproject b/.ncrunch/ControlCatalog.Browser.v3.ncrunchproject similarity index 100% rename from .ncrunch/ControlCatalog.Web.v3.ncrunchproject rename to .ncrunch/ControlCatalog.Browser.v3.ncrunchproject From 2c085b6e12a70a1dc9ee35e7e3dd3cf5289ed792 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 21 Nov 2022 13:08:33 +0100 Subject: [PATCH 4/5] Don't instrument theme projects. Was failing with an `IndexOutOfRangeException` inside ncrunch. It's not important to have code coverage for these projects anyway. --- .ncrunch/Avalonia.Themes.Fluent.net6.0.v3.ncrunchproject | 5 +++++ .../Avalonia.Themes.Fluent.netstandard2.0.v3.ncrunchproject | 5 +++++ .ncrunch/Avalonia.Themes.Simple.net6.0.v3.ncrunchproject | 5 +++++ .../Avalonia.Themes.Simple.netstandard2.0.v3.ncrunchproject | 5 +++++ 4 files changed, 20 insertions(+) create mode 100644 .ncrunch/Avalonia.Themes.Fluent.net6.0.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Themes.Fluent.netstandard2.0.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Themes.Simple.net6.0.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Themes.Simple.netstandard2.0.v3.ncrunchproject diff --git a/.ncrunch/Avalonia.Themes.Fluent.net6.0.v3.ncrunchproject b/.ncrunch/Avalonia.Themes.Fluent.net6.0.v3.ncrunchproject new file mode 100644 index 0000000000..02eb0d211e --- /dev/null +++ b/.ncrunch/Avalonia.Themes.Fluent.net6.0.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + False + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Themes.Fluent.netstandard2.0.v3.ncrunchproject b/.ncrunch/Avalonia.Themes.Fluent.netstandard2.0.v3.ncrunchproject new file mode 100644 index 0000000000..02eb0d211e --- /dev/null +++ b/.ncrunch/Avalonia.Themes.Fluent.netstandard2.0.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + False + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Themes.Simple.net6.0.v3.ncrunchproject b/.ncrunch/Avalonia.Themes.Simple.net6.0.v3.ncrunchproject new file mode 100644 index 0000000000..02eb0d211e --- /dev/null +++ b/.ncrunch/Avalonia.Themes.Simple.net6.0.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + False + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Themes.Simple.netstandard2.0.v3.ncrunchproject b/.ncrunch/Avalonia.Themes.Simple.netstandard2.0.v3.ncrunchproject new file mode 100644 index 0000000000..02eb0d211e --- /dev/null +++ b/.ncrunch/Avalonia.Themes.Simple.netstandard2.0.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + False + + \ No newline at end of file From ca7b99ef48be17bd88266eaffd7de93191d52282 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 21 Nov 2022 13:41:01 +0100 Subject: [PATCH 5/5] Ignore a few more projects. That aren't needed for tests to run. --- .ncrunch/Avalonia.Benchmarks.v3.ncrunchproject | 5 +++++ .ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject | 5 +++++ .ncrunch/MobileSandbox.v3.ncrunchproject | 5 +++++ 3 files changed, 15 insertions(+) create mode 100644 .ncrunch/Avalonia.Benchmarks.v3.ncrunchproject create mode 100644 .ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject create mode 100644 .ncrunch/MobileSandbox.v3.ncrunchproject diff --git a/.ncrunch/Avalonia.Benchmarks.v3.ncrunchproject b/.ncrunch/Avalonia.Benchmarks.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/Avalonia.Benchmarks.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject b/.ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/.ncrunch/MobileSandbox.v3.ncrunchproject b/.ncrunch/MobileSandbox.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/MobileSandbox.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file