Browse Source

Extracted out the DynamicGrid Filtering capabilities further, so that I could create a generic filter button.

Kenric Nugteren 1 year ago
parent
commit
7e52de6db7

+ 95 - 54
inabox.wpf/DynamicGrid/DynamicGridFilterButtonComponent.cs

@@ -3,6 +3,7 @@ using InABox.Core;
 using InABox.WPF;
 using System;
 using System.Collections.Generic;
+using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -33,11 +34,38 @@ public class DynamicGridSelectedFilterSettings
     }
 }
 
-public class DynamicGridFilterButtonComponent<T>
-    where T : BaseObject, new()
+public abstract class DynamicGridFilterComponent<T>
 {
+    #region Private Fields
+
+    private class FilterItem
+    {
+        public string Name { get; set; }
+
+        public Filter<T>? Filter { get; }
+
+        public CoreFilterDefinition Definition { get; set; }
+
+        public FilterItem(string name, Filter<T>? filter, CoreFilterDefinition definition)
+        {
+            Name = name;
+            Filter = filter;
+            Definition = definition;
+        }
+    }
+
+    private List<FilterItem> SelectedFilters = new();
+
+    private Filter<T>? TemporaryFilter = null;
 
-    private Button FilterBtn = null!; // Late-initialised
+    private IConfiguration<CoreFilterDefinitions> GlobalConfiguration;
+    private IConfiguration<CoreFilterDefinitions> UserConfiguration;
+
+    private int NumberOfFilters => SelectedFilters.Count + (TemporaryFilter is null ? 0 : 1);
+
+    #endregion
+
+    #region Public Properties
 
     private bool _multipleFilters = false;
 
@@ -49,7 +77,7 @@ public class DynamicGridFilterButtonComponent<T>
             if (_multipleFilters != value)
             {
                 _multipleFilters = value;
-                if (!_multipleFilters && SelectedFilters.Count > 1)
+                if (!_multipleFilters && NumberOfFilters > 1)
                 {
                     ClearFilters(true);
                 }
@@ -57,18 +85,6 @@ public class DynamicGridFilterButtonComponent<T>
         }
     }
 
-    private bool _showFilterList;
-    public bool ShowFilterList
-    {
-        get => _showFilterList;
-        set
-        {
-            _showFilterList = value;
-            if (FilterBtn != null)
-                FilterBtn.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
-        }
-    }
-
     private string? _buttonText;
     public string? ButtonText
     {
@@ -83,30 +99,9 @@ public class DynamicGridFilterButtonComponent<T>
         }
     }
 
-    private class FilterItem
-    {
-        public string Name { get; set; }
-
-        public Filter<T>? Filter { get; }
-
-        public CoreFilterDefinition Definition { get; set; }
-
-        public FilterItem(string name, Filter<T>? filter, CoreFilterDefinition definition)
-        {
-            Name = name;
-            Filter = filter;
-            Definition = definition;
-        }
-    }
-
-    private List<FilterItem> SelectedFilters = new();
-
-    private Filter<T>? TemporaryFilter = null;
-
-    private IDynamicGrid Grid;
+    #endregion
 
-    private IConfiguration<CoreFilterDefinitions> GlobalConfiguration;
-    private IConfiguration<CoreFilterDefinitions> UserConfiguration;
+    #region Events
 
     public delegate void FilterSelectedHandler(DynamicGridSelectedFilterSettings filters);
 
@@ -116,17 +111,14 @@ public class DynamicGridFilterButtonComponent<T>
 
     public event FilterRefreshHandler? OnFilterRefresh;
 
