GrinderMenu.xaml.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using Content.Client.UserInterface.Controls;
  2. using Content.Shared.Chemistry.Reagent;
  3. using Content.Shared.Kitchen;
  4. using Robust.Client.AutoGenerated;
  5. using Robust.Client.GameObjects;
  6. using Robust.Client.UserInterface.Controls;
  7. using Robust.Client.UserInterface.XAML;
  8. using Robust.Shared.Prototypes;
  9. namespace Content.Client.Kitchen.UI
  10. {
  11. [GenerateTypedNameReferences]
  12. public sealed partial class GrinderMenu : FancyWindow
  13. {
  14. [Dependency] private readonly IEntityManager _entityManager = default!;
  15. [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
  16. private readonly Dictionary<int, EntityUid> _chamberVisualContents = new();
  17. public event Action? OnToggleAuto;
  18. public event Action? OnGrind;
  19. public event Action? OnJuice;
  20. public event Action? OnEjectAll;
  21. public event Action? OnEjectBeaker;
  22. public event Action<EntityUid>? OnEjectChamber;
  23. public GrinderMenu()
  24. {
  25. RobustXamlLoader.Load(this);
  26. IoCManager.InjectDependencies(this);
  27. AutoModeButton.OnPressed += _ => OnToggleAuto?.Invoke();
  28. GrindButton.OnPressed += _ => OnGrind?.Invoke();
  29. JuiceButton.OnPressed += _ => OnJuice?.Invoke();
  30. ChamberContentBox.EjectButton.OnPressed += _ => OnEjectAll?.Invoke();
  31. BeakerContentBox.EjectButton.OnPressed += _ => OnEjectBeaker?.Invoke();
  32. ChamberContentBox.BoxContents.OnItemSelected += OnChamberBoxContentsItemSelected;
  33. BeakerContentBox.BoxContents.SelectMode = ItemList.ItemListSelectMode.None;
  34. }
  35. private void OnChamberBoxContentsItemSelected(ItemList.ItemListSelectedEventArgs args)
  36. {
  37. OnEjectChamber?.Invoke(_chamberVisualContents[args.ItemIndex]);
  38. }
  39. public void UpdateState(ReagentGrinderInterfaceState state)
  40. {
  41. BeakerContentBox.EjectButton.Disabled = !state.HasBeakerIn;
  42. ChamberContentBox.EjectButton.Disabled = state.ChamberContents.Length <= 0;
  43. GrindButton.Disabled = !state.CanGrind || !state.Powered;
  44. JuiceButton.Disabled = !state.CanJuice || !state.Powered;
  45. switch (state.AutoMode)
  46. {
  47. case GrinderAutoMode.Grind:
  48. AutoModeButton.Text = Loc.GetString("grinder-menu-grind-button");
  49. break;
  50. case GrinderAutoMode.Juice:
  51. AutoModeButton.Text = Loc.GetString("grinder-menu-juice-button");
  52. break;
  53. default:
  54. AutoModeButton.Text = Loc.GetString("grinder-menu-auto-button-off");
  55. break;
  56. }
  57. // TODO move this to a component state and ensure the net ids.
  58. RefreshContentsDisplay(state.ReagentQuantities, _entityManager.GetEntityArray(state.ChamberContents), state.HasBeakerIn);
  59. }
  60. public void HandleMessage(BoundUserInterfaceMessage message)
  61. {
  62. switch (message)
  63. {
  64. case ReagentGrinderWorkStartedMessage workStarted:
  65. GrindButton.Disabled = true;
  66. GrindButton.Modulate = workStarted.GrinderProgram == GrinderProgram.Grind ? Color.Green : Color.White;
  67. JuiceButton.Disabled = true;
  68. JuiceButton.Modulate = workStarted.GrinderProgram == GrinderProgram.Juice ? Color.Green : Color.White;
  69. BeakerContentBox.EjectButton.Disabled = true;
  70. ChamberContentBox.EjectButton.Disabled = true;
  71. break;
  72. case ReagentGrinderWorkCompleteMessage:
  73. GrindButton.Disabled = false;
  74. JuiceButton.Disabled = false;
  75. GrindButton.Modulate = Color.White;
  76. JuiceButton.Modulate = Color.White;
  77. BeakerContentBox.EjectButton.Disabled = false;
  78. ChamberContentBox.EjectButton.Disabled = false;
  79. break;
  80. }
  81. }
  82. private void RefreshContentsDisplay(IList<ReagentQuantity>? reagents, IReadOnlyList<EntityUid> containedSolids, bool isBeakerAttached)
  83. {
  84. //Refresh chamber contents
  85. _chamberVisualContents.Clear();
  86. ChamberContentBox.BoxContents.Clear();
  87. foreach (var entity in containedSolids)
  88. {
  89. if (!_entityManager.EntityExists(entity))
  90. {
  91. return;
  92. }
  93. var texture = _entityManager.GetComponent<SpriteComponent>(entity).Icon?.Default;
  94. var solidItem = ChamberContentBox.BoxContents.AddItem(_entityManager.GetComponent<MetaDataComponent>(entity).EntityName, texture);
  95. var solidIndex = ChamberContentBox.BoxContents.IndexOf(solidItem);
  96. _chamberVisualContents.Add(solidIndex, entity);
  97. }
  98. //Refresh beaker contents
  99. BeakerContentBox.BoxContents.Clear();
  100. //if no beaker is attached use this guard to prevent hitting a null reference.
  101. if (!isBeakerAttached || reagents == null)
  102. {
  103. return;
  104. }
  105. //Looks like we have a beaker attached.
  106. if (reagents.Count <= 0)
  107. {
  108. BeakerContentBox.BoxContents.AddItem(Loc.GetString("grinder-menu-beaker-content-box-is-empty"));
  109. }
  110. else
  111. {
  112. foreach (var (reagent, quantity) in reagents)
  113. {
  114. var reagentName = _prototypeManager.TryIndex(reagent.Prototype, out ReagentPrototype? proto)
  115. ? Loc.GetString($"{quantity} {proto.LocalizedName}")
  116. : "???";
  117. BeakerContentBox.BoxContents.AddItem(reagentName);
  118. }
  119. }
  120. }
  121. }
  122. }