GadgetConfigDropdownComponent.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using GadgetCore.API;
  2. using GadgetCore.API.ConfigMenu;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Reflection;
  7. using System.Text;
  8. using UnityEngine;
  9. using UnityEngine.UI;
  10. namespace QuickStack
  11. {
  12. public class GadgetConfigDropdownComponent : GadgetConfigComponent
  13. {
  14. public string Value { get; protected set; }
  15. public string[] Values { get; protected set; }
  16. public readonly string DefaultValue;
  17. private readonly Action<string> ValueSetter;
  18. private RectTransform[] Entries;
  19. public GadgetConfigDropdownComponent(BasicGadgetConfigMenu configMenu, string name, string value, string[] values, Action<string> valueSetter, float height = 0.1f) : base(configMenu, name, height)
  20. {
  21. Value = value;
  22. Values = values;
  23. ValueSetter = valueSetter;
  24. }
  25. private T GetFromStatic<T>(string classString, string paramString)
  26. {
  27. var type = Type.GetType("GadgetCore" + "." + classString + ", GadgetCore");
  28. var property = type.GetProperty(paramString, BindingFlags.Public | BindingFlags.Static);
  29. MethodInfo strGetter = property.GetGetMethod();
  30. return (T)strGetter.Invoke(null, null);
  31. }
  32. public override void Build(RectTransform parent)
  33. {
  34. var ModConfigMenuText = GetFromStatic<GameObject>("SceneInjector", "ModConfigMenuText");
  35. var BoxSprite = GetFromStatic<Sprite>("SceneInjector", "BoxSprite");
  36. var textureMenuTile = GadgetCoreAPI.LoadTexture2D("menuTile.png");
  37. var MenuTile = Sprite.Create(textureMenuTile, BoxSprite.rect, BoxSprite.pivot, BoxSprite.pixelsPerUnit, default, default, BoxSprite.border);
  38. if (!string.IsNullOrEmpty(Name))
  39. {
  40. StringBuilder nameString = new StringBuilder();
  41. int spacesAdded = 0;
  42. foreach (char c in Name)
  43. {
  44. if (nameString.Length > 0 && char.IsUpper(c) && !char.IsUpper(Name[nameString.Length - spacesAdded - 1]) && (Name.Length == 1 || !char.IsUpper(Name[nameString.Length - spacesAdded - 2]) || (Name.Length > 2 && !char.IsUpper(Name[nameString.Length - spacesAdded - 3]))))
  45. {
  46. spacesAdded++;
  47. nameString.Append(' ');
  48. }
  49. nameString.Append(nameString.Length > 0 ? c : char.ToUpper(c));
  50. }
  51. Text label = new GameObject("Label", typeof(RectTransform), typeof(CanvasRenderer), typeof(Text)).GetComponent<Text>();
  52. label.rectTransform.SetParent(parent);
  53. label.rectTransform.anchorMin = new Vector2(0f, 0f);
  54. label.rectTransform.anchorMax = new Vector2(0.25f, 1f);
  55. label.rectTransform.offsetMin = new Vector2(0, 0);
  56. label.rectTransform.offsetMax = new Vector2(-10, 0);
  57. label.text = nameString + ":";
  58. label.font = ModConfigMenuText.GetComponent<TextMesh>().font;
  59. label.fontSize = 12;
  60. label.horizontalOverflow = HorizontalWrapMode.Wrap;
  61. label.alignment = TextAnchor.MiddleLeft;
  62. }
  63. RectTransform button = new GameObject("Button", typeof(RectTransform), typeof(Button), typeof(CanvasRenderer), typeof(Image)).GetComponent<RectTransform>();
  64. button.SetParent(parent);
  65. button.anchorMin = new Vector2(0.25f, 0f);
  66. button.anchorMax = new Vector2(0.75f, 1f);
  67. button.offsetMin = new Vector2(10, 0);
  68. button.offsetMax = new Vector2(-10, 0);
  69. button.GetComponent<Image>().sprite = BoxSprite;
  70. button.GetComponent<Image>().type = Image.Type.Sliced;
  71. button.GetComponent<Image>().fillCenter = true;
  72. button.GetComponent<Button>().onClick.AddListener(() =>
  73. {
  74. bool set = Entries[0] != null && !Entries[0].gameObject.active;
  75. for (int i = 0; i < Entries.Length; i++)
  76. {
  77. Entries[i].gameObject.SetActive(set);
  78. }
  79. parent.SetAsLastSibling();
  80. });
  81. Text buttonLabel = new GameObject("Label", typeof(RectTransform), typeof(CanvasRenderer), typeof(Text)).GetComponent<Text>();
  82. buttonLabel.rectTransform.SetParent(button);
  83. buttonLabel.rectTransform.anchorMin = new Vector2(0f, 0f);
  84. buttonLabel.rectTransform.anchorMax = new Vector2(1f, 1f);
  85. buttonLabel.rectTransform.offsetMin = new Vector2(2.5f, 2.5f);
  86. buttonLabel.rectTransform.offsetMax = new Vector2(-2.5f, -2.5f);
  87. buttonLabel.font = ModConfigMenuText.GetComponent<TextMesh>().font;
  88. buttonLabel.horizontalOverflow = HorizontalWrapMode.Wrap;
  89. buttonLabel.verticalOverflow = VerticalWrapMode.Truncate;
  90. buttonLabel.alignment = TextAnchor.MiddleCenter;
  91. buttonLabel.text = Value;
  92. Entries = new RectTransform[Values.Length];
  93. for (int i = 0; i < Values.Length; i++)
  94. {
  95. int ic = i;
  96. RectTransform dropButton = new GameObject("Button", typeof(RectTransform), typeof(Button), typeof(CanvasRenderer), typeof(Image)).GetComponent<RectTransform>();
  97. dropButton.SetParent(button);
  98. dropButton.anchorMin = new Vector2(0.25f, 0f);
  99. dropButton.anchorMax = new Vector2(0.75f, 1f);
  100. dropButton.offsetMin = new Vector2(-42, -24 * i - 24);
  101. dropButton.offsetMax = new Vector2(42, -24 * i - 24);
  102. dropButton.GetComponent<Image>().sprite = MenuTile;
  103. dropButton.GetComponent<Image>().type = Image.Type.Sliced;
  104. dropButton.GetComponent<Image>().fillCenter = true;
  105. dropButton.GetComponent<Button>().onClick.AddListener(() =>
  106. {
  107. buttonLabel.text = Values[ic];
  108. Value = Values[ic];
  109. ValueSetter.Invoke(Values[ic]);
  110. for (int j = 0; j < Entries.Length; j++)
  111. {
  112. Entries[j].gameObject.SetActive(false);
  113. Entries[j].gameObject.GetComponent<RectTransform>().SetAsLastSibling();
  114. }
  115. });
  116. Text dropButtonLabel = new GameObject("Label", typeof(RectTransform), typeof(CanvasRenderer), typeof(Text)).GetComponent<Text>();
  117. dropButtonLabel.rectTransform.SetParent(dropButton);
  118. dropButtonLabel.rectTransform.anchorMin = new Vector2(0f, 0f);
  119. dropButtonLabel.rectTransform.anchorMax = new Vector2(1f, 1f);
  120. dropButtonLabel.rectTransform.offsetMin = new Vector2(2.5f, 2.5f);
  121. dropButtonLabel.rectTransform.offsetMax = new Vector2(-2.5f, -2.5f);
  122. dropButtonLabel.font = ModConfigMenuText.GetComponent<TextMesh>().font;
  123. dropButtonLabel.horizontalOverflow = HorizontalWrapMode.Wrap;
  124. dropButtonLabel.verticalOverflow = VerticalWrapMode.Truncate;
  125. dropButtonLabel.alignment = TextAnchor.MiddleCenter;
  126. dropButtonLabel.text = Values[i];
  127. Entries[i] = dropButton;
  128. dropButton.gameObject.SetActive(false);
  129. }
  130. }
  131. }
  132. }