-    public DynamicGridFilterButtonComponent(IDynamicGrid grid,
+    #endregion
+
+    public DynamicGridFilterComponent(
         IConfiguration<CoreFilterDefinitions> globalConfiguration,
         IConfiguration<CoreFilterDefinitions> userConfiguration)
     {
-        Grid = grid;
         GlobalConfiguration = globalConfiguration;
         UserConfiguration = userConfiguration;
-
-        FilterBtn = Grid.AddButton("", Wpf.Resources.filter.AsBitmapImage(), DoFilter);
-        FilterBtn.Margin = new Thickness(0, 2, 7, 0);
-        FilterBtn.Padding = new Thickness(0);
     }
 
     public void SetSettings(DynamicGridSelectedFilterSettings settings, bool refresh)
@@ -203,7 +195,7 @@ public class DynamicGridFilterButtonComponent<T>
         if (window.ShowDialog() == true)
         {
             TemporaryFilter = window.GetFilter<T>();
-            if(TemporaryFilter is not null && !MultipleFilters)
+            if (TemporaryFilter is not null && !MultipleFilters)
             {
                 SelectedFilters.Clear();
             }
@@ -211,7 +203,7 @@ public class DynamicGridFilterButtonComponent<T>
         }
     }
 
-    private bool DoFilter(Button button, CoreRow[] rows)
+    protected void DoFilter()
     {
         Menu = new ContextMenu();
 
@@ -219,8 +211,6 @@ public class DynamicGridFilterButtonComponent<T>
 
         Menu.IsOpen = true;
         Menu.Closed += Menu_Closed;
-
-        return false;
     }
 
     private void Menu_Closed(object sender, RoutedEventArgs e)
@@ -273,7 +263,7 @@ public class DynamicGridFilterButtonComponent<T>
 
     public void ClearFilters(bool refresh)
     {
-        if (SelectedFilters.Count > 0 || TemporaryFilter is not null)
+        if (NumberOfFilters > 0)
         {
             SelectedFilters.Clear();
             TemporaryFilter = null;
@@ -325,7 +315,7 @@ public class DynamicGridFilterButtonComponent<T>
         {
             SelectedFilters.Add(new(filter.Name, filter.AsFilter<T>(), filter));
         }
-        if (SelectedFilters.Count > 1 && !MultipleFilters)
+        if (NumberOfFilters > 1 && !MultipleFilters)
         {
             MultipleFilters = true;
         }
@@ -342,14 +332,16 @@ public class DynamicGridFilterButtonComponent<T>
         }
     }
 
+    protected abstract void UpdateButtonText(Bitmap image, string text);
+
     private void UpdateButton()
     {
-        var image = SelectedFilters.Count > 0
+        var image = NumberOfFilters > 0
             ? Wpf.Resources.filter_set
             : Wpf.Resources.filter;
 
         var filterNames = SelectedFilters.Select(x => x.Name);
-        if(TemporaryFilter is not null)
+        if (TemporaryFilter is not null)
         {
             filterNames = CoreUtils.One("Custom").Concat(filterNames);
         }
@@ -366,7 +358,7 @@ public class DynamicGridFilterButtonComponent<T>
                 text = $"{ButtonText}: {text}";
             }
         }
-        Grid.UpdateButton(FilterBtn, image.AsBitmapImage(), text);
+        UpdateButtonText(image, text);
     }
 
     private void SaveSettings()
@@ -384,4 +376,53 @@ public class DynamicGridFilterButtonComponent<T>
         filters.Add(TemporaryFilter);
         return filters.Combine();
     }
+}
+
+public class DynamicGridFilterButtonComponent<T> : DynamicGridFilterComponent<T>
+    where T : BaseObject, new()
+{
+    private readonly IDynamicGrid Grid;
+
+    private Button FilterBtn = null!;
+
+
+    private bool _showFilterList;
+    public bool ShowFilterList
+    {
+        get => _showFilterList;
+        set
+        {
+            _showFilterList = value;
+            if (FilterBtn != null)
+                FilterBtn.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
+        }
+    }
+
+    public DynamicGridFilterButtonComponent(
+        IDynamicGrid grid,
+        IConfiguration<CoreFilterDefinitions> globalConfiguration,
+        IConfiguration<CoreFilterDefinitions> userConfiguration) : base(globalConfiguration, userConfiguration)
+    {
+        Grid = grid;
+
+        CreateButton();
+    }
+
+    private void CreateButton()
+    {
+        FilterBtn = Grid.AddButton("", Wpf.Resources.filter.AsBitmapImage(), Click);
+        FilterBtn.Margin = new Thickness(0, 2, 7, 0);
+        FilterBtn.Padding = new Thickness(0);
+    }
+
+    private bool Click(Button _arg1, CoreRow[] _arg2)
+    {
+        DoFilter();
+        return false;
+    }
+
+    protected override void UpdateButtonText(Bitmap image, string text)
+    {
+        Grid.UpdateButton(FilterBtn, image.AsBitmapImage(), text);
+    }
 }

