Prechádzať zdrojové kódy

Added OnChanged() functionality for EmbeddedEditorForms
Added semi-transparent overlay for Disabled Grids

frogsoftware 1 rok pred
rodič
commit
4517e75d9e

+ 1 - 1
inabox.wpf/DynamicGrid/DynamicEditorForm/DynamicEditorForm.xaml

@@ -33,5 +33,5 @@
         </local:MyObservableCollection>-->
     </syncfusion:ChromelessWindow.Resources>
 
-    <local:EmbeddedDynamicEditorForm x:Name="Form"/>
+    <local:EmbeddedDynamicEditorForm x:Name="Form" OnChanged="Form_OnOnChanged"/>
 </wpf:ThemableChromelessWindow>

+ 22 - 1
inabox.wpf/DynamicGrid/DynamicEditorForm/DynamicEditorForm.xaml.cs

@@ -9,6 +9,7 @@ using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Forms;
 using System.Windows.Input;
 using System.Windows.Interop;
 using System.Windows.Media;
@@ -18,6 +19,7 @@ using InABox.Wpf;
 using InABox.WPF;
 using Syncfusion.Windows.Shared;
 using Syncfusion.Windows.Tools.Controls;
+using MessageBox = System.Windows.Forms.MessageBox;
 
 namespace InABox.DynamicGrid
 {
@@ -128,7 +130,20 @@ namespace InABox.DynamicGrid
 
         private void Form_OnCancel()
         {
-            DialogResult = false;
+            if (bChanged)
+            {
+                var result = MessageBox.Show("Save Changes?", "Confirm", MessageBoxButtons.YesNoCancel,
+                    MessageBoxIcon.Question);
+                switch (result)
+                {
+                    case System.Windows.Forms.DialogResult.Yes:
+                        DialogResult = true;
+                        break;
+                    case System.Windows.Forms.DialogResult.No:
+                        DialogResult = false;
+                        break;
+                }
+            }
         }
 
         private void Form_OnOK()
@@ -175,5 +190,11 @@ namespace InABox.DynamicGrid
             if (DialogResult == true)
                 Form.SaveItem(e);
         }
+
+        private bool bChanged = false;
+        private void Form_OnOnChanged(object? sender, EventArgs e)
+        {
+            bChanged = true;
+        }
     }
 }

+ 72 - 27
inabox.wpf/DynamicGrid/DynamicEditorForm/EmbeddedDynamicEditorForm.xaml

@@ -5,8 +5,20 @@
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:local="clr-namespace:InABox.DynamicGrid"
              mc:Ignorable="d" 
-             d:DesignHeight="450" d:DesignWidth="800">
-
+             d:DesignHeight="450" d:DesignWidth="800" >
+    <UserControl.Resources>
+        <Style TargetType="{x:Type Button}" x:Key="ButtonStyle">
+            <Style.Triggers>
+                <DataTrigger Binding="{Binding IsEnabled}" Value="True">
+                    <Setter Property="Foreground" Value="Yellow" />
+                </DataTrigger>
+                <DataTrigger Binding="{Binding IsEnabled}" Value="False">
+                    <Setter Property="Foreground" Value="Blue" />
+                </DataTrigger>
+            </Style.Triggers>
+        </Style>
+    </UserControl.Resources>
+    
     <Grid x:Name="LayoutGrid">
 
         <Grid.ColumnDefinitions>
@@ -14,36 +26,69 @@
             <ColumnDefinition Width="80" />
             <ColumnDefinition Width="80" />
         </Grid.ColumnDefinitions>
+        
         <Grid.RowDefinitions>
             <RowDefinition Height="*" />
             <RowDefinition Height="40" x:Name="ButtonRow"/>
         </Grid.RowDefinitions>
 
