Browse Source

Preliminary Work to improve Button Editors (not compiling)

frankvandenbos 7 tháng trước cách đây
mục cha
commit
4a93d7c3f3

+ 15 - 1
InABox.Core/DataModel/DataModelTemplate.cs

@@ -1,6 +1,7 @@
 using InABox.Clients;
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Reflection;
 
 namespace InABox.Core
@@ -14,8 +15,21 @@ namespace InABox.Core
         [TextBoxEditor]
         public string Name { get; set; }
 
+        
+        private class DataModelTemplateButtonGenerator : IButtonGenerator
+        {
+            
+            public EditorButton[]? Generate()
+            {
+                return new EditorButton[]
+                {
+                    new EditorButton(templates.FirstOrDefault(), "Edit", 60, TemplateEditorClicked, true)
+                };
+            }
+        }
+
         [EditorSequence(2)]
-        [TextBoxEditor(Editable = Editable.Enabled)]
+        [TextBoxEditor(Editable = Editable.Enabled, Buttons = typeof(DataModelTemplateButtonGenerator))]
         public string To { get; set; }
 
         [EditorSequence(3)]

+ 6 - 2
InABox.Core/Objects/Editors/TextBoxEditor.cs

@@ -1,5 +1,9 @@
-namespace InABox.Core
+using System;
+
+namespace InABox.Core
 {
+
+    
     public class TextBoxEditor : BaseEditor, IButtonEditor
     {
         public TextBoxEditor()
@@ -7,7 +11,7 @@
             Visible = Visible.Default;
         }
 
-        public EditorButton[]? Buttons { get; set; }
+        public Type Buttons { get; set; }
 
         protected override BaseEditor DoClone()
         {

+ 1 - 2
InABox.Core/Objects/Editors/Utils/EditorButton.cs

@@ -29,8 +29,7 @@
         public bool IsEnabled { get; private set; }
 
         public bool IsVisible { get; private set; }
-
-
+        
         public event EditorButtonClick OnClick;
         public event EditorButtonEnabled OnEnabled;
         public event EditorButtonEnabled OnVisible;

+ 10 - 2
InABox.Core/Objects/Editors/Utils/IButtonEditor.cs

@@ -1,7 +1,15 @@
-namespace InABox.Core
+using System;
+
+namespace InABox.Core
 {
+    
+    public interface IButtonGenerator
+    {
+        EditorButton[]? Generate();
+    }
+    
     public interface IButtonEditor : IBaseEditor
     {
-        EditorButton[]? Buttons { get; set; }
+        Type Buttons { get; set; }
     }
 }

+ 8 - 0
inabox.wpf/DynamicGrid/DynamicEditorGrid.xaml.cs

@@ -160,6 +160,9 @@ public partial class DynamicEditorGrid : UserControl, IDynamicEditorHost
     public event EditorGridValueChangedHandler? OnEditorValueChanged;
 
     public event OnAfterEditorValueChanged? OnAfterEditorValueChanged;
+    
+    public delegate Dictionary<string, object?> EditorButtonClickedHandler(DynamicEditorGrid sender, string name, object? value);
+    public event EditorButtonClickedHandler? OnEditorButtonClicked;
 
     public event OnReconfigureEditors? OnReconfigureEditors;
     
@@ -193,6 +196,11 @@ public partial class DynamicEditorGrid : UserControl, IDynamicEditorHost
 
     public Type GetEditorType() => UnderlyingType;
 
+    public virtual void EditorButtonClicked(IBaseEditor editor)
+    {
+        OnEditorButtonClicked?.Invoke()
+    }
+
     #endregion
 
     #region Edit Page

+ 11 - 7
inabox.wpf/DynamicGrid/Editors/BaseDynamicEditorControl.cs

@@ -148,11 +148,14 @@ namespace InABox.DynamicGrid
 
         protected List<Button> CreateButtons(out bool bDisableEditor)
         {
-            var buttons = new List<Button>();
+            var result = new List<Button>();
             bDisableEditor = false;
             if (EditorDefinition != null && EditorDefinition is IButtonEditor ce && ce.Buttons is not null)
             {
-                foreach (var ceb in ce.Buttons.Reverse())
+                var generator = Activator.CreateInstance(ce.Buttons) as IButtonGenerator;
+                var buttons = generator?.Generate();
+                
+                foreach (var ceb in buttons.Reverse())
                 {
                     if (ceb.DisableEditor)
                         bDisableEditor = true;
@@ -173,9 +176,10 @@ namespace InABox.DynamicGrid
                     };
                     button.Click += (o, e) =>
                     {
-                        var b = (Button)o;
-                        var eb = b.Tag as EditorButton;
-                        eb.Click(this);
+                        Host.EditorButtonClicked(EditorDefinition);
+                        // var b = (Button)o;
+                        // var eb = b.Tag as EditorButton;
+                        // eb.Click(this);
                     };
                     ceb.OnVisible += (visible) =>
                     {
@@ -185,10 +189,10 @@ namespace InABox.DynamicGrid
                     {
                         button.IsEnabled = enabled;
                     };
-                    buttons.Add(button);
+                    result.Add(button);
                 }
             }
-            return buttons;
+            return result;
         }
         
         

+ 6 - 3
inabox.wpf/DynamicGrid/Editors/CodeEditor/CodeEditorControl.cs

@@ -97,10 +97,13 @@ public class CodeEditorControl : DynamicEditorControl<string, BaseCodeEditor>
     public override int DesiredWidth()
     {
         var result = 150;
-        var btnEditor = EditorDefinition as IButtonEditor;
-        if (btnEditor?.Buttons != null)
-            foreach (var button in ((IButtonEditor)EditorDefinition).Buttons)
+        if (EditorDefinition is IButtonEditor btnEditor)
+        {
+            var generator = Activator.CreateInstance(btnEditor.Buttons) as IButtonGenerator;
+            var buttons = generator?.Generate() ?? new EditorButton[] { };
+            foreach (var button in buttons)
                 result += button.Width + 5;
+        }
         return result;
     }
 

+ 12 - 0
inabox.wpf/DynamicGrid/IDynamicEditorHost.cs

@@ -76,6 +76,13 @@ public interface IDynamicEditorHost
     /// <param name="column">The column to get the editor of.</param>
     /// <returns>The editor, or <see langword="null"/> if it doesn't exist.</returns>
     BaseEditor? GetEditor(DynamicGridColumn column);
+    
+    
+    /// <summary>
+    /// Bubbles up Clicks on Dynamically Defined Editor
+    /// </summary>
+    /// <param name="editor"></param>
+    void EditorButtonClicked(IBaseEditor editor);
 }
 
 public class DefaultDynamicEditorHost<T> : IDynamicEditorHost
@@ -98,4 +105,9 @@ public class DefaultDynamicEditorHost<T> : IDynamicEditorHost
         sender.LoadLookups(values);
     }
 
+    public virtual void EditorButtonClicked(IBaseEditor editor)
+    {
+        
+    }
+
 }