Explorar el Código

Overrode system for determining default columns to use the new "DefaultColumns" class.

Kenric Nugteren hace 7 meses
padre
commit
9897bce035

+ 80 - 0
InABox.Core/Objects/DefaultColumns.cs

@@ -0,0 +1,80 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Text;
+
+namespace InABox.Core
+{
+    public class CoreGridColumn
+    {
+        public IProperty Property { get; set; }
+
+        public int Width { get; set; }
+
+        public Alignment Alignment { get; set; }
+
+        public string Format { get; set; }
+
+        public BaseEditor Editor { get; set; }
+
+        public string Caption { get; set; }
+
+        public CoreGridColumn(IProperty property, int width, Alignment alignment, string format, BaseEditor editor, string caption)
+        {
+            Property = property;
+            Width = width;
+            Alignment = alignment;
+            Format = format;
+            Editor = editor;
+            Caption = caption;
+        }
+    }
+
+    /// <summary>
+    /// This is the new system for managing default columns on grids. (This replaces <see cref="Visible.Default"/> on <see cref="BaseEditor.Visible"/>).
+    /// </summary>
+    public static class DefaultColumns
+    {
+        private static readonly Dictionary<Type, List<CoreGridColumn>> _columns = new Dictionary<Type, List<CoreGridColumn>>();
+
+        public static IEnumerable<CoreGridColumn> GetDefaultColumns(Type T)
+        {
+            System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(T.TypeHandle);
+            return _columns.GetValueOrDefault(T) ?? Enumerable.Empty<CoreGridColumn>();
+        }
+
+        public static CoreGridColumn CreateColumn<TType, TProperty>(
+            Expression<Func<TType, TProperty>> member,
+            int? width = null,
+            string? caption = null,
+            string? format = null,
+            Alignment? alignment = null)
+        {
+            var prop = DatabaseSchema.Property(member) ?? throw new Exception($"Could not find property {CoreUtils.GetFullPropertyName(member, ".")}");
+            var col = new CoreGridColumn(
+                prop,
+                width ?? prop.Editor.Width,
+                alignment ?? prop.Editor.Alignment,
+                format ?? prop.Editor.Format,
+                prop.Editor.CloneEditor(),
+                caption ?? prop.Caption);
+            return col;
+        }
+
+        public static CoreGridColumn Add<TType>(
+            Expression<Func<TType, object?>> member,
+            int? width = null,
+            string? caption = null,
+            string? format = null,
+            Alignment? alignment = null
+        )
+        {
+            var col = CreateColumn(member, width: width, caption: caption, format: format, alignment: alignment);
+            var list = _columns.GetValueOrAdd(typeof(TType));
+            list.Add(col);
+            return col;
+        }
+    }
+}

+ 10 - 1
InABox.Core/Query/Column.cs

@@ -336,6 +336,11 @@ namespace InABox.Core
             if (typeof(T).IsSubclassOf(typeof(Entity)) && flags.HasFlag(ColumnTypeFlags.IncludeID))
                 columns.Add(new Column<T>(nameof(Entity.ID)));
 
