MaterialDisplay.xaml.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using Content.Client.Stylesheets;
  2. using Content.Shared.Materials;
  3. using Robust.Client.AutoGenerated;
  4. using Robust.Client.GameObjects;
  5. using Robust.Client.UserInterface;
  6. using Robust.Client.UserInterface.Controls;
  7. using Robust.Client.UserInterface.XAML;
  8. using Robust.Shared.Prototypes;
  9. namespace Content.Client.Materials.UI;
  10. /// <summary>
  11. /// This widget is one row in the material storage control.
  12. /// </summary>
  13. [GenerateTypedNameReferences]
  14. public sealed partial class MaterialDisplay : PanelContainer
  15. {
  16. [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
  17. [Dependency] private readonly IEntityManager _entityManager = default!;
  18. private readonly MaterialStorageSystem _materialStorage;
  19. private readonly MaterialStorageUIController _materialUIController;
  20. private int _volume;
  21. private readonly EntityUid _ent;
  22. public readonly string Material;
  23. private readonly bool _canEject;
  24. public MaterialDisplay(EntityUid ent, string material, int volume, bool canEject)
  25. {
  26. RobustXamlLoader.Load(this);
  27. IoCManager.InjectDependencies(this);
  28. _materialStorage = _entityManager.System<MaterialStorageSystem>();
  29. _materialUIController = UserInterfaceManager.GetUIController<MaterialStorageUIController>();
  30. var spriteSys = _entityManager.System<SpriteSystem>();
  31. Icon.Texture = spriteSys.Frame0(_prototypeManager.Index<MaterialPrototype>(material).Icon);
  32. _ent = ent;
  33. Material = material;
  34. _canEject = canEject;
  35. UpdateVolume(volume);
  36. }
  37. public void UpdateVolume(int volume)
  38. {
  39. if (_volume == volume)
  40. return;
  41. _volume = volume;
  42. var matProto = _prototypeManager.Index<MaterialPrototype>(Material);
  43. var sheetVolume = _materialStorage.GetSheetVolume(matProto);
  44. var sheets = (float) volume / sheetVolume;
  45. var maxEjectableSheets = (int) MathF.Floor(sheets);
  46. var unit = Loc.GetString(matProto.Unit);
  47. var amountText = Loc.GetString("lathe-menu-material-amount", ("amount", sheets), ("unit", unit));
  48. var name = Loc.GetString(matProto.Name);
  49. var mat = Loc.GetString("lathe-menu-material-display", ("material", name), ("amount", amountText));
  50. ProductName.Text = mat;
  51. PopulateButtons(maxEjectableSheets);
  52. }
  53. public void PopulateButtons(int maxEjectableSheets)
  54. {
  55. Content.Children.Clear();
  56. if (!_canEject)
  57. return;
  58. int[] sheetsToEjectArray = { 1, 5, 10 };
  59. for (var i = 0; i < sheetsToEjectArray.Length; i++)
  60. {
  61. var sheetsToEject = sheetsToEjectArray[i];
  62. var styleClass = StyleBase.ButtonOpenBoth;
  63. if (i == 0)
  64. styleClass = StyleBase.ButtonOpenRight;
  65. else if (i == sheetsToEjectArray.Length - 1)
  66. styleClass = StyleBase.ButtonOpenLeft;
  67. var button = new Button
  68. {
  69. Name = $"{sheetsToEject}",
  70. Access = AccessLevel.Public,
  71. Text = Loc.GetString($"{sheetsToEject}"),
  72. MinWidth = 45,
  73. StyleClasses = { styleClass }
  74. };
  75. button.OnPressed += _ =>
  76. {
  77. _materialUIController.SendLatheEjectMessage(_ent, Material, sheetsToEject);
  78. };
  79. button.Disabled = maxEjectableSheets < sheetsToEject;
  80. if (_prototypeManager.TryIndex<MaterialPrototype>(Material, out var proto))
  81. {
  82. button.ToolTip = Loc.GetString("lathe-menu-tooltip-display", ("amount", sheetsToEject), ("material", Loc.GetString(proto.Name)));
  83. }
  84. Content.AddChild(button);
  85. }
  86. }
  87. }