-        <local:DynamicEditorGrid x:Name="Editor"
-                                 Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Margin="5,5,5,0"
-                                 HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
-                                 OnCustomiseColumns="Editor_OnCustomiseColumns"
-                                 OnDefineFilter="Editor_OnDefineFilter"
-                                 OnEditorCreated="Editor_OnEditorCreated"
-                                 OnSelectPage="Editor_OnSelectPage"
-                                 OnUnloadPage="Editor_OnUnloadPage"
-                                 OnAfterEditorValueChanged="Editor_OnAfterEditorValueChanged"
-                                 OnReconfigureEditors="Editor_OnReconfigureEditors"
-                                 OnGridCustomiseEditor="Editor_OnGridCustomiseEditor"
-                                 OnGetSequence="Editor_OnGetSequence"
-                                 OnEditorValueChanged="Editor_OnEditorValueChanged"
-                                 OnDefineLookups="Editor_OnDefineLookups"
-                                 GetItems="Editor_GetItems"
-                                 OnGetEditor="Editor_OnGetEditor"
-                                 OnGetPropertyValue="Editor_OnGetPropertyValue"
-                                 OnSetPropertyValue="Editor_OnSetPropertyValue"/>
+        <local:DynamicEditorGrid 
+            x:Name="Editor"
+            Grid.Row="0"
+            Grid.Column="0" 
+            Grid.ColumnSpan="3" 
+            Margin="5,5,5,0"
+            HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
+            OnCustomiseColumns="Editor_OnCustomiseColumns"
+            OnDefineFilter="Editor_OnDefineFilter"
+            OnEditorCreated="Editor_OnEditorCreated"
+            OnSelectPage="Editor_OnSelectPage"
+            OnUnloadPage="Editor_OnUnloadPage"
+            OnAfterEditorValueChanged="Editor_OnAfterEditorValueChanged"
+            OnReconfigureEditors="Editor_OnReconfigureEditors"
+            OnGridCustomiseEditor="Editor_OnGridCustomiseEditor"
+            OnGetSequence="Editor_OnGetSequence"
+            OnEditorValueChanged="Editor_OnEditorValueChanged"
+            OnDefineLookups="Editor_OnDefineLookups"
+            GetItems="Editor_GetItems"
+            OnGetEditor="Editor_OnGetEditor"
+            OnGetPropertyValue="Editor_OnGetPropertyValue"
+            OnSetPropertyValue="Editor_OnSetPropertyValue"/>
+
+        <StackPanel 
+            Grid.Row="1" 
+            Grid.Column="0" 
+            HorizontalAlignment="Stretch" 
+            Orientation="Horizontal"
+            x:Name="Buttons"/>
 
-        <StackPanel Grid.Row="1" Grid.Column="0" HorizontalAlignment="Stretch" Orientation="Horizontal"
-                    x:Name="Buttons">
-            <!--<Button x:Name="ShowHelp" Content="Help" HorizontalAlignment="Left" Width="80" Grid.Row="2" Grid.Column="0" Margin="5,5,5,5" Click="ShowHelp_Click"/>-->
-        </StackPanel>
-        <Button x:Name="OKButton" Content="OK" Grid.Row="1" Grid.Column="1" Margin="0,5,5,5" Click="OKButton_Click" />
-        <Button x:Name="CancelButton" Content="Cancel" Grid.Row="1" Grid.Column="2" Margin="0,5,5,5"
-                Click="CancelButton_Click" />
+        <Button 
+            x:Name="OKButton" 
+            Content="OK" 
+            Grid.Row="1"
+            Grid.Column="1" 
+            Margin="0,5,5,5" 
+            Click="OKButton_Click" 
+            IsEnabled="False"
+            BorderBrush="DarkGreen"
+            Background="LimeGreen"
+            Foreground="White"
+            FontWeight="Bold"
+            Style="{StaticResource ButtonStyle}"/>
+        
+        <Button 
+            x:Name="CancelButton" 
+            Content="Cancel" 
+            Grid.Row="1" 
+            Grid.Column="2" 
+            Margin="0,5,5,5" 
+            IsEnabled="False"
+            Click="CancelButton_Click"
+            BorderBrush="Firebrick"
+            Background="Red"
+            Foreground="White"
+            FontWeight="Bold"
+            Style="{StaticResource ButtonStyle}"/>
+        
     </Grid>
 </UserControl>

+ 18 - 2
inabox.wpf/DynamicGrid/DynamicEditorForm/EmbeddedDynamicEditorForm.xaml.cs

@@ -30,7 +30,16 @@ namespace InABox.DynamicGrid
 
         public event OnAfterLoad? OnAfterLoad;
         public void AfterLoad() => OnAfterLoad?.Invoke(this);
-        
+
+        public event EventHandler OnChanged;
+
+        public void DoChanged()
+        {
+            OKButton.IsEnabled = true;
+            CancelButton.IsEnabled = true;
+            OnChanged?.Invoke(this, EventArgs.Empty);
+        }
+
         public delegate void OKEvent();
 
         public delegate void CancelEvent();
@@ -47,6 +56,8 @@ namespace InABox.DynamicGrid
                 _items = value;
                 DynamicEditorFormModel.Slug = Items != null ? Items.Any() ? Items.First().GetType().EntityName().Split('.').Last() : "" : "";
                 Editor.Load(Pages);
+                foreach (var page in Pages)
+                    page.OnChanged += (sender, args) => DoChanged();
             }
         }
 
@@ -55,7 +66,7 @@ namespace InABox.DynamicGrid
             get => Editor.ReadOnly;
             set
             {
-                OKButton.IsEnabled = !value;
+                OKButton.IsEnabled = !value && CancelButton.IsEnabled;
                 Editor.ReadOnly = value;
             }
         }
