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 true; var editor = (Activator.CreateInstance(editorType) as IEventTriggerEditor)!; return editor.Edit(trigger); } }