Browse Source

Added DynamicGridColumn WidthUnit Type

Kenric Nugteren 1 week ago
parent
commit
83febc9635

+ 1 - 0
inabox.wpf/DynamicGrid/DynamicGridColumn/DynamicColumnGrid.cs

@@ -116,6 +116,7 @@ public class DynamicColumnGrid : DynamicGrid<DynamicGridColumn>
                 CoreUtils.MonitorChanges(item, () =>
                 {
                     item.Width = newCol.Width;
+                    item.WidthUnit = newCol.WidthUnit;
                     item.Alignment = newCol.Alignment;
                     item.Format = newCol.Format;
                     item.Editor = newCol.Editor.CloneEditor();

+ 17 - 2
inabox.wpf/DynamicGrid/DynamicGridColumn/DynamicGridColumn.cs

@@ -7,6 +7,12 @@ using InABox.Core;
 
 namespace InABox.DynamicGrid;
 
+public enum DynamicGridColumnWidthUnitType
+{
+    Pixel,
+    Star
+}
+
 public class ColumnNameGenerator : LookupGenerator<object>
 {
     public ColumnNameGenerator(object[] items) : base(items)
@@ -41,6 +47,7 @@ public class DynamicGridColumn : DynamicColumnBase
     {
         ColumnName = property.Name;
         Width = property.Editor.Width;
+        WidthUnit = DynamicGridColumnWidthUnitType.Pixel;
         Alignment = property.Editor.Alignment;
         Format = property.Editor.Format;
         Editor = property.Editor.CloneEditor();
@@ -50,6 +57,7 @@ public class DynamicGridColumn : DynamicColumnBase
     {
         ColumnName = column.ColumnName;
         Width = column.Width;
+        WidthUnit = column.WidthUnit;
         Caption = column.Caption;
         Format = column.Format;
         Alignment = column.Alignment;
@@ -59,6 +67,7 @@ public class DynamicGridColumn : DynamicColumnBase
     {
         ColumnName = column.Property.Name;
         Width = column.Width;
+        WidthUnit = DynamicGridColumnWidthUnitType.Pixel;
         Caption = column.Caption;
         Format = column.Format;
         Alignment = column.Alignment;
@@ -71,6 +80,7 @@ public class DynamicGridColumn : DynamicColumnBase
         ColumnName = column;
         
         Width = editor.Width;
+        WidthUnit = DynamicGridColumnWidthUnitType.Pixel;
         Caption = editor.Caption;
         Format = editor.Format;
         Alignment = editor.Alignment;
@@ -86,15 +96,19 @@ public class DynamicGridColumn : DynamicColumnBase
     public int Width { get; set; }
 
     [EditorSequence(3)]
+    [EnumLookupEditor(typeof(DynamicGridColumnWidthUnitType))]
+    public DynamicGridColumnWidthUnitType WidthUnit { get; set; }
+
+    [EditorSequence(4)]
     [TextBoxEditor(Visible = Visible.Default)]
     public string Caption { get; set; }
 
-    [EditorSequence(4)]
+    [EditorSequence(5)]
     [TextBoxEditor(Width = 60, Visible = Visible.Default)]
     public string Format { get; set; }
 
     [EnumLookupEditor(typeof(Alignment), Width = 100, Visible = Visible.Default)]
-    [EditorSequence(5)]
+    [EditorSequence(6)]
     public Alignment Alignment { get; set; }
 
     [DoNotSerialize]
@@ -133,6 +147,7 @@ public class DynamicGridColumn : DynamicColumnBase
         {
             ColumnName = column.ColumnName,
             Width = editor.Width,
+            WidthUnit = DynamicGridColumnWidthUnitType.Pixel,
             Caption = editor.Caption,
             Format = editor.Format,
             Alignment = editor.Alignment,

+ 19 - 12
inabox.wpf/DynamicGrid/DynamicGridColumn/DynamicGridColumns.cs

@@ -64,13 +64,15 @@ public class DynamicGridColumns : List<DynamicGridColumn>, IGlobalConfigurationS
         int? width = null,
         string? caption = null,
         string? format = null,
-        Alignment? alignment = null)
+        Alignment? alignment = null,
+        DynamicGridColumnWidthUnitType? widthUnit = null)
     {
         var prop = DatabaseSchema.Property(member);
         var col = new DynamicGridColumn
         {
             ColumnName = prop.Name,
             Width = width ?? prop.Editor.Width,
+            WidthUnit = widthUnit ?? DynamicGridColumnWidthUnitType.Pixel,
             Alignment = alignment ?? prop.Editor.Alignment,
             Format = format ?? prop.Editor.Format,
             Editor = prop.Editor.CloneEditor(),
@@ -84,10 +86,11 @@ public class DynamicGridColumns : List<DynamicGridColumn>, IGlobalConfigurationS
         int? width = null,
         string? caption = null,
         string? format = null,
-        Alignment? alignment = null
+        Alignment? alignment = null,
+        DynamicGridColumnWidthUnitType? widthUnit = null
     )
     {
-        var col = CreateColumn(member, width: width, caption: caption, format: format, alignment: alignment);
+        var col = CreateColumn(member, width: width, widthUnit: widthUnit, caption: caption, format: format, alignment: alignment);
         Add(col);
         return col;
     }
@@ -98,10 +101,11 @@ public class DynamicGridColumns : List<DynamicGridColumn>, IGlobalConfigurationS
         int? width = null,
         string? caption = null,
         string? format = null,
-        Alignment? alignment = null
+        Alignment? alignment = null,
+        DynamicGridColumnWidthUnitType? widthUnit = null
     )
     {
-        var col = CreateColumn(member, width: width, caption: caption, format: format, alignment: alignment);
+        var col = CreateColumn(member, width: width, widthUnit: widthUnit, caption: caption, format: format, alignment: alignment);
         Insert(index,col);
         return col;
     }
@@ -111,10 +115,11 @@ public class DynamicGridColumns : List<DynamicGridColumn>, IGlobalConfigurationS
         int? width = null,
         string? caption = null,
         string? format = null,
-        Alignment? alignment = null
+        Alignment? alignment = null,
+        DynamicGridColumnWidthUnitType? widthUnit = null
     )
     {
-        Add(member, width: width, caption: caption, format: format, alignment: alignment);
+        Add(member, width: width, widthUnit: widthUnit, caption: caption, format: format, alignment: alignment);
         return this;
     }
 }
@@ -123,17 +128,18 @@ public class DynamicGridColumns<T> : DynamicGridColumns
 {
     public DynamicGridColumn Add(Expression<Func<T, object?>> member, int width, string caption, string format, Alignment alignment)
     {
-        return Add<T>(member, width, caption, format, alignment);
+        return Add<T>(member, width, caption, format, alignment, null);
     }
     public DynamicGridColumn Add(
         Expression<Func<T, object?>> member,
         int? width = null,
         string? caption = null,
         string? format = null,
-        Alignment? alignment = null
+        Alignment? alignment = null,
+        DynamicGridColumnWidthUnitType? widthUnit = null
     )
     {
-        var col = CreateColumn(member, width: width, caption: caption, format: format, alignment: alignment);
+        var col = CreateColumn(member, width: width, widthUnit: widthUnit, caption: caption, format: format, alignment: alignment);
         Add(col);
         return col;
     }
@@ -142,10 +148,11 @@ public class DynamicGridColumns<T> : DynamicGridColumns
         int? width = null,
         string? caption = null,
         string? format = null,
-        Alignment? alignment = null
+        Alignment? alignment = null,
+        DynamicGridColumnWidthUnitType? widthUnit = null
     )
     {
-        Add(member, width: width, caption: caption, format: format, alignment: alignment);
+        Add(member, width: width, widthUnit: widthUnit, caption: caption, format: format, alignment: alignment);
         return this;
     }
 }

+ 6 - 2
inabox.wpf/DynamicGrid/UIComponent/DynamicGridTreeUIComponent.cs

@@ -1535,6 +1535,11 @@ public class DynamicGridTreeUIComponent<T, TKey> : IDynamicGridUIComponent<T>, I
         {
             return 50;
         }
+
+        public DynamicGridColumnWidthUnitType GetWidthUnit(IDynamicGridGridUIComponent component)
+        {
+            return DynamicGridColumnWidthUnitType.Pixel;
+        }
     }
 
     private void LoadNumberColumn()
@@ -1680,8 +1685,7 @@ public class DynamicGridTreeUIComponent<T, TKey> : IDynamicGridUIComponent<T>, I
 
         grid.Dispatcher.BeginInvoke(() =>
         {
-            var sizes = this.CalculateColumnSizes(width);
-            foreach (var (index, size) in sizes)
+            foreach (var (index, size) in this.CalculateColumnSizes(width))
             {
                 var colSize = Math.Max(0.0F, size);
                 _tree.Columns[index].Width = colSize;

+ 42 - 14
inabox.wpf/DynamicGrid/UIComponent/IDynamicGridGridUIComponent.cs

@@ -18,6 +18,8 @@ namespace InABox.DynamicGrid;
 public interface IDynamicGridUIComponentColumn
 {
     double GetWidth(IDynamicGridGridUIComponent component);
+
+    DynamicGridColumnWidthUnitType GetWidthUnit(IDynamicGridGridUIComponent component);
 }
 public class DynamicGridColumnUIComponentColumn(DynamicColumnBase column) : IDynamicGridUIComponentColumn
 {
@@ -42,6 +44,26 @@ public class DynamicGridColumnUIComponentColumn(DynamicColumnBase column) : IDyn
             return 0;
         }
     }
+
+    public DynamicGridColumnWidthUnitType GetWidthUnit(IDynamicGridGridUIComponent component)
+    {
+        if (Column is DynamicImageColumn dic)
+        {
+            return DynamicGridColumnWidthUnitType.Pixel;
+        }
+        else if (Column is DynamicActionColumn dac)
+        {
+            return DynamicGridColumnWidthUnitType.Pixel;
+        }
+        else if (Column is DynamicGridColumn dgc)
+        {
+            return dgc.Width == 0 ? DynamicGridColumnWidthUnitType.Star : dgc.WidthUnit;
+        }
+        else
+        {
+            return 0;
+        }
+    }
 }
 
 public interface IDynamicGridGridUIComponent
@@ -53,7 +75,7 @@ public interface IDynamicGridGridUIComponent
 
 internal static class DynamicGridGridUIComponentExtension
 {
-    public static Dictionary<int, double> CalculateColumnSizes(this IDynamicGridGridUIComponent component, double width, bool manualautosize = true)
+    public static IEnumerable<KeyValuePair<int, double>> CalculateColumnSizes(this IDynamicGridGridUIComponent component, double width, bool manualautosize = true)
     {
         var fAvailWidth = width - (SystemParameters.VerticalScrollBarWidth);
         
@@ -62,32 +84,38 @@ internal static class DynamicGridGridUIComponentExtension
         //    fAvailWidth -= (SystemParameters.VerticalScrollBarWidth + 0.75);
 
 
-        double fCurWidth = 0.0F;
-        var NumAutoCols = 0;
+        var fCurWidth = 0.0;
+        var autoColumnTotal = 0.0;
 
-        var colWidths = new Dictionary<int, double>();
+        var colWidths = new double[component.ColumnList.Count];
+        var units = new DynamicGridColumnWidthUnitType[component.ColumnList.Count];
         for (var i = 0; i < component.ColumnList.Count; i++)
         {
             var col = component.ColumnList[i];
+            var unit = col.GetWidthUnit(component);
             var colWidth = col.GetWidth(component);
+            if(unit == DynamicGridColumnWidthUnitType.Star && colWidth == 0)
+            {
+                colWidth = 1;
+            }
             colWidths[i] = colWidth;
-            if (colWidth != 0)
-                fCurWidth += Math.Max(0.0F, colWidths[i]);
+            units[i] = unit;
+
+            if (unit != DynamicGridColumnWidthUnitType.Star)
+                fCurWidth += Math.Max(0.0F, colWidth);
             else
-                NumAutoCols++;
+                autoColumnTotal += colWidth;
         }
 
-        if (manualautosize && NumAutoCols > 0)
+        if (manualautosize && autoColumnTotal > 0)
         {
-            var fAutoWidth = (fAvailWidth - fCurWidth) / NumAutoCols;
-            if (fAutoWidth < 100)
-                fAutoWidth = 100;
+            var fAutoWidth = (fAvailWidth - fCurWidth) / autoColumnTotal;
             for (var i = 0; i < component.ColumnList.Count; i++)
-                if (colWidths[i] == 0)
-                    colWidths[i] = fAutoWidth;
+                if (units[i] == DynamicGridColumnWidthUnitType.Star)
+                    colWidths[i] = Math.Max(fAutoWidth * colWidths[i], 100);
         }
 
-        return colWidths;
+        return colWidths.WithIndex();
     }
 
     public static int DesiredWidth(this IDynamicGridGridUIComponent component)