EventEditorControl.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using InABox.WPF;
  2. using PRS.Shared.Events;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Windows;
  9. using System.Windows.Controls;
  10. using System.Windows.Media;
  11. namespace PRS.Shared;
  12. public interface IEventEditorControl
  13. {
  14. event Action? OnChanged;
  15. IEventData Data { get; }
  16. }
  17. public class EventEditorControl<TEvent, TDataModel> : Grid, IEventEditorControl
  18. where TEvent : IEvent<TDataModel>
  19. where TDataModel : IEventDataModel
  20. {
  21. private EventData<TEvent, TDataModel> _data;
  22. public EventData<TEvent, TDataModel> Data
  23. {
  24. get
  25. {
  26. _data.Triggers = TriggerGrid.EventTriggers.ToList();
  27. _data.Actions = ActionGrid.EventActions.ToList();
  28. return _data;
  29. }
  30. set
  31. {
  32. _data = value;
  33. }
  34. }
  35. IEventData IEventEditorControl.Data => Data;
  36. private EventTriggerGrid<TEvent, TDataModel> TriggerGrid;
  37. private EventActionGrid<TEvent, TDataModel> ActionGrid;
  38. public event Action? OnChanged;
  39. public EventEditorControl(EventData<TEvent, TDataModel> evData)
  40. {
  41. Data = evData;
  42. var triggerLabelBorder = new Border
  43. {
  44. BorderBrush = Colors.Gray.ToBrush(),
  45. BorderThickness = new(0.75),
  46. Background = Colors.WhiteSmoke.ToBrush(),
  47. Child = new Label
  48. {
  49. Content = "Triggers",
  50. VerticalAlignment = System.Windows.VerticalAlignment.Center,
  51. HorizontalAlignment = System.Windows.HorizontalAlignment.Center
  52. }
  53. };
  54. var actionsLabelBorder = new Border
  55. {
  56. BorderBrush = Colors.Gray.ToBrush(),
  57. BorderThickness = new(0.75),
  58. Background = Colors.WhiteSmoke.ToBrush(),
  59. Child = new Label
  60. {
  61. Content = "Actions",
  62. VerticalAlignment = System.Windows.VerticalAlignment.Center,
  63. HorizontalAlignment = System.Windows.HorizontalAlignment.Center
  64. }
  65. };
  66. var separator = new StackPanel
  67. {
  68. Orientation = Orientation.Horizontal,
  69. };
  70. separator.Children.Add(new Separator
  71. {
  72. Style = (Style)Application.Current.TryFindResource(ToolBar.SeparatorStyleKey),
  73. Margin = new(3, 0, 3, 0)
  74. });
  75. TriggerGrid = new EventTriggerGrid<TEvent, TDataModel>(evData.Triggers)
  76. {
  77. Margin = new(0, 5, 0, 0)
  78. };
  79. ActionGrid = new EventActionGrid<TEvent, TDataModel>(evData.Actions, evData.Event.DataModelDefinition())
  80. {
  81. Margin = new(0, 5, 0, 0)
  82. };
  83. this.AddRow(GridUnitType.Auto);
  84. this.AddRow(GridUnitType.Star);
  85. var hasTriggers = evData.Event is not ScheduledEvent;
  86. if(!hasTriggers)
  87. {
  88. this.AddColumn(0);
  89. this.AddColumn(0);
  90. }
  91. else
  92. {
  93. this.AddColumn(GridUnitType.Star);
  94. this.AddColumn(GridUnitType.Auto);
  95. }
  96. this.AddColumn(GridUnitType.Star);
  97. if (hasTriggers)
  98. {
  99. this.AddChild(triggerLabelBorder, 0, 0);
  100. this.AddChild(separator, 0, 1, rowSpan: 2);
  101. this.AddChild(TriggerGrid, 1, 0);
  102. }
  103. this.AddChild(actionsLabelBorder, 0, 2);
  104. this.AddChild(ActionGrid, 1, 2);
  105. if (hasTriggers)
  106. {
  107. TriggerGrid.Refresh(true, true);
  108. TriggerGrid.OnChanged += Grid_OnChanged;
  109. }
  110. ActionGrid.Refresh(true, true);
  111. ActionGrid.OnChanged += Grid_OnChanged;
  112. }
  113. private void Grid_OnChanged(object? sender, EventArgs e)
  114. {
  115. OnChanged?.Invoke();
  116. }
  117. }