Bladeren bron

On-the-fly filters added

Kenric Nugteren 1 jaar geleden
bovenliggende
commit
2a8626e34c
1 gewijzigde bestanden met toevoegingen van 48 en 4 verwijderingen
  1. 48 4
      inabox.wpf/DynamicGrid/DynamicGridFilterButtonComponent.cs

+ 48 - 4
inabox.wpf/DynamicGrid/DynamicGridFilterButtonComponent.cs

@@ -13,6 +13,8 @@ namespace InABox.DynamicGrid;
 
 public class DynamicGridSelectedFilterSettings
 {
+    public string? TemporaryFilter { get; set; }
+
     public List<CoreFilterDefinition> SelectedFilters { get; set; }
 
     public bool MultipleFilters { get; set; }
@@ -23,10 +25,11 @@ public class DynamicGridSelectedFilterSettings
         MultipleFilters = false;
     }
 
-    public DynamicGridSelectedFilterSettings(List<CoreFilterDefinition> selectedFilters, bool multipleFilters)
+    public DynamicGridSelectedFilterSettings(List<CoreFilterDefinition> selectedFilters, bool multipleFilters, string? temporaryFilter)
     {
         SelectedFilters = selectedFilters;
         MultipleFilters = multipleFilters || selectedFilters.Count > 1;
+        TemporaryFilter = temporaryFilter;
     }
 }
 
@@ -98,6 +101,8 @@ public class DynamicGridFilterButtonComponent<T>
 
     private List<FilterItem> SelectedFilters = new();
 
+    private Filter<T>? TemporaryFilter = null;
+
     private IDynamicGrid Grid;
 
     private IConfiguration<CoreFilterDefinitions> GlobalConfiguration;
@@ -127,6 +132,7 @@ public class DynamicGridFilterButtonComponent<T>
     public void SetSettings(DynamicGridSelectedFilterSettings settings, bool refresh)
     {
         _multipleFilters = settings.MultipleFilters;
+        TemporaryFilter = Serialization.Deserialize<Filter<T>>(settings.TemporaryFilter);
         SelectFilters(settings.SelectedFilters, refresh);
     }
 
@@ -137,6 +143,16 @@ public class DynamicGridFilterButtonComponent<T>
     private void RebuildMenu(ContextMenu menu)
     {
         menu.Items.Clear();
+
+        if (TemporaryFilter is null)
+        {
+            menu.AddCheckItem("Filter...", TemporaryFilter_Click, isChecked: false);
+        }
+        else
+        {
+            menu.AddCheckItem("<Custom Filter>", TemporaryFilter_Click, isChecked: true);
+        }
+
         menu.AddItem("Clear Filters", null, ClearFilter_Click);
         var multipleFilters = menu.AddCheckItem("Use Multiple Filters", MultipleFilters_Click, MultipleFilters);
         multipleFilters.StaysOpenOnClick = true;
@@ -180,6 +196,21 @@ public class DynamicGridFilterButtonComponent<T>
         }
     }
 
+    private void TemporaryFilter_Click(bool isChecked)
+    {
+        var window = new FilterEditorWindow();
+        window.SetFilter(TemporaryFilter ?? new Filter<T>());
+        if (window.ShowDialog() == true)
+        {
+            TemporaryFilter = window.GetFilter<T>();
+            if(TemporaryFilter is not null && !MultipleFilters)
+            {
+                SelectedFilters.Clear();
+            }
+            UpdateFilters(true);
+        }
+    }
+
     private bool DoFilter(Button button, CoreRow[] rows)
     {
         Menu = new ContextMenu();
@@ -242,9 +273,10 @@ public class DynamicGridFilterButtonComponent<T>
 
     public void ClearFilters(bool refresh)
     {
-        if (SelectedFilters.Count > 0)
+        if (SelectedFilters.Count > 0 || TemporaryFilter is not null)
         {
             SelectedFilters.Clear();
+            TemporaryFilter = null;
             UpdateFilters(refresh);
         }
     }
@@ -273,6 +305,7 @@ public class DynamicGridFilterButtonComponent<T>
         if (!additional)
         {
             SelectedFilters.Clear();
+            TemporaryFilter = null;
         }
         if (filter is not null && !SelectedFilters.Any(x => x.Name.Equals(filter.Name)))
         {
@@ -314,7 +347,14 @@ public class DynamicGridFilterButtonComponent<T>
         var image = SelectedFilters.Count > 0
             ? Wpf.Resources.filter_set
             : Wpf.Resources.filter;
-        var text = string.Join(", ", SelectedFilters.Select(x => x.Name));
+
+        var filterNames = SelectedFilters.Select(x => x.Name);
+        if(TemporaryFilter is not null)
+        {
+            filterNames = CoreUtils.One("Custom").Concat(filterNames);
+        }
+
+        var text = string.Join(", ", filterNames);
         if (!ButtonText.IsNullOrWhiteSpace())
         {
             if (text.IsNullOrWhiteSpace())
@@ -331,13 +371,17 @@ public class DynamicGridFilterButtonComponent<T>
 
     private void SaveSettings()
     {
-        OnFiltersSelected?.Invoke(new DynamicGridSelectedFilterSettings(SelectedFilters.Select(x => x.Definition).ToList(), MultipleFilters));
+        OnFiltersSelected?.Invoke(new DynamicGridSelectedFilterSettings(
+            SelectedFilters.Select(x => x.Definition).ToList(),
+            MultipleFilters,
+            TemporaryFilter is not null ? Serialization.Serialize(TemporaryFilter) : null));
     }
 
     public Filter<T>? GetFilter()
     {
         var filters = new Filters<T>();
         filters.AddRange(SelectedFilters.Select(x => x.Filter));
+        filters.Add(TemporaryFilter);
         return filters.Combine();
     }
 }