EventTriggerGrid.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using InABox.Core;
  2. using InABox.DynamicGrid;
  3. using InABox.WPF;
  4. using PRS.Shared.Events;
  5. using PRS.Shared.Grids.EventEditor;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows.Controls;
  12. using System.Windows.Media;
  13. namespace PRS.Shared;
  14. public class EventTriggerContainer<TEvent, TDataModel> : BaseObject
  15. where TEvent : IEvent<TDataModel>
  16. where TDataModel : IEventDataModel
  17. {
  18. public IEventTrigger<TEvent, TDataModel> Trigger { get; set; }
  19. public string TriggerType => Trigger.GetType().GetCaption();
  20. public string Description => Trigger.GetDescription();
  21. }
  22. public class EventTriggerGrid<TEvent, TDataModel> : DynamicItemsListGrid<EventTriggerContainer<TEvent, TDataModel>>
  23. where TEvent : IEvent<TDataModel>
  24. where TDataModel : IEventDataModel
  25. {
  26. public IEnumerable<IEventTrigger<TEvent, TDataModel>> EventTriggers => Items.Select(x => x.Trigger);
  27. public EventTriggerGrid(IEnumerable<IEventTrigger<TEvent, TDataModel>> items)
  28. {
  29. Items.AddRange(items.Select(x => new EventTriggerContainer<TEvent, TDataModel> { Trigger = x }));
  30. }
  31. protected override void DoReconfigure(DynamicGridOptions options)
  32. {
  33. base.DoReconfigure(options);
  34. options.AddRows = true;
  35. options.EditRows = true;
  36. options.DeleteRows = true;
  37. }
  38. public override DynamicGridColumns GenerateColumns()
  39. {
  40. var cols = new DynamicGridColumns<EventTriggerContainer<TEvent, TDataModel>>();
  41. cols.Add(x => x.Description);
  42. return cols;
  43. }
  44. protected override void DoAdd(bool openEditorOnDirectEdit = false)
  45. {
  46. var types = EventUtils.GetEventTriggerTypes(typeof(TEvent));
  47. var menu = new ContextMenu();
  48. foreach(var type in types)
  49. {
  50. menu.AddItem(type.GetCaption(), null, type, MenuAdd_Click);
  51. }
  52. menu.IsOpen = true;
  53. }
  54. private void MenuAdd_Click(Type type)
  55. {
  56. if (type.IsGenericType)
  57. {
  58. type = type.MakeGenericType(typeof(TEvent).GenericTypeArguments);
  59. }
  60. var trigger = (Activator.CreateInstance(type) as IEventTrigger<TEvent, TDataModel>)!;
  61. EditTrigger(trigger);
  62. Items.Add(new() { Trigger = trigger });
  63. Refresh(false, true);
  64. }
  65. private void EditTrigger(IEventTrigger<TEvent, TDataModel> trigger)
  66. {
  67. EventTriggerEditors.EditTrigger(trigger);
  68. }
  69. }