+ 115 - 0
inabox.wpf/Forms/FilterButton.cs

@@ -0,0 +1,115 @@
+using InABox.Configuration;
+using InABox.Core;
+using InABox.DynamicGrid;
+using InABox.WPF;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+
+namespace InABox.Wpf;
+
+public class FilterButton<T> : Button
+    where T : BaseObject, new()
+{
+    public event DynamicGridFilterComponent<T>.FilterSelectedHandler? OnFiltersSelected
+    {
+        add { Component.OnFiltersSelected += value; }
+        remove { Component.OnFiltersSelected -= value; }
+    }
+
+    public event DynamicGridFilterComponent<T>.FilterRefreshHandler? OnFilterRefresh
+    {
+        add { Component.OnFilterRefresh += value; }
+        remove { Component.OnFilterRefresh -= value; }
+    }
+
+    private class ButtonComponent : DynamicGridFilterComponent<T>
+    {
+        private FilterButton<T> Button;
+
+        public ButtonComponent(
+            FilterButton<T> button,
+            IConfiguration<CoreFilterDefinitions> globalConfiguration,
+            IConfiguration<CoreFilterDefinitions> userConfiguration) : base(globalConfiguration, userConfiguration)
+        {
+            Button = button;
+        }
+
+        protected override void UpdateButtonText(System.Drawing.Bitmap image, string text)
+        {
+            Button.Update(image, text);
+        }
+
+        public void Click()
+        {
+            DoFilter();
+        }
+    }
+
+    private ButtonComponent Component;
+
+    public FilterButton(
+        IConfiguration<CoreFilterDefinitions> globalConfiguration,
+        IConfiguration<CoreFilterDefinitions> userConfiguration)
+    {
+        Component = new(this, globalConfiguration, userConfiguration);
+
+        SetValue(BorderBrushProperty, new SolidColorBrush(Colors.Gray));
+        SetValue(BorderThicknessProperty, new Thickness(0.75));
+        Height = 30;
+
+        Update(Wpf.Resources.filter, "");
+    }
+
+    private void Update(System.Drawing.Bitmap image, string text)
+    {
+        var stackPnl = new StackPanel();
+        stackPnl.Orientation = Orientation.Horizontal;
+        //stackPnl.Margin = new Thickness(2);
+
+        if (image != null)
+        {
+            var img = new Image
+            {
+                Source = image.AsBitmapImage(),
+                Margin = new Thickness(2)
+            };
+            stackPnl.Children.Add(img);
+        }
+
+        if (!string.IsNullOrEmpty(text))
+        {
+            MaxWidth = double.MaxValue;
+            var lbl = new Label();
+            lbl.Content = text;
+            lbl.VerticalAlignment = VerticalAlignment.Stretch;
+            lbl.VerticalContentAlignment = VerticalAlignment.Center;
+            lbl.Margin = new Thickness(2, 0, 5, 0);
+            lbl.ToolTip = ToolTip;
+            stackPnl.Children.Add(lbl);
+        }
+        else
+        {
+            MaxWidth = 30;
+        }
+
+        Content = stackPnl;
+    }
+
+    protected override void OnClick()
+    {
+        base.OnClick();
+
+        Component.Click();
+    }
+    public Filter<T>? GetFilter()
+    {
+        return Component.GetFilter();
+    }
+}