using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; using PRS.Shared.Events; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace PRS.Shared.Grids.EventEditor; public interface IEventTriggerEditor { bool Edit(IEventTrigger trigger); } public interface IEventTriggerEditor : IEventTriggerEditor where TTrigger : IEventTrigger { bool Edit(TTrigger trigger); bool IEventTriggerEditor.Edit(IEventTrigger trigger) => Edit((TTrigger)trigger); } public static class EventTriggerEditors { private static Dictionary? _triggerEditors; private static Dictionary GetTriggerEditors() { if(_triggerEditors is null) { _triggerEditors = new Dictionary(); foreach(var type in CoreUtils.TypeList(x => true)) { if (type.GetInterfaceDefinition(typeof(IEventTriggerEditor<>)) is Type editorInterface) { var triggerType = editorInterface.GenericTypeArguments[0]; triggerType = triggerType.IsGenericType ? triggerType.GetGenericTypeDefinition() : triggerType; _triggerEditors[triggerType] = type; } } } return _triggerEditors; } public static Type? GetTriggerEditorType(Type triggerType) { var genericTriggerType = triggerType.IsGenericType ? triggerType.GetGenericTypeDefinition() : triggerType; if(GetTriggerEditors().GetValueOrDefault(genericTriggerType) is Type editorType) { return editorType.IsGenericType ? editorType.MakeGenericType(triggerType.GenericTypeArguments) : editorType; } else { return null; } } public static bool EditTrigger(IEventTrigger trigger) where TEvent : IEvent where TDataModel : IEventDataModel { var editorType = GetTriggerEditorType(trigger.GetType()); if (editorType is null) return false; var editor = (Activator.CreateInstance(editorType) as IEventTriggerEditor)!; return editor.Edit(trigger); } } public class PropertyChangedSaveEventTriggerEditor : Grid, IEventTriggerEditor> where T : Entity { public bool Edit(PropertyChangedSaveEventTrigger trigger) { var properties = DatabaseSchema.Properties(typeof(T)) .Where(x => x.IsSerializable) .Select(x => x.Name) .ToList(); properties.Sort(); if(DynamicGridColumnNameSelectorGrid.SelectColumnName(typeof(T), properties, out var value)) { trigger.TriggerProperty = DatabaseSchema.Property(typeof(T), value); return true; } else { return false; } } } // public class PropertyChangedSaveEventTriggerEditor : Grid, IEventTriggerEditor> // where T : Entity // { // public PropertyChangedSaveEventTrigger EventTrigger { get; set; } // // private readonly string[] ColumnNames; // // private Button PropertyButton; // // public PropertyChangedSaveEventTriggerEditor(PropertyChangedSaveEventTrigger eventTrigger) // { // EventTrigger = eventTrigger; // // this.AddColumn(GridUnitType.Auto); // this.AddColumn(GridUnitType.Auto); // this.AddColumn(GridUnitType.Auto); // this.AddColumn(GridUnitType.Star); // this.AddColumn(GridUnitType.Auto); // this.AddColumn(GridUnitType.Star); // this.AddRow(GridUnitType.Auto); // // this.AddChild(new Label // { // Content = "Property:", // VerticalAlignment = VerticalAlignment.Center, // }, 0, 0); // // PropertyButton = new Button // { // Content = eventTrigger.TriggerProperty?.Name ?? "", // Padding = new(5), // Margin = new(5, 0, 0, 0), // HorizontalContentAlignment = HorizontalAlignment.Left, // Background = new LinearGradientBrush(new GradientStopCollection() // { // new(Color.FromRgb(0xF0, 0xF0, 0xF0), 0.0), // new(Color.FromRgb(0xE5, 0xE5, 0xE5), 1.0), // }) // { // StartPoint = new(0, 0), // EndPoint = new(0, 1), // }, // BorderBrush = Color.FromRgb(0xAC, 0xAC, 0xAC).ToBrush(), // MinWidth = 100 // }; // PropertyButton.Click += PropertyButton_Click; // // var properties = DatabaseSchema.Properties(typeof(T)) // .Where(x => x.IsSerializable) // .Select(x => x.Name) // .ToList(); // properties.Sort(); // ColumnNames = properties.ToArray(); // this.AddChild(PropertyButton, 0, 1); // // this.AddChild(new Label // { // Content = "Old Value:", // Margin = new(5, 0, 0, 0), // VerticalAlignment = VerticalAlignment.Center, // }, 0, 2); // // this.AddChild(new Label // { // Content = "New Value:", // Margin = new(5, 0, 0, 0), // VerticalAlignment = VerticalAlignment.Center, // }, 0, 4); // } // // private void PropertyButton_Click(object sender, RoutedEventArgs e) // { // if(DynamicGridColumnNameSelectorGrid.SelectColumnName(typeof(T), ColumnNames, out var value)) // { // EventTrigger.TriggerProperty = DatabaseSchema.Property(typeof(T), value); // PropertyButton.Content = value; // } // } // }