Browse Source

DataGrid: implement missed pseudoclasses

pull/4534/head
Maksym Katsydan 6 years ago
parent
commit
60546c68de
  1. 4
      src/Avalonia.Controls.DataGrid/DataGrid.cs
  2. 11
      src/Avalonia.Controls.DataGrid/DataGridCell.cs
  3. 13
      src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs
  4. 2
      src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs
  5. 8
      src/Avalonia.Controls.DataGrid/DataGridRow.cs
  6. 20
      src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs
  7. 21
      src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs
  8. 2
      src/Avalonia.Controls.DataGrid/DataGridRows.cs

4
src/Avalonia.Controls.DataGrid/DataGrid.cs

@ -2753,7 +2753,7 @@ namespace Avalonia.Controls
//We don't need to refresh the state of AutoGenerated column headers because they're up-to-date //We don't need to refresh the state of AutoGenerated column headers because they're up-to-date
if (!column.IsAutoGenerated && column.HasHeaderCell) if (!column.IsAutoGenerated && column.HasHeaderCell)
{ {
column.HeaderCell.ApplyState(); column.HeaderCell.UpdatePseudoClasses();
} }
} }
@ -5417,7 +5417,7 @@ namespace Avalonia.Controls
} }
else if (displayedElement is DataGridRowGroupHeader groupHeader) else if (displayedElement is DataGridRowGroupHeader groupHeader)
{ {
groupHeader.ApplyState(useTransitions: true); groupHeader.UpdatePseudoClasses();
if (AreRowHeadersVisible) if (AreRowHeadersVisible)
{ {
groupHeader.ApplyHeaderStatus(); groupHeader.ApplyHeaderStatus();

11
src/Avalonia.Controls.DataGrid/DataGridCell.cs

@ -180,7 +180,18 @@ namespace Avalonia.Controls
internal void UpdatePseudoClasses() internal void UpdatePseudoClasses()
{ {
if (OwningGrid == null || OwningColumn == null || OwningRow == null || !OwningRow.IsVisible || OwningRow.Slot == -1)
{
return;
}
PseudoClasses.Set(":selected", OwningRow.IsSelected);
PseudoClasses.Set(":current", IsCurrent);
PseudoClasses.Set(":edited", IsEdited);
// PseudoClasses.Set(":invalid", !IsValid);
} }
// Makes sure the right gridline has the proper stroke and visibility. If lastVisibleColumn is specified, the // Makes sure the right gridline has the proper stroke and visibility. If lastVisibleColumn is specified, the

13
src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs

@ -13,6 +13,7 @@ using System.Diagnostics;
using Avalonia.Utilities; using Avalonia.Utilities;
using System; using System;
using Avalonia.Controls.Utils; using Avalonia.Controls.Utils;
using Avalonia.Controls.Mixins;
namespace Avalonia.Controls namespace Avalonia.Controls
{ {
@ -68,6 +69,7 @@ namespace Avalonia.Controls
static DataGridColumnHeader() static DataGridColumnHeader()
{ {
AreSeparatorsVisibleProperty.Changed.AddClassHandler<DataGridColumnHeader>((x, e) => x.OnAreSeparatorsVisibleChanged(e)); AreSeparatorsVisibleProperty.Changed.AddClassHandler<DataGridColumnHeader>((x, e) => x.OnAreSeparatorsVisibleChanged(e));
PressedMixin.Attach<DataGridColumnHeader>();
} }
/// <summary> /// <summary>
@ -149,8 +151,7 @@ namespace Avalonia.Controls
} }
} }
//TODO Implement internal void UpdatePseudoClasses()
internal void ApplyState()
{ {
CurrentSortingState = null; CurrentSortingState = null;
if (OwningGrid != null if (OwningGrid != null
@ -441,7 +442,7 @@ namespace Avalonia.Controls
Point mousePosition = e.GetPosition(this); Point mousePosition = e.GetPosition(this);
OnMouseEnter(mousePosition); OnMouseEnter(mousePosition);
ApplyState(); UpdatePseudoClasses();
} }
private void DataGridColumnHeader_PointerLeave(object sender, PointerEventArgs e) private void DataGridColumnHeader_PointerLeave(object sender, PointerEventArgs e)
@ -452,7 +453,7 @@ namespace Avalonia.Controls
} }
OnMouseLeave(); OnMouseLeave();
ApplyState(); UpdatePseudoClasses();
} }
private void DataGridColumnHeader_PointerPressed(object sender, PointerPressedEventArgs e) private void DataGridColumnHeader_PointerPressed(object sender, PointerPressedEventArgs e)
@ -467,7 +468,7 @@ namespace Avalonia.Controls
OnMouseLeftButtonDown(ref handled, e, mousePosition); OnMouseLeftButtonDown(ref handled, e, mousePosition);
e.Handled = handled; e.Handled = handled;
ApplyState(); UpdatePseudoClasses();
} }
private void DataGridColumnHeader_PointerReleased(object sender, PointerReleasedEventArgs e) private void DataGridColumnHeader_PointerReleased(object sender, PointerReleasedEventArgs e)
@ -483,7 +484,7 @@ namespace Avalonia.Controls
OnMouseLeftButtonUp(ref handled, e, mousePosition, mousePositionHeaders); OnMouseLeftButtonUp(ref handled, e, mousePosition, mousePositionHeaders);
e.Handled = handled; e.Handled = handled;
ApplyState(); UpdatePseudoClasses();
} }
private void DataGridColumnHeader_PointerMove(object sender, PointerEventArgs e) private void DataGridColumnHeader_PointerMove(object sender, PointerEventArgs e)

