PickSurgeryWindow.xaml.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // SPDX-FileCopyrightText: 2024 Piras314 <p1r4s@proton.me>
  2. // SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
  3. // SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
  4. // SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
  5. // SPDX-FileCopyrightText: 2025 pathetic meowmeow <uhhadd@gmail.com>
  6. //
  7. // SPDX-License-Identifier: AGPL-3.0-or-later
  8. using Content.Client.UserInterface.Controls;
  9. using Content.Shared._Shitmed.Autodoc;
  10. using Content.Shared._Shitmed.Medical.Surgery;
  11. using Content.Shared._Shitmed.Medical.Surgery.Conditions;
  12. using Content.Shared.Body.Part;
  13. using Robust.Client.AutoGenerated;
  14. using Robust.Client.UserInterface.Controls;
  15. using Robust.Client.UserInterface.XAML;
  16. using Robust.Shared.Prototypes;
  17. namespace Content.Client._Shitmed.Autodoc;
  18. [GenerateTypedNameReferences]
  19. public sealed partial class PickSurgeryWindow : FancyWindow
  20. {
  21. [Dependency] private readonly IEntityManager _entMan = default!;
  22. [Dependency] private readonly IPrototypeManager _proto = default!;
  23. private readonly SharedSurgerySystem _surgery;
  24. public event Action<IAutodocStep>? OnAddStep;
  25. private BodyPartType? _part;
  26. private BodyPartSymmetry? _symmetry;
  27. private EntProtoId<SurgeryComponent>? _surgeryId;
  28. public PickSurgeryWindow()
  29. {
  30. RobustXamlLoader.Load(this);
  31. IoCManager.InjectDependencies(this);
  32. _surgery = _entMan.System<SharedSurgerySystem>();
  33. OnAddStep += _ => Close();
  34. var options = new RadioOptions<BodyPartSymmetry?>(RadioOptionsLayout.Horizontal);
  35. options.ButtonStyle = "OpenBoth";
  36. options.FirstButtonStyle = "OpenRight";
  37. options.LastButtonStyle = "OpenLeft";
  38. options.AddItem(Loc.GetString("autodoc-body-symmetry-ignored"), null);
  39. foreach (var symmetry in Enum.GetValues<BodyPartSymmetry>())
  40. {
  41. var name = Loc.GetString("autodoc-body-symmetry-" + symmetry.ToString());
  42. options.AddItem(name, symmetry);
  43. }
  44. Symmetry.AddChild(options);
  45. options.OnItemSelected += args =>
  46. {
  47. args.Button.Select(args.Id);
  48. _symmetry = args.Button.SelectedValue;
  49. UpdateSurgeries();
  50. };
  51. foreach (var part in Enum.GetValues<BodyPartType>())
  52. {
  53. var name = Loc.GetString("autodoc-body-part-" + part.ToString());
  54. Parts.AddItem(name, metadata: part);
  55. }
  56. Parts.OnItemSelected += args =>
  57. {
  58. if (Parts[args.ItemIndex].Metadata is not BodyPartType part)
  59. return;
  60. _part = part;
  61. UpdateSubmit();
  62. UpdateSurgeries();
  63. };
  64. Parts.OnItemDeselected += _ =>
  65. {
  66. _part = null;
  67. SubmitButton.Disabled = true;
  68. };
  69. Surgeries.OnItemSelected += args =>
  70. {
  71. if (Surgeries[args.ItemIndex].Metadata is not EntProtoId<SurgeryComponent> id)
  72. return;
  73. _surgeryId = id;
  74. UpdateSubmit();
  75. };
  76. Surgeries.OnItemDeselected += _ =>
  77. {
  78. _surgeryId = null;
  79. SubmitButton.Disabled = true;
  80. };
  81. SubmitButton.OnPressed += _ =>
  82. {
  83. var step = new SurgeryAutodocStep()
  84. {
  85. Part = _part!.Value,
  86. Symmetry = _symmetry,
  87. Surgery = _surgeryId!.Value
  88. };
  89. OnAddStep?.Invoke(step);
  90. };
  91. UpdateSurgeries();
  92. }
  93. // doesn't handle prototype reload so you have to reopen the window to see new surgeries
  94. private void UpdateSurgeries()
  95. {
  96. Surgeries.Clear();
  97. foreach (var id in _surgery.AllSurgeries)
  98. {
  99. var name = _proto.Index(id).Name;
  100. var protoId = new EntProtoId<SurgeryComponent>(id);
  101. if (_part is not BodyPartType part)
  102. {
  103. Surgeries.AddItem(name, metadata: protoId);
  104. continue;
  105. }
  106. var ent = _surgery.GetSingleton(protoId);
  107. if (ent is null)
  108. continue;
  109. if (!_entMan.TryGetComponent<SurgeryPartConditionComponent>(ent.Value, out var comp))
  110. {
  111. Surgeries.AddItem(name, metadata: protoId);
  112. continue;
  113. }
  114. var partOk = comp.Part == part;
  115. var symmetryOk = (comp.Symmetry == null || _symmetry == null) ? true : comp.Symmetry == _symmetry;
  116. var passesFilter = (partOk && symmetryOk) ^ comp.Inverse;
  117. if (passesFilter)
  118. Surgeries.AddItem(name, metadata: protoId);
  119. }
  120. Surgeries.SortItemsByText();
  121. }
  122. private void UpdateSubmit()
  123. {
  124. // symmetry is optional, others are not
  125. SubmitButton.Disabled = _part == null || _surgeryId == null;
  126. }
  127. }