Browse Source

Added system to add built-in filters to a grid's filter component.

Kenric Nugteren 5 months ago
parent
commit
2d4fbd68d8

+ 8 - 1
InABox.Core/CoreFilterDefinition.cs

@@ -32,7 +32,14 @@ namespace InABox.Core
         }
     }
 
-    public class CoreFilterDefinition : BaseObject, ISequenceable
+    public interface ICoreFilterDefinition
+    {
+        string Name { get; }
+
+        Filter<T>? AsFilter<T>();
+    }
+
+    public class CoreFilterDefinition : BaseObject, ISequenceable, ICoreFilterDefinition
     {
         [EditorSequence(1)]
         [TextBoxEditor]

+ 50 - 13
inabox.wpf/DynamicGrid/DynamicGridFilterButtonComponent.cs

@@ -1,6 +1,7 @@
 using InABox.Configuration;
 using InABox.Core;
 using InABox.WPF;
+using System;
 using System.Collections.Generic;
 using System.Drawing;
 using System.Linq;
@@ -25,14 +26,40 @@ public class DynamicGridSelectedFilterSettings
         MultipleFilters = false;
     }
 
-    public DynamicGridSelectedFilterSettings(List<CoreFilterDefinition> selectedFilters, bool multipleFilters, string? temporaryFilter)
+    public DynamicGridSelectedFilterSettings(List<ICoreFilterDefinition> selectedFilters, bool multipleFilters, string? temporaryFilter)
     {
-        SelectedFilters = selectedFilters;
+        SelectedFilters = selectedFilters.Select(x =>
+        {
+            if(x is CoreFilterDefinition def)
+            {
+                return def;
+            }
+            else
+            {
+                return new CoreFilterDefinition
+                {
+                    Name = x.Name,
+                    Filter = ""
+                };
+            }
+        }).ToList();
         MultipleFilters = multipleFilters || selectedFilters.Count > 1;
         TemporaryFilter = temporaryFilter;
     }
 }
 
+public class DynamicGridFilterComponentBuiltInFilter<T>(string name, Func<Filter<T>> getFilter) : ICoreFilterDefinition
+{
+    public string Name { get; set; } = name;
+
+    public Func<Filter<T>> GetFilter { get; set; } = getFilter;
+
+    public Filter<T1>? AsFilter<T1>()
+    {
+        return GetFilter() as Filter<T1>;
+    }
+}
+
 public abstract class DynamicGridFilterComponent<T>
 {
     #region Private Fields
@@ -43,9 +70,9 @@ public abstract class DynamicGridFilterComponent<T>
 
         public Filter<T>? Filter { get; }
 
-        public CoreFilterDefinition Definition { get; set; }
+        public ICoreFilterDefinition Definition { get; set; }
 
-        public FilterItem(string name, Filter<T>? filter, CoreFilterDefinition definition)
+        public FilterItem(string name, Filter<T>? filter, ICoreFilterDefinition definition)
         {
             Name = name;
             Filter = filter;
@@ -63,14 +90,13 @@ public abstract class DynamicGridFilterComponent<T>
 
     #region Public Properties
 
-
     public IConfiguration<CoreFilterDefinitions> GlobalConfiguration { get; set; }
 
     public IConfiguration<CoreFilterDefinitions> UserConfiguration { get; set; }
 
+    public List<DynamicGridFilterComponentBuiltInFilter<T>> BuiltInFilters { get; set; } = new();
 
     private bool _multipleFilters = false;
-
     private bool MultipleFilters
     {
         get => _multipleFilters;
@@ -156,7 +182,7 @@ public abstract class DynamicGridFilterComponent<T>
         var globalFilters = Security.IsAllowed<CanEditGlobalFilters>() ? GlobalConfiguration.Load() : new CoreFilterDefinitions();
         var userFilters = UserConfiguration.Load();
         var filters = new CoreFilterDefinitions(globalFilters.Count + userFilters.Count);
-        foreach (var filter in globalFilters.Concat(userFilters))
+        foreach (var filter in BuiltInFilters.Concat<ICoreFilterDefinition>(globalFilters).Concat(userFilters))
         {
             var item = menu.AddCheckItem(filter.Name, filter, Filter_Toggle);
             item.StaysOpenOnClick = true;
@@ -164,7 +190,10 @@ public abstract class DynamicGridFilterComponent<T>
             {
                 item.IsChecked = true;
             }
-            filters.Add(filter);
+            if(filter is CoreFilterDefinition coreFilter)
+            {
+                filters.Add(coreFilter);
+            }
         }
 
         if (Security.IsAllowed<CanCustomiseFilters>())
@@ -238,7 +267,7 @@ public abstract class DynamicGridFilterComponent<T>
         SaveSettings();
     }
 
-    private void Filter_Toggle(CoreFilterDefinition tag, bool isChecked)
+    private void Filter_Toggle(ICoreFilterDefinition tag, bool isChecked)
     {
         if (MultipleFilters)
         {
@@ -273,7 +302,7 @@ public abstract class DynamicGridFilterComponent<T>
         }
     }
 
-    public void DeselectFilter(CoreFilterDefinition filter, bool refresh)
+    public void DeselectFilter(ICoreFilterDefinition filter, bool refresh)
     {
         var removed = SelectedFilters.RemoveAll(x => x.Name.Equals(filter.Name));
         if (removed > 0)
@@ -289,7 +318,7 @@ public abstract class DynamicGridFilterComponent<T>
     /// <param name="filter"></param>
     /// <param name="additional"></param>
     /// <param name="refresh"></param>
-    public void SelectFilter(CoreFilterDefinition? filter, bool additional, bool refresh)
+    public void SelectFilter(ICoreFilterDefinition? filter, bool additional, bool refresh)
     {
         var originalCount = SelectedFilters.Count;
         var alreadyHas = filter is null || SelectedFilters.Any(x => x.Name.Equals(filter.Name));
@@ -310,12 +339,20 @@ public abstract class DynamicGridFilterComponent<T>
         }
     }
 
-    public void SelectFilters(IEnumerable<CoreFilterDefinition> filters, bool refresh)
+    public void SelectFilters(IEnumerable<ICoreFilterDefinition> filters, bool refresh)
     {
         SelectedFilters.Clear();
         foreach (var filter in filters)
         {
-            SelectedFilters.Add(new(filter.Name, filter.AsFilter<T>(), filter));
+            var builtIn = BuiltInFilters.FirstOrDefault(x => x.Name == filter.Name);
+            if(builtIn is not null)
+            {
+                SelectedFilters.Add(new(filter.Name, builtIn.AsFilter<T>(), builtIn));
+            }
+            else
+            {
+                SelectedFilters.Add(new(filter.Name, filter.AsFilter<T>(), filter));
+            }
         }
         if (NumberOfFilters > 1 && !MultipleFilters)
         {