1
0

CartridgeLoaderBoundUserInterface.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using Content.Client.UserInterface.Fragments;
  2. using Content.Shared.CartridgeLoader;
  3. using Robust.Client.GameObjects;
  4. using Robust.Client.UserInterface;
  5. namespace Content.Client.CartridgeLoader;
  6. public abstract class CartridgeLoaderBoundUserInterface : BoundUserInterface
  7. {
  8. [ViewVariables]
  9. private EntityUid? _activeProgram;
  10. [ViewVariables]
  11. private UIFragment? _activeCartridgeUI;
  12. [ViewVariables]
  13. private Control? _activeUiFragment;
  14. private IEntityManager _entManager;
  15. protected CartridgeLoaderBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
  16. {
  17. _entManager = IoCManager.Resolve<IEntityManager>();
  18. }
  19. protected override void UpdateState(BoundUserInterfaceState state)
  20. {
  21. base.UpdateState(state);
  22. if (state is not CartridgeLoaderUiState loaderUiState)
  23. {
  24. _activeCartridgeUI?.UpdateState(state);
  25. return;
  26. }
  27. // TODO move this to a component state and ensure the net ids.
  28. var programs = GetCartridgeComponents(_entManager.GetEntityList(loaderUiState.Programs));
  29. UpdateAvailablePrograms(programs);
  30. var activeUI = _entManager.GetEntity(loaderUiState.ActiveUI);
  31. _activeProgram = activeUI;
  32. var ui = RetrieveCartridgeUI(activeUI);
  33. var comp = RetrieveCartridgeComponent(activeUI);
  34. var control = ui?.GetUIFragmentRoot();
  35. //Prevent the same UI fragment from getting disposed and attached multiple times
  36. if (_activeUiFragment?.GetType() == control?.GetType())
  37. return;
  38. if (_activeUiFragment is not null)
  39. DetachCartridgeUI(_activeUiFragment);
  40. if (control is not null && _activeProgram.HasValue)
  41. {
  42. AttachCartridgeUI(control, Loc.GetString(comp?.ProgramName ?? "default-program-name"));
  43. SendCartridgeUiReadyEvent(_activeProgram.Value);
  44. }
  45. _activeCartridgeUI = ui;
  46. _activeUiFragment?.Dispose();
  47. _activeUiFragment = control;
  48. }
  49. protected void ActivateCartridge(EntityUid cartridgeUid)
  50. {
  51. var message = new CartridgeLoaderUiMessage(_entManager.GetNetEntity(cartridgeUid), CartridgeUiMessageAction.Activate);
  52. SendMessage(message);
  53. }
  54. protected void DeactivateActiveCartridge()
  55. {
  56. if (!_activeProgram.HasValue)
  57. return;
  58. var message = new CartridgeLoaderUiMessage(_entManager.GetNetEntity(_activeProgram.Value), CartridgeUiMessageAction.Deactivate);
  59. SendMessage(message);
  60. }
  61. protected void InstallCartridge(EntityUid cartridgeUid)
  62. {
  63. var message = new CartridgeLoaderUiMessage(_entManager.GetNetEntity(cartridgeUid), CartridgeUiMessageAction.Install);
  64. SendMessage(message);
  65. }
  66. protected void UninstallCartridge(EntityUid cartridgeUid)
  67. {
  68. var message = new CartridgeLoaderUiMessage(_entManager.GetNetEntity(cartridgeUid), CartridgeUiMessageAction.Uninstall);
  69. SendMessage(message);
  70. }
  71. private List<(EntityUid, CartridgeComponent)> GetCartridgeComponents(List<EntityUid> programs)
  72. {
  73. var components = new List<(EntityUid, CartridgeComponent)>();
  74. foreach (var program in programs)
  75. {
  76. var component = RetrieveCartridgeComponent(program);
  77. if (component is not null)
  78. components.Add((program, component));
  79. }
  80. return components;
  81. }
  82. /// <summary>
  83. /// The implementing ui needs to add the passed ui fragment as a child to itself
  84. /// </summary>
  85. protected abstract void AttachCartridgeUI(Control cartridgeUIFragment, string? title);
  86. /// <summary>
  87. /// The implementing ui needs to remove the passed ui from itself
  88. /// </summary>
  89. protected abstract void DetachCartridgeUI(Control cartridgeUIFragment);
  90. protected abstract void UpdateAvailablePrograms(List<(EntityUid, CartridgeComponent)> programs);
  91. protected override void Dispose(bool disposing)
  92. {
  93. base.Dispose(disposing);
  94. if (disposing)
  95. _activeUiFragment?.Dispose();
  96. }
  97. protected CartridgeComponent? RetrieveCartridgeComponent(EntityUid? cartridgeUid)
  98. {
  99. return EntMan.GetComponentOrNull<CartridgeComponent>(cartridgeUid);
  100. }
  101. private void SendCartridgeUiReadyEvent(EntityUid cartridgeUid)
  102. {
  103. var message = new CartridgeLoaderUiMessage(_entManager.GetNetEntity(cartridgeUid), CartridgeUiMessageAction.UIReady);
  104. SendMessage(message);
  105. }
  106. private UIFragment? RetrieveCartridgeUI(EntityUid? cartridgeUid)
  107. {
  108. var component = EntMan.GetComponentOrNull<UIFragmentComponent>(cartridgeUid);
  109. component?.Ui?.Setup(this, cartridgeUid);
  110. return component?.Ui;
  111. }
  112. }