Selaa lähdekoodia

Add filtering for column name selector

Kenric Nugteren 7 kuukautta sitten
vanhempi
commit
414cef8fa5

+ 81 - 5
inabox.wpf/DynamicGrid/DynamicGridColumn/DynamicGridColumnNameSelectorWindow.cs

@@ -7,6 +7,7 @@ using System.ComponentModel;
 using System.Linq;
 using System.Runtime.CompilerServices;
 using System.Text;
+using System.Threading;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
@@ -32,6 +33,10 @@ public class DynamicGridColumnNameSelectorGrid : DynamicItemsListGrid<DynamicGri
         }
     }
 
+    private List<DynamicGridColumnNameSelectorItem> _items;
+
+    public string SearchText { get; set; }
+
     public DynamicGridColumnNameSelectorGrid(string[] columnNames)
     {
         var items = new List<DynamicGridColumnNameSelectorItem>();
@@ -85,7 +90,14 @@ public class DynamicGridColumnNameSelectorGrid : DynamicItemsListGrid<DynamicGri
         }
         items.Sort((a, b) => a.ColumnName.CompareTo(b.ColumnName));
 
-        Items = items;
+        _items = items;
+    }
+
+    protected override void DoReconfigure(DynamicGridOptions options)
+    {
+        base.DoReconfigure(options);
+        options.Clear();
+        options.FilterRows = true;
     }
 
     protected override void SelectItems(CoreRow[]? rows)
@@ -164,23 +176,87 @@ public class DynamicGridColumnNameSelectorGrid : DynamicItemsListGrid<DynamicGri
         PropertyChanged?.Invoke(this, new(propertyName));
     }
 
+    protected override void Reload(Filters<DynamicGridColumnNameSelectorItem> criteria, Columns<DynamicGridColumnNameSelectorItem> columns, ref SortOrder<DynamicGridColumnNameSelectorItem>? sort, CancellationToken token, Action<CoreTable?, Exception?> action)
+    {
+        if (SearchText.IsNullOrWhiteSpace())
+        {
+            Items = _items;
+        }
+        else
+        {
+            Items = new();
+
+            foreach(var item in _items)
+            {
+                if (!item.IsParent && item.ColumnName.Contains(SearchText, StringComparison.CurrentCultureIgnoreCase))
+                {
+                    Items.Add(item);
+                }
+            }
+            foreach(var item in _items)
+            {
+                if (item.IsParent && Items.Any(x => x.ColumnName.StartsWith(item.ColumnName + ".")))
+                {
+                    Items.Add(item);
+                }
+            }
+        }
+
+        base.Reload(criteria, columns, ref sort, token, action);
+    }
+
     public static bool SelectColumnName(string[] columnNames, out string value)
     {
         var grid = new DynamicGridColumnNameSelectorGrid(columnNames);
         grid.Refresh(true, true);
 
-        grid.OnCellDoubleClick += (o, e) =>
+        var lbl = new Label
         {
-            if (e.Row is null) return;
+            Content = "Search:",
+            Margin = new Thickness(0, 0, 5, 5)
+        };
 
-            var item = grid.LoadItem(e.Row);
+        var search = new TextBox
+        {
+            Background = Colors.LightYellow.ToBrush(),
+            Height = 25,
+            Margin = new Thickness(0, 0, 0, 5),
+            VerticalContentAlignment = VerticalAlignment.Center,
         };
+        search.TextChanged += (o, e) =>
+        {
+            grid.SearchText = search.Text;
+            grid.Refresh(false, true);
+        };
+
+        var control = new Grid();
+        control.AddColumn(GridUnitType.Auto);
+        control.AddColumn(GridUnitType.Star);
+
+        control.AddRow(GridUnitType.Auto);
+        control.AddRow(GridUnitType.Star);
 
-        var window = new DynamicContentDialog(grid)
+        control.AddChild(lbl, 0, 0);
+        control.AddChild(search, 0, 1);
+        control.AddChild(grid, 1, 0, colSpan: 2);
+
+        var window = new DynamicContentDialog(control)
         {
             Title = "Select Column"
         };
         window.Bind(DynamicContentDialog.CanSaveProperty, grid, x => x.CanSave);
+
+        grid.OnCellDoubleClick += (o, e) =>
+        {
+            if (e.Row is null) return;
+
+            var item = grid.LoadItem(e.Row);
+            if (!item.IsParent)
+            {
+                window.DialogResult = true;
+            }
+        };
+
         if(window.ShowDialog() == true && grid.SelectedRows.FirstOrDefault() is CoreRow row)
         {
             var item = grid.LoadItem(row);

+ 28 - 1
inabox.wpf/DynamicGrid/UIComponent/DynamicGridTreeUIComponent.cs

@@ -660,6 +660,33 @@ public class DynamicGridTreeUIComponent<T, TKey> : IDynamicGridUIComponent<T>, I
         return list;
     }
 
+    public void SetFilter(Func<CoreRow, bool>? predicate)
+    {
+        if(predicate is not null)
+        {
+            _tree.View.Filter = o =>
+            {
+                if(GetRow(o as CoreTreeNode<TKey>) is CoreRow row)
+                {
+                    return predicate(row);
+                }
+                else
+                {
+                    return false;
+                }
+            };
+        }
+        else
+        {
+            _tree.View.Filter = null;
+        }
+        _tree.View.RefreshFilter();
+        if(_tree.View.Nodes.Count == 0)
+        {
+            _tree.View.Refresh();
+        }
+    }
+
     #endregion
 
     private void ColumnsMenu_ContextMenuOpening(object sender, RoutedEventArgs e)
@@ -1024,7 +1051,7 @@ public class DynamicGridTreeUIComponent<T, TKey> : IDynamicGridUIComponent<T>, I
 
     public CoreRow[] GetVisibleRows()
     {
-        return _tree.View?.Nodes.Select(x => MapRow((x.Item as CoreTreeNode<TKey>)?.Row)).NotNull().ToArray() ?? new CoreRow[] { };
+        return _tree.View?.Nodes.Select(x => GetRow(x.Item as CoreTreeNode<TKey>)).NotNull().ToArray() ?? new CoreRow[] { };
     }
 
     public void ExpandRow(CoreRow row)