@@ -272,6 +283,8 @@ namespace InABox.DynamicGrid
                 return;
             }
             OnOK?.Invoke();
+            OKButton.IsEnabled = false;
+            CancelButton.IsEnabled = false;
 
             // Don't Commit the changes here, because we want to refer back to thos changes when we save the item
             // to trigger specific processes in the database
@@ -285,6 +298,8 @@ namespace InABox.DynamicGrid
                 item.CancelChanges();
 
             OnCancel?.Invoke();
+            OKButton.IsEnabled = false;
+            CancelButton.IsEnabled = false;
             //Close();
         }
 
@@ -321,6 +336,7 @@ namespace InABox.DynamicGrid
 
         private Dictionary<string, object?>? Editor_OnAfterEditorValueChanged(DynamicEditorGrid sender, string columnname)
         {
+            DoChanged();
             return OnAfterEditorValueChanged?.Invoke(sender, columnname);
         }
 

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

@@ -321,6 +321,8 @@ namespace InABox.DynamicGrid
             {
             }
 
+            public event EventHandler? OnChanged;
+
             public void BeforeSave(object item)
             {
             }
@@ -453,6 +455,11 @@ namespace InABox.DynamicGrid
                 Ready = true;
             }
 
+            public void DoChanged()
+            {
+                OnChanged?.Invoke(this, EventArgs.Empty);
+            }
+
             public Size MinimumSize() => new Size(800, GeneralHeight);
 
             public int Order() => PageOrder;

+ 3 - 0
inabox.wpf/DynamicGrid/DynamicEditorPage.cs

@@ -28,6 +28,9 @@ namespace InABox.DynamicGrid
 
         void AfterSave(object item);
 
+        event EventHandler OnChanged;
+        void DoChanged();
+
         Size MinimumSize();
 
         string Caption();

+ 33 - 21
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -5,11 +5,9 @@ using System.Collections.ObjectModel;
 using System.ComponentModel;
 using System.Data;
 using System.Diagnostics;
-using System.Drawing;
 using System.Globalization;
 using System.Linq;
 using System.Linq.Expressions;
-using System.Reflection;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
@@ -21,35 +19,25 @@ using System.Windows.Media.Imaging;
 using System.Windows.Threading;
 using InABox.Clients;
 using InABox.Core;
-using InABox.Scripting;
 using InABox.WPF;
 using Syncfusion.Data;
 using Syncfusion.UI.Xaml.Grid;
 using Syncfusion.UI.Xaml.Grid.Cells;
 using Syncfusion.UI.Xaml.Grid.Helpers;
-using Syncfusion.Windows.Controls.Cells;
-using Syncfusion.Windows.Controls.Grid;
 using Syncfusion.Windows.Shared;
-using Syncfusion.Windows.Tools;
-using Syncfusion.Windows.Tools.Controls;
-using Syncfusion.XPS;
 using Brush = System.Windows.Media.Brush;
 using Color = System.Drawing.Color;
 using DataColumn = System.Data.DataColumn;
 using DataRow = System.Data.DataRow;
 using FilterElement = Syncfusion.UI.Xaml.Grid.FilterElement;
 using FontStyle = System.Windows.FontStyle;
-using Geometry = System.Windows.Media.Geometry;
 using GridCellToolTipOpeningEventArgs = Syncfusion.UI.Xaml.Grid.GridCellToolTipOpeningEventArgs;
 using GridFilterEventArgs = Syncfusion.UI.Xaml.Grid.GridFilterEventArgs;
 using GridSelectionMode = Syncfusion.UI.Xaml.Grid.GridSelectionMode;
 using Image = System.Windows.Controls.Image;
-using Path = System.Windows.Shapes.Path;
-using Point = System.Windows.Point;
 using RowColumnIndex = Syncfusion.UI.Xaml.ScrollAxis.RowColumnIndex;
 using SolidColorBrush = System.Windows.Media.SolidColorBrush;
 using String = System.String;
-using Transform = System.Windows.Media.Transform;
 using VirtualizingCellsControl = Syncfusion.UI.Xaml.Grid.VirtualizingCellsControl;
 
 namespace InABox.DynamicGrid
@@ -356,6 +344,7 @@ namespace InABox.DynamicGrid
 
         private readonly Button Cut;
         private readonly SfDataGrid DataGrid;
+        private readonly Border Disabler;
 
         private readonly Button Delete;
         private readonly DockPanel Docker;
@@ -401,12 +390,12 @@ namespace InABox.DynamicGrid
 
         public event OnCellDoubleClick? OnCellDoubleClick;
 
-        public event OnGridChanged? OnChanged;
+        public event EventHandler? OnChanged;
 
         public delegate void BeforeSelectionEvent(CancelEventArgs cancel);
         public event BeforeSelectionEvent? OnBeforeSelection;
 