2
src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs

@ -610,7 +610,7 @@ namespace Avalonia.Controls
// refresh sort description // refresh sort description
foreach (DataGridColumn column in _owner.ColumnsItemsInternal) foreach (DataGridColumn column in _owner.ColumnsItemsInternal)
{ {
column.HeaderCell.ApplyState(); column.HeaderCell.UpdatePseudoClasses();
} }
} }

8
src/Avalonia.Controls.DataGrid/DataGridRow.cs

@ -624,17 +624,17 @@ namespace Avalonia.Controls
{ {
if (_headerElement != null && OwningGrid.AreRowHeadersVisible) if (_headerElement != null && OwningGrid.AreRowHeadersVisible)
{ {
_headerElement.ApplyOwnerStatus(); _headerElement.UpdatePseudoClasses();
} }
} }
//TODO Implement
internal void UpdatePseudoClasses() internal void UpdatePseudoClasses()
{ {
PseudoClasses.Set(":selected", IsSelected);
PseudoClasses.Set(":editing", IsEditing);
if (RootElement != null && OwningGrid != null && IsVisible) if (RootElement != null && OwningGrid != null && IsVisible)
{ {
PseudoClasses.Set(":selected", IsSelected);
PseudoClasses.Set(":editing", IsEditing);
PseudoClasses.Set(":invalid", !IsValid);
ApplyHeaderStatus(); ApplyHeaderStatus();
} }
} }

20
src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs

