diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs index f0bb5416e..97557145d 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs @@ -29,6 +29,7 @@ public abstract partial class DataGridColumn : IDataGridColumnGroupItem internal bool? CanUserReorderInternal { get; set; } internal bool? CanUserResizeInternal { get; set; } internal bool? CanUserSortInternal { get; set; } + internal bool? CanUserFilterInternal { get; set; } internal bool ActualCanUserResize { diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs index c1f44ca3f..f357ae649 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs @@ -246,6 +246,21 @@ public abstract partial class DataGridColumn : AvaloniaObject } } + public bool CanUserFilter + { + get => CanUserResizeInternal ?? + OwningGrid?.CanUserResizeColumns ?? + DataGrid.DefaultCanUserResizeColumns; + set + { + CanUserFilterInternal = value; + if (HasHeaderCell) + { + HeaderCell.CanUserFilter = value; + } + } + } + /// /// Gets or sets a value that indicates whether the user can sort the column by clicking the column header. /// diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs index 9eadf388e..bf660f2b1 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs @@ -94,6 +94,12 @@ internal class DataGridColumnHeader : ContentControl o => o.CanUserSort, (o, v) => o.CanUserSort = v); + internal static readonly DirectProperty CanUserFilterProperty = + AvaloniaProperty.RegisterDirect( + nameof(CanUserFilter), + o => o.CanUserFilter, + (o, v) => o.CanUserFilter = v); + internal static readonly DirectProperty CurrentSortingStateProperty = AvaloniaProperty.RegisterDirect( nameof(CurrentSortingState), @@ -162,6 +168,13 @@ internal class DataGridColumnHeader : ContentControl set => SetValue(SupportedDirectionsProperty, value); } + private bool _canUserFilter = false; + internal bool CanUserFilter + { + get => _canUserFilter; + set => SetAndRaise(CanUserFilterProperty, ref _canUserFilter, value); + } + internal DataGridColumn? OwningColumn { get; set; } internal DataGrid? OwningGrid => OwningColumn?.OwningGrid; diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridFilterIndicator.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterIndicator.cs similarity index 53% rename from src/AtomUI.Controls.DataGrid/Column/DataGridFilterIndicator.cs rename to src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterIndicator.cs index 63198335d..4e1f28a10 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridFilterIndicator.cs +++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterIndicator.cs @@ -1,4 +1,3 @@ -using AtomUI.IconPkg; using AtomUI.IconPkg.AntDesign; using Avalonia; using Avalonia.Controls.Primitives; @@ -6,31 +5,13 @@ using Avalonia.Data; namespace AtomUI.Controls; -internal class DataGridFilterIndicator : TemplatedControl +internal class DataGridFilterIndicator : IconButton { #region 公共属性定义 - - public static readonly StyledProperty IconProperty - = AvaloniaProperty.Register(nameof(Icon)); - public static readonly StyledProperty IsMotionEnabledProperty - = MotionAwareControlProperty.IsMotionEnabledProperty.AddOwner(); - public static readonly StyledProperty IsFilterActivatedProperty = AvaloniaProperty.Register(nameof(IsFilterActivated)); - public Icon? Icon - { - get => GetValue(IconProperty); - set => SetValue(IconProperty, value); - } - - public bool IsMotionEnabled - { - get => GetValue(IsMotionEnabledProperty); - set => SetValue(IsMotionEnabledProperty, value); - } - public bool IsFilterActivated { get => GetValue(IsFilterActivatedProperty); diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridFilterItem.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterItem.cs similarity index 100% rename from src/AtomUI.Controls.DataGrid/Column/DataGridFilterItem.cs rename to src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterItem.cs diff --git a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyout.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyout.cs new file mode 100644 index 000000000..84de93109 --- /dev/null +++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyout.cs @@ -0,0 +1,6 @@ +namespace AtomUI.Controls; + +public class DataGridMenuFilterFlyout +{ + +} \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFilterFlyout.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFilterFlyout.cs new file mode 100644 index 000000000..24a65bd44 --- /dev/null +++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFilterFlyout.cs @@ -0,0 +1,6 @@ +namespace AtomUI.Controls; + +public class DataGridTreeFilterFlyout +{ + +} \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFlyoutPresenter.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFlyoutPresenter.cs new file mode 100644 index 000000000..ff1ced797 --- /dev/null +++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFlyoutPresenter.cs @@ -0,0 +1,6 @@ +namespace AtomUI.Controls; + +public class DataGridTreeFlyoutPresenter : TreeView +{ + +} \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs b/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs index e6b501a5f..665978db9 100644 --- a/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs +++ b/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs @@ -1528,6 +1528,7 @@ public partial class DataGrid dataGridColumn.HeaderCell.IsVisible = dataGridColumn.IsVisible; Debug.Assert(!_columnHeadersPresenter.Children.Contains(dataGridColumn.HeaderCell)); dataGridColumn.HeaderCell.CanUserSort = dataGridColumn.CanUserSort; + dataGridColumn.HeaderCell.CanUserFilter = dataGridColumn.CanUserFilter; _columnHeadersPresenter.Children.Insert(dataGridColumn.DisplayIndexWithFiller, dataGridColumn.HeaderCell); } } diff --git a/src/AtomUI.Controls.DataGrid/DataGrid.Privates.cs b/src/AtomUI.Controls.DataGrid/DataGrid.Privates.cs index f3f1a6825..0d0ab977c 100644 --- a/src/AtomUI.Controls.DataGrid/DataGrid.Privates.cs +++ b/src/AtomUI.Controls.DataGrid/DataGrid.Privates.cs @@ -29,6 +29,7 @@ public partial class DataGrid internal const bool DefaultCanUserReorderColumns = true; internal const bool DefaultCanUserResizeColumns = true; internal const bool DefaultCanUserSortColumns = false; + internal const bool DefaultCanUserFilterColumns = false; #region 内部属性定义 @@ -1338,7 +1339,8 @@ public partial class DataGrid column.HeaderCell.IsMiddleVisible = true; } - column.HeaderCell.CanUserSort = column.CanUserSort; + column.HeaderCell.CanUserSort = column.CanUserSort; + column.HeaderCell.CanUserFilter = column.CanUserFilter; } PseudoClasses.Set(DataGridPseudoClass.EmptyColumns, !visibleColumns.Any()); PseudoClasses.Set(DataGridPseudoClass.EmptyRows, !DataConnection.Any()); diff --git a/src/AtomUI.Controls.DataGrid/DataGrid.cs b/src/AtomUI.Controls.DataGrid/DataGrid.cs index 475b89c80..449cfb1d0 100644 --- a/src/AtomUI.Controls.DataGrid/DataGrid.cs +++ b/src/AtomUI.Controls.DataGrid/DataGrid.cs @@ -65,6 +65,12 @@ public partial class DataGrid : TemplatedControl, public static readonly StyledProperty CanUserSortColumnsProperty = AvaloniaProperty.Register(nameof(CanUserSortColumns), false); + /// + /// Identifies the CanUserFilterColumns dependency property. + /// + public static readonly StyledProperty CanUserFilterColumnsProperty = + AvaloniaProperty.Register(nameof(CanUserFilterColumns), false); + /// /// Identifies the ColumnHeaderHeight dependency property. /// @@ -229,6 +235,15 @@ public partial class DataGrid : TemplatedControl, get => GetValue(CanUserSortColumnsProperty); set => SetValue(CanUserSortColumnsProperty, value); } + + /// + /// Gets or sets a value that indicates whether the user can filter columns by clicking the column filter indicator. + /// + public bool CanUserFilterColumns + { + get => GetValue(CanUserFilterColumnsProperty); + set => SetValue(CanUserFilterColumnsProperty, value); + } /// /// Gets or sets the height of the column headers row. diff --git a/src/AtomUI.Controls.DataGrid/Themes/DataGridFilterIndicatorTheme.axaml b/src/AtomUI.Controls.DataGrid/Themes/DataGridFilterIndicatorTheme.axaml index 14b28b518..d68db750e 100644 --- a/src/AtomUI.Controls.DataGrid/Themes/DataGridFilterIndicatorTheme.axaml +++ b/src/AtomUI.Controls.DataGrid/Themes/DataGridFilterIndicatorTheme.axaml @@ -1,48 +1,37 @@ + xmlns:atom="https://atomui.net" + xmlns:themes="using:AtomUI.Controls.Themes"> - - - - - - - + + + - + + + + + + + + + + + diff --git a/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridTreeFlyoutPresenterTheme.axaml b/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridTreeFlyoutPresenterTheme.axaml new file mode 100644 index 000000000..226e8b252 --- /dev/null +++ b/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridTreeFlyoutPresenterTheme.axaml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/Utils/Converters/DataGridFilterIndicatorVisibleConvert.cs b/src/AtomUI.Controls.DataGrid/Utils/Converters/DataGridFilterIndicatorVisibleConvert.cs new file mode 100644 index 000000000..ac35a865a --- /dev/null +++ b/src/AtomUI.Controls.DataGrid/Utils/Converters/DataGridFilterIndicatorVisibleConvert.cs @@ -0,0 +1,14 @@ +using System.Globalization; +using Avalonia.Data.Converters; + +namespace AtomUI.Controls.Converters; + +internal class DataGridFilterIndicatorVisibleConvert : IMultiValueConverter +{ + public static readonly DataGridFilterIndicatorVisibleConvert Default = new(); + + public object Convert(IList values, Type targetType, object? parameter, CultureInfo culture) + { + return values.All(v => v is bool && (bool)v); + } +} \ No newline at end of file diff --git a/src/AtomUI.Controls/Buttons/Themes/ButtonThemes.axaml b/src/AtomUI.Controls/Buttons/Themes/ButtonThemes.axaml index e396bfb10..b76162372 100644 --- a/src/AtomUI.Controls/Buttons/Themes/ButtonThemes.axaml +++ b/src/AtomUI.Controls/Buttons/Themes/ButtonThemes.axaml @@ -1,10 +1,12 @@ + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:atom="https://atomui.net" + xmlns:themes="using:AtomUI.Controls.Themes"> - + \ No newline at end of file diff --git a/src/AtomUI.Controls/Buttons/Themes/IconButtonTheme.axaml b/src/AtomUI.Controls/Buttons/Themes/IconButtonTheme.axaml index 2a31b5137..3ab16f97b 100644 --- a/src/AtomUI.Controls/Buttons/Themes/IconButtonTheme.axaml +++ b/src/AtomUI.Controls/Buttons/Themes/IconButtonTheme.axaml @@ -1,36 +1,37 @@ - - - - - - - - - - + + + + + + + + + + + - - \ No newline at end of file + \ No newline at end of file diff --git a/src/AtomUI.Controls/Buttons/Themes/IconButtonTheme.cs b/src/AtomUI.Controls/Buttons/Themes/IconButtonTheme.cs new file mode 100644 index 000000000..df857f1d7 --- /dev/null +++ b/src/AtomUI.Controls/Buttons/Themes/IconButtonTheme.cs @@ -0,0 +1,7 @@ +using Avalonia.Styling; + +namespace AtomUI.Controls.Themes; + +public class IconButtonTheme : ControlTheme +{ +} \ No newline at end of file