EventTriggerGrid.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. protected override void DoEdit()
  55. {
  56. var row = SelectedRows.First();
  57. var item = LoadItem(row);
  58. if (EventTriggerEditors.EditTrigger(item.Trigger))
  59. {
  60. UpdateRow(row, item);
  61. DoChanged();
  62. }
  63. }
  64. private void MenuAdd_Click(Type type)
  65. {
  66. if (type.IsGenericType)
  67. {
  68. type = type.MakeGenericType(typeof(TEvent).GenericTypeArguments);
  69. }
  70. var trigger = (Activator.CreateInstance(type) as IEventTrigger<TEvent, TDataModel>)!;
  71. if (!EventTriggerEditors.EditTrigger(trigger))
  72. {
  73. return;
  74. }
  75. Items.Add(new() { Trigger = trigger });
  76. Refresh(false, true);
  77. DoChanged();
  78. }
  79. }