Procházet zdrojové kódy

Direct Edit swap modes and DynamicGridSettings class

Kenric Nugteren před 1 rokem
rodič
revize
8af328320e

+ 2 - 1
inabox.wpf/DynamicGrid/BaseDynamicGrid.cs

@@ -124,7 +124,8 @@ namespace InABox.DynamicGrid
             OnReconfigure += onReconfigure;
             Reconfigure();
         }
-        public bool HasOption(DynamicGridOption option) => Options.Contains(option);
+        public bool HasOption(DynamicGridOption option, IEnumerable<DynamicGridOption>? options = null) => (options ?? Options).Contains(option);
+        bool IDynamicGrid.HasOption(InABox.DynamicGrid.DynamicGridOption option) => HasOption(option, null);
 
         public List<Expression<Func<T, object?>>> HiddenColumns { get; }
 

+ 21 - 1
inabox.wpf/DynamicGrid/DynamicDataGrid.cs

@@ -450,6 +450,26 @@ namespace InABox.DynamicGrid
             return new NullEditor();
         }
 
+        protected override DynamicGridSettings LoadSettings()
+        {
+            var tag = GetTag();
+
+            var user = Task.Run(() => new UserConfiguration<DynamicGridSettings>(tag).Load());
+            user.Wait();
+
+            //var global = Task.Run(() => new GlobalConfiguration<DynamicGridSettings>(tag).Load());
+            //global.Wait();
+            //Task.WaitAll(user, global);
+            //var columns = user.Result.Any() ? user.Result : global.Result;
+
+            return user.Result;
+        }
+        protected override void SaveSettings(DynamicGridSettings settings)
+        {
+            var tag = GetTag();
+            new UserConfiguration<DynamicGridSettings>(tag).Save(settings);
+        }
+
         protected override DynamicGridColumns LoadColumns()
         {
             var tag = GetTag();
@@ -501,7 +521,7 @@ namespace InABox.DynamicGrid
         /// <param name="columns"></param>
         protected virtual void GenerateColumns(DynamicGridColumns columns)
         {
-            var cols = new Columns<TEntity>().Default(HasOption(DynamicGridOption.DirectEdit)
+            var cols = new Columns<TEntity>().Default(IsDirectEditMode()
                 ? new[] { ColumnType.IncludeForeignKeys, ColumnType.ExcludeID }
                 : new ColumnType[] {
                     ColumnType.IncludeLinked, ColumnType.IncludeNestedLinks, ColumnType.IncludeFormulae,

+ 6 - 3
inabox.wpf/DynamicGrid/DynamicEditorForm/EmbeddedDynamicEditorForm.xaml.cs

@@ -369,10 +369,13 @@ namespace InABox.DynamicGrid
                 page.AfterSave(Items.First());
         }
 
-        private Dictionary<string, object?>? Editor_OnAfterEditorValueChanged(DynamicEditorGrid sender, string columnname)
+        private Dictionary<string, object?>? Editor_OnAfterEditorValueChanged(DynamicEditorGrid sender, AfterEditorValueChangedArgs args)
         {
-            DoChanged();
-            return OnAfterEditorValueChanged?.Invoke(sender, columnname);
+            if(args.ChangedValues.Count > 0)
+            {
+                DoChanged();
+            }
+            return OnAfterEditorValueChanged?.Invoke(sender, args);
         }
 
         private void Editor_OnReconfigureEditors(DynamicEditorGrid sender)

+ 1 - 1
inabox.wpf/DynamicGrid/DynamicEditorGrid.xaml.cs

@@ -385,7 +385,7 @@ namespace InABox.DynamicGrid
                     ExtractChanged(changedcolumns);
                 }
 
-                var afterchanged = EditorGrid.OnAfterEditorValueChanged?.Invoke(EditorGrid, sender.ColumnName);
+                var afterchanged = EditorGrid.OnAfterEditorValueChanged?.Invoke(EditorGrid, new AfterEditorValueChangedArgs(sender.ColumnName, changededitors));
                 ExtractChanged(afterchanged);
 
                 if (changededitors.Any())

+ 59 - 20
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -355,6 +355,7 @@ namespace InABox.DynamicGrid
         private readonly Button Export;
         private readonly Label ExportSpacer;
         private readonly Button DuplicateBtn;
+        private readonly Button SwitchViewBtn;
 
         private readonly GridRowSizingOptions gridRowResizingOptions = new() { CanIncludeHiddenColumns = false, AutoFitMode = AutoFitMode.SmartFit };
         private readonly Button Help;
@@ -428,6 +429,8 @@ namespace InABox.DynamicGrid
         protected virtual FontStyle? GetCellFontStyle(CoreRow row, String columnname) => null;
         protected virtual FontWeight? GetCellFontWeight(CoreRow row, String columnname) => null;
 
+        protected DynamicGridSettings Settings { get; set; }
+
         public DynamicGrid() : base()
         {
             IsReady = false;
@@ -579,6 +582,10 @@ namespace InABox.DynamicGrid
             Edit.Margin = new Thickness(0, 2, 2, 0);
             Edit.Click += Edit_Click;
 
+            SwitchViewBtn = CreateButton(Wpf.Resources.alter.AsBitmapImage());
+            SwitchViewBtn.Margin = new Thickness(0, 2, 2, 0);
+            SwitchViewBtn.Click += SwitchView_Click;
+
             EditSpacer = new Label { Width = 5 };
 
             Print = CreateButton(Wpf.Resources.print.AsBitmapImage(Color.White));
@@ -618,6 +625,7 @@ namespace InABox.DynamicGrid
             LeftButtonStack.Children.Add(Help);
             LeftButtonStack.Children.Add(Add);
             LeftButtonStack.Children.Add(Edit);
+            LeftButtonStack.Children.Add(SwitchViewBtn);
             //Stack.Children.Add(MultiEdit);
             LeftButtonStack.Children.Add(EditSpacer);
 
@@ -691,11 +699,13 @@ namespace InABox.DynamicGrid
                     ? Visibility.Collapsed
                     : Visibility.Visible;
             };
+
+            Settings = LoadSettings();
             
             Init();
             Reconfigure();
         }
-        
+
         protected virtual void BeforeSelection(CancelEventArgs cancel)
         {
             OnBeforeSelection?.Invoke(cancel);
@@ -780,7 +790,9 @@ namespace InABox.DynamicGrid
                 ? Visibility.Visible
                 : Visibility.Collapsed;
 
-            var allowEditing = HasOption(DynamicGridOption.DirectEdit);
+            SwitchViewBtn.Visibility = HasOption(DynamicGridOption.DirectEdit) ? Visibility.Visible : Visibility.Collapsed;
+            var allowEditing = IsDirectEditMode();
+
             if (DataGrid.AllowEditing != allowEditing)
             {
                 DataGrid.NavigationMode = allowEditing ? NavigationMode.Cell : NavigationMode.Row;
@@ -828,6 +840,33 @@ namespace InABox.DynamicGrid
             }
         }
 
+        protected virtual DynamicGridSettings LoadSettings()
+        {
+            return new DynamicGridSettings();
+        }
+        protected virtual void SaveSettings(DynamicGridSettings settings)
+        {
+        }
+
+        public bool IsDirectEditMode(IEnumerable<DynamicGridOption>? options = null)
+        {
+            return HasOption(DynamicGridOption.DirectEdit, options)
+                && (Settings.ViewMode == DynamicGridSettings.DynamicGridViewMode.DirectEdit
+                    || Settings.ViewMode == DynamicGridSettings.DynamicGridViewMode.Default);
+        }
+
+        private void SwitchView_Click(object sender, RoutedEventArgs e)
+        {
+            Settings.ViewMode = Settings.ViewMode switch
+            {
+                DynamicGridSettings.DynamicGridViewMode.Default => DynamicGridSettings.DynamicGridViewMode.Normal,
+                DynamicGridSettings.DynamicGridViewMode.Normal => DynamicGridSettings.DynamicGridViewMode.DirectEdit,
+                DynamicGridSettings.DynamicGridViewMode.DirectEdit or _ => DynamicGridSettings.DynamicGridViewMode.Normal
+            };
+            SaveSettings(Settings);
+            Reconfigure();
+        }
+
         protected override DynamicGridRowStyleSelector<T> GetRowStyleSelector()
         {
             return new DynamicGridRowStyleSelector<T, DynamicGridRowStyle>();
@@ -857,7 +896,7 @@ namespace InABox.DynamicGrid
 
         private void DataGrid_CurrentCellActivated(object? sender, CurrentCellActivatedEventArgs e)
         {
-            if (!HasOption(DynamicGridOption.DirectEdit))
+            if (!IsDirectEditMode())
                 return;
             if ((DataGrid.SelectionController.CurrentCellManager.CurrentCell?.IsEditing != true) && e.ActivationTrigger == ActivationTrigger.Keyboard)
                 DataGrid.SelectionController.CurrentCellManager.BeginEdit();
@@ -872,7 +911,7 @@ namespace InABox.DynamicGrid
             }
             else if (e.Key == Key.Tab)
             {
-                if (HasOption(DynamicGridOption.DirectEdit))
+                if (IsDirectEditMode())
                 {
                     DataGrid.SelectionController.CurrentCellManager.EndEdit();
                     DataGrid.MoveFocus(new TraversalRequest(FocusNavigationDirection.Right));
@@ -1423,7 +1462,7 @@ namespace InABox.DynamicGrid
 
         protected virtual void DoDoubleClick(object sender)
         {
-            if (HasOption(DynamicGridOption.DirectEdit))
+            if (IsDirectEditMode())
                 return;
 
             SelectItems(SelectedRows);
@@ -1462,7 +1501,7 @@ namespace InABox.DynamicGrid
         {
             var result = new DynamicGridColumns();
 
-            var cols = HasOption(DynamicGridOption.DirectEdit)
+            var cols = IsDirectEditMode()
                 ? new Columns<T>().Default(ColumnType.IncludeForeignKeys, ColumnType.ExcludeID)
                 : new Columns<T>().Default(ColumnType.IncludeLinked, ColumnType.ExcludeID);
             result.AddRange(MasterColumns.Where(x => cols.Items.Any(c => c.Property.Equals(x.ColumnName)))
@@ -1864,7 +1903,7 @@ namespace InABox.DynamicGrid
                     }
                     else if (prop.PropertyType == typeof(bool))
                     {
-                        if (HasOption(DynamicGridOption.DirectEdit))
+                        if (IsDirectEditMode())
                         {
                             var checkcol = new GridCheckBoxColumn
                             {
@@ -1937,7 +1976,7 @@ namespace InABox.DynamicGrid
                                     binding.Bindings.Add(new Binding(displaycol));
                                 binding.Converter = new PopupConverter(lookupcolumns, pEditor.Type);
                                 result.SetBinding(Label.ContentProperty, binding);
-                                result.Background = new SolidColorBrush(Colors.LightYellow);
+                                //result.Background = new SolidColorBrush(Colors.WhiteSmoke);
                                 return result;
                             }
                         );
@@ -1946,7 +1985,7 @@ namespace InABox.DynamicGrid
                             () =>
                             {
                                 var result = new DockPanel();
-                                if (HasOption(DynamicGridOption.DirectEdit))
+                                if (IsDirectEditMode())
                                 {
                                     var button = new Button();
                                     button.Content = "..";
@@ -2003,7 +2042,7 @@ namespace InABox.DynamicGrid
                                 binding.Converter = new PopupConverter(lookupcolumns, pEditor.Type);
                                 label.SetBinding(Label.ContentProperty, binding);
                                 label.SetValue(DockPanel.DockProperty, Dock.Left);
-                                label.Background = new SolidColorBrush(Colors.LightYellow);
+                                //label.Background = new SolidColorBrush(Colors.LightYellow);
                                 result.Children.Add(label);
                                 return result;
                             }
@@ -2054,7 +2093,7 @@ namespace InABox.DynamicGrid
                         newcol = textcol;
                         if (prop.PropertyType == typeof(string[]))
                             newcol.DisplayBinding = new Binding { Path = new PropertyPath(scolname), Converter = new StringArrayConverter() };
-                        textcol.AllowEditing = HasOption(DynamicGridOption.DirectEdit);
+                        textcol.AllowEditing = IsDirectEditMode();
                         textcol.UpdateTrigger = UpdateSourceTrigger.PropertyChanged;
                     }
 
@@ -2093,7 +2132,7 @@ namespace InABox.DynamicGrid
                     newcol.HeaderStyle = headstyle;
 
                     var cellstyle = new Style();
-                    if (HasOption(DynamicGridOption.DirectEdit))
+                    if (IsDirectEditMode())
                     {
                         if (prop.Editor is null || !prop.Editor.Editable.IsDirectEditable())
                         {
@@ -2464,7 +2503,7 @@ namespace InABox.DynamicGrid
                 if (!result.Columns.Contains(colname))
                 {
                     result.Columns.Add(colname, column.DataType);
-                    if (!HasOption(DynamicGridOption.DirectEdit))
+                    if (!IsDirectEditMode())
                         defaults.Add(column.DataType.GetDefault());
                 }
             }
@@ -2780,7 +2819,7 @@ namespace InABox.DynamicGrid
         {
             //CoreRow row = (SelectedRow > -1) && (SelectedRow < Data.Rows.Count) ?  Data.Rows[this.SelectedRow] : null;
 
-            if (HasOption(DynamicGridOption.DirectEdit) && !OpenEditorOnDirectEdit)
+            if (IsDirectEditMode() && !OpenEditorOnDirectEdit)
             {
                 if (!CanCreateItems())
                     return;
@@ -2882,7 +2921,7 @@ namespace InABox.DynamicGrid
 
             editor.OnEditorValueChanged += (s, n, v) => EditorValueChanged(editor, items, n, v);
 
-            editor.OnAfterEditorValueChanged += (g, n) => AfterEditorValueChanged(g, items, n);
+            editor.OnAfterEditorValueChanged += (g, args) => AfterEditorValueChanged(g, items, args);
 
             editor.OnReconfigureEditors = g => DoReconfigureEditors(g, items);
 
@@ -2946,14 +2985,14 @@ namespace InABox.DynamicGrid
             return editor.ShowDialog() == true;
         }
 
-        private Dictionary<String, object?> AfterEditorValueChanged(DynamicEditorGrid grid, T[] items, String columnnname)
+        private Dictionary<String, object?> AfterEditorValueChanged(DynamicEditorGrid grid, T[] items, AfterEditorValueChangedArgs args)
         {
-            var changes = new Dictionary<String, object?>();
-            OnAfterEditorValueChanged(grid, items, columnnname, changes);
+            var changes = new Dictionary<string, object?>();
+            OnAfterEditorValueChanged(grid, items, args, changes);
             return changes;
         }
 
-        protected virtual void OnAfterEditorValueChanged(DynamicEditorGrid grid, T[] items, String columnname, Dictionary<String, object?> changes)
+        protected virtual void OnAfterEditorValueChanged(DynamicEditorGrid grid, T[] items, AfterEditorValueChangedArgs args, Dictionary<String, object?> changes)
         {
         }
         
@@ -3637,7 +3676,7 @@ namespace InABox.DynamicGrid
         private void SelectColumnsClick(object sender, RoutedEventArgs e)
         {
             var editor = new DynamicGridColumnsEditor(typeof(T));
-            editor.DirectEdit = HasOption(DynamicGridOption.DirectEdit);
+            editor.DirectEdit = IsDirectEditMode();
 
             editor.Columns.AddRange(VisibleColumns);
 

+ 14 - 1
inabox.wpf/DynamicGrid/DynamicGridCommon.cs

@@ -50,8 +50,21 @@ namespace InABox.DynamicGrid
     public delegate void OnCustomiseEditor<T>(IDynamicEditorForm sender, T[]? items, DynamicGridColumn column, BaseEditor editor);
 
     public delegate void OnReconfigureEditors(DynamicEditorGrid sender);
+
+    public class AfterEditorValueChangedArgs
+    {
+        public string ColumnName { get; set; }
+
+        public Dictionary<string, object?> ChangedValues { get; set; }
+
+        public AfterEditorValueChangedArgs(string columnName, Dictionary<string, object?> changedValues)
+        {
+            ColumnName = columnName;
+            ChangedValues = changedValues;
+        }
+    }
     
-    public delegate Dictionary<String,object?>? OnAfterEditorValueChanged(DynamicEditorGrid sender, String columnname);
+    public delegate Dictionary<string, object?>? OnAfterEditorValueChanged(DynamicEditorGrid sender, AfterEditorValueChangedArgs args);
 
     //public delegate void OnGridChanged(IDynamicGrid sender);
 

+ 29 - 0
inabox.wpf/DynamicGrid/DynamicGridSettings.cs

@@ -0,0 +1,29 @@
+using InABox.Configuration;
+using InABox.Core;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace InABox.DynamicGrid
+{
+    public class DynamicGridSettings : BaseObject, IUserConfigurationSettings, IGlobalConfigurationSettings
+    {
+        public enum DynamicGridViewMode
+        {
+            Default,
+            Normal,
+            DirectEdit
+        }
+
+        public DynamicGridViewMode ViewMode { get; set; }
+
+        protected override void Init()
+        {
+            base.Init();
+
+            ViewMode = DynamicGridViewMode.Default;
+        }
+    }
+}

+ 27 - 2
inabox.wpf/DynamicGrid/DynamicManyToManyGrid.cs

@@ -174,9 +174,14 @@ namespace InABox.DynamicGrid
         private Type OtherType() =>
             CoreUtils.GetManyToManyOtherType(typeof(TManyToMany), typeof(TThis));
 
+        private string GetTag()
+        {
+            return typeof(TManyToMany).Name + "." + typeof(TThis).Name;
+        }
+
         protected override DynamicGridColumns LoadColumns()
         {
-            var tag = typeof(TManyToMany).Name + "." + typeof(TThis).Name;
+            var tag = GetTag();
             var global = Task.Run(() => new GlobalConfiguration<DynamicGridColumns>(tag).Load());
             var user = Task.Run(() => new UserConfiguration<DynamicGridColumns>(tag).Load());
             Task.WaitAll(global, user);
@@ -188,10 +193,30 @@ namespace InABox.DynamicGrid
 
         protected override void SaveColumns(DynamicGridColumns columns)
         {
-            var tag = typeof(TManyToMany).Name + "." + typeof(TThis).Name;
+            var tag = GetTag();
             new UserConfiguration<DynamicGridColumns>(tag).Save(columns);
         }
 
+        protected override DynamicGridSettings LoadSettings()
+        {
+            var tag = GetTag();
+
+            var user = Task.Run(() => new UserConfiguration<DynamicGridSettings>(tag).Load());
+            user.Wait();
+
+            //var global = Task.Run(() => new GlobalConfiguration<DynamicGridSettings>(tag).Load());
+            //global.Wait();
+            //Task.WaitAll(user, global);
+            //var columns = user.Result.Any() ? user.Result : global.Result;
+
+            return user.Result;
+        }
+        protected override void SaveSettings(DynamicGridSettings settings)
+        {
+            var tag = GetTag();
+            new UserConfiguration<DynamicGridSettings>(tag).Save(settings);
+        }
+
         protected virtual Guid[] CurrentGuids()
         {
             var result = new List<Guid>();

+ 26 - 3
inabox.wpf/DynamicGrid/DynamicOneToManyGrid.cs

@@ -207,10 +207,14 @@ namespace InABox.DynamicGrid
             Items.AddRange(items);
             Refresh(false, true);
         }
+        private string GetTag()
+        {
+            return typeof(TOne).Name + "." + typeof(TMany).Name;
+        }
 
         protected override DynamicGridColumns LoadColumns()
         {
-            var tag = typeof(TOne).Name + "." + typeof(TMany).Name;
+            var tag = GetTag();
             var global = Task.Run(() => new GlobalConfiguration<DynamicGridColumns>(tag).Load());
             var user = Task.Run(() => new UserConfiguration<DynamicGridColumns>(tag).Load());
             Task.WaitAll(global, user);
@@ -222,10 +226,30 @@ namespace InABox.DynamicGrid
 
         protected override void SaveColumns(DynamicGridColumns columns)
         {
-            var tag = typeof(TOne).Name + "." + typeof(TMany).Name;
+            var tag = GetTag();
             new UserConfiguration<DynamicGridColumns>(tag).Save(columns);
         }
 
+        protected override DynamicGridSettings LoadSettings()
+        {
+            var tag = GetTag();
+
+            var user = Task.Run(() => new UserConfiguration<DynamicGridSettings>(tag).Load());
+            user.Wait();
+
+            //var global = Task.Run(() => new GlobalConfiguration<DynamicGridSettings>(tag).Load());
+            //global.Wait();
+            //Task.WaitAll(user, global);
+            //var columns = user.Result.Any() ? user.Result : global.Result;
+
+            return user.Result;
+        }
+        protected override void SaveSettings(DynamicGridSettings settings)
+        {
+            var tag = GetTag();
+            new UserConfiguration<DynamicGridSettings>(tag).Save(settings);
+        }
+
         protected override TMany CreateItem()
         {
             var result = new TMany();
@@ -250,7 +274,6 @@ namespace InABox.DynamicGrid
 
         public override void SaveItem(TMany item)
         {
-            
             if (!Items.Contains(item))
                 Items.Add(item);
 

+ 1 - 0
inabox.wpf/DynamicGrid/IDynamicGrid.cs

@@ -2,6 +2,7 @@
 //#define newgrid
 
 using System;
+using System.Collections.Generic;
 using System.Linq.Expressions;
 using System.Windows;
 using System.Windows.Controls;

+ 4 - 0
inabox.wpf/InABox.Wpf.csproj

@@ -26,6 +26,7 @@
         <None Remove="Resources\AlignTextJustify16.png" />
         <None Remove="Resources\AlignTextLeft16.png" />
         <None Remove="Resources\AlignTextRight16.png" />
+        <None Remove="Resources\alter.png" />
         <None Remove="Resources\back.png" />
         <None Remove="Resources\Bold16.png" />
         <None Remove="Resources\Bullets16.png" />
@@ -159,6 +160,9 @@
       <Resource Include="Resources\AlignTextRight16.png">
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Resource>
+      <Resource Include="Resources\alter.png">
+        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      </Resource>
       <Resource Include="Resources\back.png">
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Resource>

+ 10 - 0
inabox.wpf/Resources.Designer.cs

@@ -110,6 +110,16 @@ namespace InABox.Wpf {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap alter {
+            get {
+                object obj = ResourceManager.GetObject("alter", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>

+ 3 - 0
inabox.wpf/Resources.resx

@@ -133,6 +133,9 @@
   <data name="AlignTextRight16" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>Resources\AlignTextRight16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="alter" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\alter.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="back" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>Resources\back.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>

binární
inabox.wpf/Resources/alter.png