1
0

ButtonGrid.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using Robust.Client.Graphics;
  3. using Robust.Client.UserInterface.Controls;
  4. namespace Content.Client.Chemistry.UI;
  5. /// <summary>
  6. /// Creates a grid of buttons given a comma-seperated list of Text
  7. /// </summary>
  8. public sealed class ButtonGrid : GridContainer
  9. {
  10. private string _buttonList = "";
  11. /// <summary>
  12. /// A comma-seperated list of text to use for each button. These will be inserted sequentially.
  13. /// </summary>
  14. public string ButtonList
  15. {
  16. get => _buttonList;
  17. set
  18. {
  19. _buttonList = value;
  20. Update();
  21. }
  22. }
  23. public bool RadioGroup { get; set; } = false;
  24. private string? _selected;
  25. /// <summary>
  26. /// Which button is currently selected. Only matters when <see cref="RadioGroup"/> is true.
  27. /// </summary>
  28. public string? Selected
  29. {
  30. get => _selected;
  31. set
  32. {
  33. _selected = value;
  34. Update();
  35. }
  36. }
  37. public Action<string>? OnButtonPressed;
  38. /// <summary>
  39. /// <see cref="GridContainer.Columns"/>
  40. /// </summary>
  41. public new int Columns
  42. {
  43. get => base.Columns;
  44. set
  45. {
  46. base.Columns = value;
  47. Update();
  48. }
  49. }
  50. /// <summary>
  51. /// <see cref="GridContainer.Rows"/>
  52. /// </summary>
  53. public new int Rows
  54. {
  55. get => base.Rows;
  56. set
  57. {
  58. base.Rows = value;
  59. Update();
  60. }
  61. }
  62. private void Update()
  63. {
  64. if (ButtonList == "")
  65. return;
  66. this.Children.Clear();
  67. var i = 0;
  68. var list = ButtonList.Split(",");
  69. var group = new ButtonGroup();
  70. foreach (var button in list)
  71. {
  72. var btn = new Button();
  73. btn.Text = button;
  74. btn.OnPressed += _ =>
  75. {
  76. if (RadioGroup)
  77. btn.Pressed = true;
  78. Selected = button;
  79. OnButtonPressed?.Invoke(button);
  80. };
  81. if (button == Selected)
  82. btn.Pressed = true;
  83. var sep = HSeparationOverride ?? 0;
  84. // ReSharper disable once PossibleLossOfFraction
  85. // btn.SetWidth = (this.PixelWidth - sep * (Columns - 1)) / 3;
  86. btn.Group = group;
  87. var row = i / Columns;
  88. var col = i % Columns;
  89. var last = i == list.Length - 1;
  90. var lastCol = i == Columns - 1;
  91. var lastRow = row == list.Length / Columns - 1;
  92. if (row == 0 && (lastCol || last))
  93. btn.AddStyleClass("OpenLeft");
  94. else if (col == 0 && lastRow)
  95. btn.AddStyleClass("OpenRight");
  96. else
  97. btn.AddStyleClass("OpenBoth");
  98. this.Children.Add(btn);
  99. i++;
  100. }
  101. }
  102. }