+            var visibleProps = flags.HasFlag(ColumnTypeFlags.IncludeVisible)
+                ? DefaultColumns.GetDefaultColumns(typeof(T)).Select(x => x.Property).ToHashSet()
+                : null;
+            var hasVisibleProps = visibleProps != null && visibleProps.Count > 0;
+
             foreach(var prop in props)
             {
                 if (flags.HasFlag(ColumnTypeFlags.Required) && prop.Required)
@@ -383,7 +388,11 @@ namespace InABox.Core
                         if (!failed)
                         {
                             var hasNullEditor = prop.GetParent(x => x.HasEditor && x.Editor is NullEditor) != null;
-                            var visible = hasNullEditor ? Visible.Hidden : (prop.Editor?.Visible ?? Visible.Optional);
+                            var visible = hasNullEditor || prop.Editor?.Visible == Visible.Hidden
+                                ? Visible.Hidden
+                                : hasVisibleProps
+                                    ? (visibleProps!.Contains(prop) ? Visible.Default : Visible.Optional)
+                                    : (prop.Editor?.Visible ?? Visible.Optional);
                             var editable = hasNullEditor ? Editable.Hidden : (prop.Editor?.Editable ?? Editable.Enabled);
 
                             failed = (!flags.HasFlag(ColumnTypeFlags.IncludeVisible) || visible != Visible.Default)

+ 47 - 35
inabox.wpf/DynamicGrid/DynamicGridColumn.cs

@@ -3,55 +3,67 @@ using System.Collections.Generic;
 using System.Windows;
 using InABox.Core;
 
-namespace InABox.DynamicGrid
+namespace InABox.DynamicGrid;
+
+public class ColumnNameGenerator : LookupGenerator<object>
 {
-    public class ColumnNameGenerator : LookupGenerator<object>
+    public ColumnNameGenerator(object[] items) : base(items)
     {
-        public ColumnNameGenerator(object[] items) : base(items)
-        {
-            //DynamicGridColumns cols = new DynamicGridColumns();
-            //cols.ExtractColumns(type, "");
-            //foreach (DynamicGridColumn col in cols.Where(x => (x.Editor != null) && (x.Editor.Visible != Visible.Disabled)))
-            //    AddValue(col.ColumnName, col.ColumnName);
-        }
+        //DynamicGridColumns cols = new DynamicGridColumns();
+        //cols.ExtractColumns(type, "");
+        //foreach (DynamicGridColumn col in cols.Where(x => (x.Editor != null) && (x.Editor.Visible != Visible.Disabled)))
+        //    AddValue(col.ColumnName, col.ColumnName);
     }
+}
 
-    public class DynamicGridColumn : DynamicColumnBase
+public class DynamicGridColumn : DynamicColumnBase
+{
+    public DynamicGridColumn()
     {
-        public DynamicGridColumn()
-        {
-            Editor = new NullEditor();
-        }
+        Editor = new NullEditor();
+    }
 
-        [ComboLookupEditor(typeof(ColumnNameGenerator), Visible = Visible.Default)]
-        [EditorSequence(1)]
-        public string ColumnName { get; set; }
+    [ComboLookupEditor(typeof(ColumnNameGenerator), Visible = Visible.Default)]
+    [EditorSequence(1)]
+    public string ColumnName { get; set; }
 
-        [EditorSequence(2)]
-        [IntegerEditor(Visible = Visible.Default)]
-        public int Width { get; set; }
+    [EditorSequence(2)]
+    [IntegerEditor(Visible = Visible.Default)]
+    public int Width { get; set; }
 
-        [EditorSequence(3)]
-        [TextBoxEditor(Visible = Visible.Default)]
-        public string Caption { get; set; }
+    [EditorSequence(3)]
+    [TextBoxEditor(Visible = Visible.Default)]
+    public string Caption { get; set; }
 
-        [EditorSequence(4)]
-        [TextBoxEditor(Width = 60, Visible = Visible.Default)]
-        public string Format { get; set; }
+    [EditorSequence(4)]
+    [TextBoxEditor(Width = 60, Visible = Visible.Default)]
+    public string Format { get; set; }
 
-        [EnumLookupEditor(typeof(Alignment), Width = 100, Visible = Visible.Default)]
-        [EditorSequence(5)]
-        public Alignment Alignment { get; set; }
+    [EnumLookupEditor(typeof(Alignment), Width = 100, Visible = Visible.Default)]
+    [EditorSequence(5)]
+    public Alignment Alignment { get; set; }
 
-        public BaseEditor Editor { get; set; }
+    public BaseEditor Editor { get; set; }
 
-        public VerticalAlignment VerticalAlignment() => Alignment.VerticalAlignment();
+    public VerticalAlignment VerticalAlignment() => Alignment.VerticalAlignment();
 
-        public HorizontalAlignment HorizontalAlignment(Type datatype) => Alignment.HorizontalAlignment(datatype);
+    public HorizontalAlignment HorizontalAlignment(Type datatype) => Alignment.HorizontalAlignment(datatype);
 
-        public override string ToString()
+    public override string ToString()
+    {
+        return ColumnName;
+    }
+
+    public static DynamicGridColumn FromCoreGridColumn(CoreGridColumn column)
+    {
+        return new DynamicGridColumn
         {
-            return ColumnName;
-        }
+            ColumnName = column.Property.Name,
+            Width = column.Width,
+            Caption = column.Caption,
+            Format = column.Format,
+            Alignment = column.Alignment,
+            Editor = column.Editor.CloneEditor()
+        };
     }
 }

+ 24 - 12
inabox.wpf/DynamicGrid/DynamicGridColumns.cs

@@ -15,28 +15,40 @@ public class DynamicGridColumns : List<DynamicGridColumn>, IGlobalConfigurationS
 
     public DynamicGridColumns ExtractColumns(Type type)
     {
-        if (!_columnscache.ContainsKey(type))
+        if (!_columnscache.TryGetValue(type, out List<DynamicGridColumn>? value))
         {
-            _columnscache[type] = new List<DynamicGridColumn>();
+            value = [];
+            _columnscache[type] = value;
+
+            var defaults = DefaultColumns.GetDefaultColumns(type);
+
             var properties = DatabaseSchema.Properties(type).OrderBy(x => x.Sequence);
             foreach (var prop in properties)
             {
                 if ((prop.Editor != null && !(prop.Editor is NullEditor)) || prop.Required)
                 {
-                    var col = new DynamicGridColumn
+                    var defaultCol = defaults.FirstOrDefault(x => x.Property == prop);
+                    if(defaultCol is not null)
+                    {
+                        value.Add(DynamicGridColumn.FromCoreGridColumn(defaultCol));
+                    }
+                    else
                     {
-                        ColumnName = prop.Name,
-                        Width = prop.Editor.Width,
-                        Alignment = prop.Editor.Alignment,
-                        Format = prop.Editor.Format,
-                        Editor = prop.Editor.CloneEditor(),
-                        Caption = prop.Caption
-                    };
-                    _columnscache[type].Add(col);
+                        var col = new DynamicGridColumn
+                        {
+                            ColumnName = prop.Name,
+                            Width = prop.Editor.Width,
+                            Alignment = prop.Editor.Alignment,
+                            Format = prop.Editor.Format,
+                            Editor = prop.Editor.CloneEditor(),
+                            Caption = prop.Caption
+                        };
+                        value.Add(col);
+                    }
                 }
             }
         }
-        AddRange(_columnscache[type]);
+        AddRange(value);
 
         return this;
     }