AccessOverriderWindow.xaml.cs 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System.Linq;
  2. using Content.Shared.Access;
  3. using Content.Shared.Access.Systems;
  4. using Robust.Client.AutoGenerated;
  5. using Robust.Client.UserInterface.Controls;
  6. using Robust.Client.UserInterface.CustomControls;
  7. using Robust.Client.UserInterface.XAML;
  8. using Robust.Shared.Prototypes;
  9. using static Content.Shared.Access.Components.AccessOverriderComponent;
  10. namespace Content.Client.Access.UI
  11. {
  12. [GenerateTypedNameReferences]
  13. public sealed partial class AccessOverriderWindow : DefaultWindow
  14. {
  15. private readonly Dictionary<string, Button> _accessButtons = new();
  16. public event Action<List<ProtoId<AccessLevelPrototype>>>? OnSubmit;
  17. public AccessOverriderWindow()
  18. {
  19. RobustXamlLoader.Load(this);
  20. }
  21. public void SetAccessLevels(IPrototypeManager protoManager, List<ProtoId<AccessLevelPrototype>> accessLevels)
  22. {
  23. _accessButtons.Clear();
  24. AccessLevelGrid.DisposeAllChildren();
  25. foreach (var access in accessLevels)
  26. {
  27. if (!protoManager.TryIndex(access, out var accessLevel))
  28. {
  29. continue;
  30. }
  31. var newButton = new Button
  32. {
  33. Text = accessLevel.GetAccessLevelName(),
  34. ToggleMode = true,
  35. };
  36. AccessLevelGrid.AddChild(newButton);
  37. _accessButtons.Add(accessLevel.ID, newButton);
  38. newButton.OnPressed += _ =>
  39. {
  40. OnSubmit?.Invoke(
  41. // Iterate over the buttons dictionary, filter by `Pressed`, only get key from the key/value pair
  42. _accessButtons.Where(x => x.Value.Pressed).Select(x => new ProtoId<AccessLevelPrototype>(x.Key)).ToList());
  43. };
  44. }
  45. }
  46. public void UpdateState(IPrototypeManager protoManager, AccessOverriderBoundUserInterfaceState state)
  47. {
  48. PrivilegedIdLabel.Text = state.PrivilegedIdName;
  49. PrivilegedIdButton.Text = state.IsPrivilegedIdPresent
  50. ? Loc.GetString("access-overrider-window-eject-button")
  51. : Loc.GetString("access-overrider-window-insert-button");
  52. TargetNameLabel.Text = state.TargetLabel;
  53. TargetNameLabel.FontColorOverride = state.TargetLabelColor;
  54. MissingPrivilegesLabel.Text = "";
  55. MissingPrivilegesLabel.FontColorOverride = Color.Yellow;
  56. MissingPrivilegesText.Text = "";
  57. MissingPrivilegesText.FontColorOverride = Color.Yellow;
  58. if (state.MissingPrivilegesList != null && state.MissingPrivilegesList.Any())
  59. {
  60. var missingPrivileges = new List<string>();
  61. foreach (string tag in state.MissingPrivilegesList)
  62. {
  63. var privilege = Loc.GetString(protoManager.Index<AccessLevelPrototype>(tag)?.Name ?? "generic-unknown");
  64. missingPrivileges.Add(privilege);
  65. }
  66. MissingPrivilegesLabel.Text = Loc.GetString("access-overrider-window-missing-privileges");
  67. MissingPrivilegesText.Text = string.Join(", ", missingPrivileges);
  68. }
  69. var interfaceEnabled = state.IsPrivilegedIdPresent && state.IsPrivilegedIdAuthorized;
  70. foreach (var (accessName, button) in _accessButtons)
  71. {
  72. button.Disabled = !interfaceEnabled;
  73. if (interfaceEnabled)
  74. {
  75. // Explicit cast because Rider gives a false error otherwise.
  76. button.Pressed = state.TargetAccessReaderIdAccessList?.Contains((ProtoId<AccessLevelPrototype>) accessName) ?? false;
  77. button.Disabled = (!state.AllowedModifyAccessList?.Contains((ProtoId<AccessLevelPrototype>) accessName)) ?? true;
  78. }
  79. }
  80. }
  81. }
  82. }