1
0

GasMixerBoundUserInteface.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using Content.Shared.Atmos;
  2. using Content.Shared.Atmos.Piping.Trinary.Components;
  3. using Content.Shared.Localizations;
  4. using JetBrains.Annotations;
  5. using Robust.Client.UserInterface;
  6. namespace Content.Client.Atmos.UI
  7. {
  8. /// <summary>
  9. /// Initializes a <see cref="GasMixerWindow"/> and updates it when new server messages are received.
  10. /// </summary>
  11. [UsedImplicitly]
  12. public sealed class GasMixerBoundUserInterface : BoundUserInterface
  13. {
  14. [ViewVariables]
  15. private const float MaxPressure = Atmospherics.MaxOutputPressure;
  16. [ViewVariables]
  17. private GasMixerWindow? _window;
  18. public GasMixerBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
  19. {
  20. }
  21. protected override void Open()
  22. {
  23. base.Open();
  24. _window = this.CreateWindow<GasMixerWindow>();
  25. _window.ToggleStatusButtonPressed += OnToggleStatusButtonPressed;
  26. _window.MixerOutputPressureChanged += OnMixerOutputPressurePressed;
  27. _window.MixerNodePercentageChanged += OnMixerSetPercentagePressed;
  28. }
  29. private void OnToggleStatusButtonPressed()
  30. {
  31. if (_window is null) return;
  32. SendMessage(new GasMixerToggleStatusMessage(_window.MixerStatus));
  33. }
  34. private void OnMixerOutputPressurePressed(string value)
  35. {
  36. var pressure = UserInputParser.TryFloat(value, out var parsed) ? parsed : 0f;
  37. if (pressure > MaxPressure)
  38. pressure = MaxPressure;
  39. SendMessage(new GasMixerChangeOutputPressureMessage(pressure));
  40. }
  41. private void OnMixerSetPercentagePressed(string value)
  42. {
  43. // We don't need to send both nodes because it's just 100.0f - node
  44. var node = UserInputParser.TryFloat(value, out var parsed) ? parsed : 1.0f;
  45. node = Math.Clamp(node, 0f, 100.0f);
  46. if (_window is not null)
  47. node = _window.NodeOneLastEdited ? node : 100.0f - node;
  48. SendMessage(new GasMixerChangeNodePercentageMessage(node));
  49. }
  50. /// <summary>
  51. /// Update the UI state based on server-sent info
  52. /// </summary>
  53. /// <param name="state"></param>
  54. protected override void UpdateState(BoundUserInterfaceState state)
  55. {
  56. base.UpdateState(state);
  57. if (_window == null || state is not GasMixerBoundUserInterfaceState cast)
  58. return;
  59. _window.Title = (cast.MixerLabel);
  60. _window.SetMixerStatus(cast.Enabled);
  61. _window.SetOutputPressure(cast.OutputPressure);
  62. _window.SetNodePercentages(cast.NodeOne);
  63. }
  64. }
  65. }