Browse Source

Got DynamicEditorGrid to override old values when changing lookups.

Kenric Nugteren 1 year ago
parent
commit
d833598ce9

+ 6 - 6
InABox.Core/CoreUtils.cs

@@ -2569,18 +2569,18 @@ namespace InABox.Core
         /// <param name="changes">The resulting updated list of changes</param>
         public static void MergeChanges(Dictionary<string, object?> previous, Dictionary<string, object?> current, Dictionary<string, object?> changes)
         {
-            foreach (var key in previous.Keys)
-                if (previous[key] == null)
+            foreach (var (key, prevVal) in previous)
+                if (prevVal is null)
                 {
                     if (current[key] != null)
                         changes[key] = current[key];
                 }
                 else
                 {
-                    if (current[key] == null)
-                        changes[key] = current[key];
-                    else if (!object.Equals(previous[key], current[key]))
-                        changes[key] = current[key];
+                    if (!current.TryGetValue(key, out var curVal) || curVal is null)
+                        changes[key] = null;
+                    else if (!object.Equals(previous[key], curVal))
+                        changes[key] = curVal;
                 }
         }
 

+ 46 - 5
inabox.wpf/DynamicGrid/DynamicEditorGrid.xaml.cs

@@ -138,7 +138,7 @@ namespace InABox.DynamicGrid
         public event GetPropertyValueHandler? OnGetPropertyValue;
         public event SetPropertyValueHandler? OnSetPropertyValue;
 
-        public delegate Dictionary<string, object?> EditorGridValueChangedHandler(DynamicEditorGrid sender, string name, object value);
+        public delegate Dictionary<string, object?> EditorGridValueChangedHandler(DynamicEditorGrid sender, string name, object? value);
         public event EditorGridValueChangedHandler? OnEditorValueChanged;
 
         public event OnAfterEditorValueChanged? OnAfterEditorValueChanged;
@@ -381,12 +381,12 @@ namespace InABox.DynamicGrid
 
             #endregion
 
-            private void EditorValueChanged(IDynamicEditorControl sender, Dictionary<string, object> values)
+            private void EditorValueChanged(IDynamicEditorControl sender, Dictionary<string, object?> values)
             {
                 //Logger.Send(LogType.Information, "", string.Format("DynamicEditorGrid.EditorValueChanged({0})", values.Keys.Count));
                 var changededitors = new Dictionary<string, object?>();
 
-                void ExtractChanged(Dictionary<String, object?>? columns)
+                void ExtractChanged(Dictionary<string, object?>? columns)
                 {
                     if (columns != null)
                         foreach (var (change, value) in columns)
@@ -394,11 +394,52 @@ namespace InABox.DynamicGrid
                                 changededitors[change] = value;
                 }
 
-                foreach (var key in values.Keys)
+                var name = sender.ColumnName;
+                var resetAll = false;
+                if(values.Remove(name, out var value))
                 {
-                    var changedcolumns = EditorGrid.OnEditorValueChanged?.Invoke(EditorGrid, key, values[key]);
+                    var changedcolumns = EditorGrid.OnEditorValueChanged?.Invoke(EditorGrid, name, value);
+
+                    resetAll = changedcolumns?.ContainsKey(name) ?? false;
                     ExtractChanged(changedcolumns);
                 }
+                else
+                {
+
+                }
+
+                foreach (var (key, otherValue) in values)
+                {
+                    var changes = new Dictionary<string, object?>();
+                    if (resetAll)
+                    {
+                        var prop = DatabaseSchema.Property(EditorGrid.UnderlyingType, key);
+                        if(prop is not null)
+                        {
+                            var def = CoreUtils.GetDefault(prop.PropertyType);
+                            var resetChanges = EditorGrid.OnEditorValueChanged?.Invoke(EditorGrid, key, def);
+                            if(resetChanges is not null)
+                            {
+                                changes = resetChanges;
+                            }
+                        }
+                        else
+                        {
+
+                        }
+                    }
+                    var changedOtherColumns = EditorGrid.OnEditorValueChanged?.Invoke(EditorGrid, key, otherValue);
+
+                    if(changedOtherColumns is not null)
+                    {
+                        foreach (var (k, v) in changedOtherColumns)
+                        {
+                            changes[k] = v;
+                        }
+                    }
+
+                    ExtractChanged(changes);
+                }
 
                 var afterchanged = EditorGrid.OnAfterEditorValueChanged?.Invoke(EditorGrid, new AfterEditorValueChangedArgs(sender.ColumnName, changededitors));
                 ExtractChanged(afterchanged);

+ 1 - 3
inabox.wpf/DynamicGrid/DynamicGridUtils.cs

@@ -366,14 +366,12 @@ namespace InABox.DynamicGrid
 
         #region Editor Values
 
-
-
         public static Dictionary<string, object?> UpdateEditorValue(BaseObject[] items, string name, object? value)
         {
             Logger.Send(LogType.Information, "", string.Format("DynamicGridUtils.UpdateEditorValue({0},{1},{2})", items.Length, name, value));
             var sw = new Stopwatch();
 
-            var changes = new Dictionary<String, object?>(); 
+            var changes = new Dictionary<string, object?>(); 
             var props = DatabaseSchema.Properties(items.First().GetType()).ToArray();
             foreach (var item in items)
             {