@ -3,6 +3,7 @@
// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details. // Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
// All other rights reserved. // All other rights reserved.
using Avalonia.Controls.Mixins;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Media; using Avalonia.Media;
@ -96,6 +97,7 @@ namespace Avalonia.Controls
static DataGridRowGroupHeader() static DataGridRowGroupHeader()
{ {
SublevelIndentProperty.Changed.AddClassHandler<DataGridRowGroupHeader>((x,e) => x.OnSublevelIndentChanged(e)); SublevelIndentProperty.Changed.AddClassHandler<DataGridRowGroupHeader>((x,e) => x.OnSublevelIndentChanged(e));
PressedMixin.Attach<DataGridRowGroupHeader>();
} }
/// <summary> /// <summary>
@ -205,14 +207,18 @@ namespace Avalonia.Controls
{ {
if (_headerElement != null && OwningGrid.AreRowHeadersVisible) if (_headerElement != null && OwningGrid.AreRowHeadersVisible)
{ {
_headerElement.ApplyOwnerStatus(); _headerElement.UpdatePseudoClasses();
} }
} }
//TODO Implement internal void UpdatePseudoClasses()
internal void ApplyState(bool useTransitions)
{ {
PseudoClasses.Set(":current", IsCurrent);
if (RowGroupInfo?.CollectionViewGroup != null)
{
PseudoClasses.Set(":expanded", RowGroupInfo.IsVisible && RowGroupInfo.CollectionViewGroup.ItemCount > 0);
}
} }
protected override Size ArrangeOverride(Size finalSize) protected override Size ArrangeOverride(Size finalSize)
@ -344,7 +350,7 @@ namespace Avalonia.Controls
{ {
EnsureExpanderButtonIsChecked(); EnsureExpanderButtonIsChecked();
EnsureHeaderVisibility(); EnsureHeaderVisibility();
ApplyState(useTransitions: false); UpdatePseudoClasses();
ApplyHeaderStatus(); ApplyHeaderStatus();
} }
@ -353,7 +359,7 @@ namespace Avalonia.Controls
if (IsEnabled) if (IsEnabled)
{ {
IsMouseOver = true; IsMouseOver = true;
ApplyState(useTransitions: true); UpdatePseudoClasses();
} }
base.OnPointerEnter(e); base.OnPointerEnter(e);
@ -364,7 +370,7 @@ namespace Avalonia.Controls
if (IsEnabled) if (IsEnabled)
{ {
IsMouseOver = false; IsMouseOver = false;
ApplyState(useTransitions: true); UpdatePseudoClasses();
} }
base.OnPointerLeave(e); base.OnPointerLeave(e);
@ -402,7 +408,7 @@ namespace Avalonia.Controls
EnsureExpanderButtonIsChecked(); EnsureExpanderButtonIsChecked();
ApplyState(true /*useTransitions*/); UpdatePseudoClasses();
} }
} }

21
src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs

@ -99,7 +99,7 @@ namespace Avalonia.Controls.Primitives
_rootElement = e.NameScope.Find<Control>(DATAGRIDROWHEADER_elementRootName); _rootElement = e.NameScope.Find<Control>(DATAGRIDROWHEADER_elementRootName);
if (_rootElement != null) if (_rootElement != null)
{ {
ApplyOwnerStatus(); UpdatePseudoClasses();
} }
} }
@ -131,12 +131,27 @@ namespace Avalonia.Controls.Primitives
return measuredSize; return measuredSize;
} }
//TODO Implement internal void UpdatePseudoClasses()
internal void ApplyOwnerStatus()
{ {
if (_rootElement != null && Owner != null && Owner.IsVisible) if (_rootElement != null && Owner != null && Owner.IsVisible)
{ {
if (OwningRow != null)
{
PseudoClasses.Set(":invalid", !OwningRow.IsValid);
PseudoClasses.Set(":selected", OwningRow.IsSelected);
PseudoClasses.Set(":editing", OwningRow.IsEditing);
if (OwningGrid != null)
{
PseudoClasses.Set(":current", OwningRow.Slot == OwningGrid.CurrentSlot);
}
}
else if (OwningRowGroupHeader != null && OwningGrid != null)
{
PseudoClasses.Set(":current", OwningRowGroupHeader.RowGroupInfo.Slot == OwningGrid.CurrentSlot);
}
} }
} }

2
src/Avalonia.Controls.DataGrid/DataGridRows.cs

@ -1912,7 +1912,7 @@ namespace Avalonia.Controls
{ {
// Assume it's a RowGroupHeader // Assume it's a RowGroupHeader
DataGridRowGroupHeader groupHeader = element as DataGridRowGroupHeader; DataGridRowGroupHeader groupHeader = element as DataGridRowGroupHeader;
groupHeader.ApplyState(useTransitions: true); groupHeader.UpdatePseudoClasses();
} }
} }

Loading…
Cancel
Save