-        public void DoChanged() => OnChanged?.Invoke(this);
+        public void DoChanged() => OnChanged?.Invoke(this, EventArgs.Empty);
 
         public event EditorValueChangedHandler? OnEditorValueChanged;
 
@@ -476,7 +465,7 @@ namespace InABox.DynamicGrid
             CellFontWeightConverter = new DynamicGridCellStyleConverter<System.Windows.FontWeight?>(this, GetCellFontWeight);
 
             VisibleColumns = new DynamicGridColumns();
-
+            
             DataGrid = new SfDataGrid();
             DataGrid.VerticalAlignment = VerticalAlignment.Stretch;
             DataGrid.HorizontalAlignment = HorizontalAlignment.Stretch;
@@ -665,15 +654,33 @@ namespace InABox.DynamicGrid
             Layout.Children.Add(DataGrid);
             Layout.Children.Add(Loading);
             Layout.Children.Add(Docker);
+            
+            Disabler = new Border()
+            {
+                BorderBrush = new SolidColorBrush(Colors.Transparent),
+                Background = new SolidColorBrush(Colors.DimGray) { Opacity = 0.2 },
+                Visibility = Visibility.Collapsed,
+            };
+            Disabler.SetValue(Canvas.ZIndexProperty, 99);
+            Disabler.SetValue(Grid.RowSpanProperty, 3);
 
+            Layout.Children.Add(Disabler);
+            
             //Scroll.ApplyTemplate();
 
             Content = Layout;
 
+            IsEnabledChanged += (sender, args) =>
+            {
+                Disabler.Visibility = Equals(args.NewValue, true)
+                    ? Visibility.Collapsed
+                    : Visibility.Visible;
+            };
+            
             Init();
             Reconfigure();
         }
-
+        
         protected virtual void BeforeSelection(CancelEventArgs cancel)
         {
             OnBeforeSelection?.Invoke(cancel);
@@ -1052,6 +1059,7 @@ namespace InABox.DynamicGrid
             bChanged = false;
             inplaceeditor = null;
             DataGridItems?.AcceptChanges();
+            DoChanged();
         }
 
         private void UpdateData(T obj, String mappedname)
@@ -1114,6 +1122,8 @@ namespace InABox.DynamicGrid
                 row[string.Format("ActionColumn{0}", i)] = ActionColumns[i].Data(corerow);
 
         }
+        
+        
 
         private void DataGrid_QueryRowHeight(object? sender, QueryRowHeightEventArgs e)
         {
@@ -1133,6 +1143,8 @@ namespace InABox.DynamicGrid
         }
 
 
+
+
         #region Row Selections
 
         protected CoreRow[] GetVisibleRows()
@@ -2557,7 +2569,7 @@ namespace InABox.DynamicGrid
                     {
                         DeleteItems(rows);
                         SelectedRows = Array.Empty<CoreRow>();
-                        OnChanged?.Invoke(this);
+                        OnChanged?.Invoke(this, EventArgs.Empty);
                         Refresh(false, true);
                         SelectItems(null);
                     }
@@ -2723,12 +2735,12 @@ namespace InABox.DynamicGrid
 
                 InvalidateGrid();
                 SelectedRows = new[] { datarow };
-                OnChanged?.Invoke(this);
+                OnChanged?.Invoke(this, EventArgs.Empty);
             }
             else if (AddEditClick(null))
             {
                 Refresh(false, true);
-                OnChanged?.Invoke(this);
+                OnChanged?.Invoke(this, EventArgs.Empty);
             }
         }
 
@@ -3034,7 +3046,7 @@ namespace InABox.DynamicGrid
                     Data.Rows.Add(row);
                     InvalidateGrid();
                     SelectedRows = new[] { row };
-                    OnChanged?.Invoke(this);
+                    OnChanged?.Invoke(this, EventArgs.Empty);
                     return true;
                 }
 
@@ -3060,7 +3072,7 @@ namespace InABox.DynamicGrid
                         ObjectToRow(items[i], rows[i]);
                     InvalidateGrid();
                     SelectedRows = sel;
-                    OnChanged?.Invoke(this);
+                    OnChanged?.Invoke(this, EventArgs.Empty);
                     return true;
                 }
 

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

@@ -53,7 +53,7 @@ namespace InABox.DynamicGrid
     
     public delegate Dictionary<String,object?>? OnAfterEditorValueChanged(DynamicEditorGrid sender, String columnname);
 
-    public delegate void OnGridChanged(IDynamicGrid sender);
+    //public delegate void OnGridChanged(IDynamicGrid sender);
 
     public delegate void OnLoadPage(IDynamicEditorPage page);