SelectionGrid.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using UnityEngine;
  3. namespace MeidoPhotoStudio.Plugin;
  4. public class SelectionGrid : BaseControl
  5. {
  6. private SimpleToggle[] toggles;
  7. private int selectedItemIndex;
  8. public SelectionGrid(string[] items, int selected = 0)
  9. {
  10. selectedItemIndex = Mathf.Clamp(selected, 0, items.Length - 1);
  11. toggles = MakeToggles(items);
  12. }
  13. public int SelectedItemIndex
  14. {
  15. get => selectedItemIndex;
  16. set
  17. {
  18. selectedItemIndex = Mathf.Clamp(value, 0, toggles.Length - 1);
  19. foreach (var toggle in toggles)
  20. toggle.Value = toggle.ToggleIndex == selectedItemIndex;
  21. OnControlEvent(EventArgs.Empty);
  22. }
  23. }
  24. public override void Draw(params GUILayoutOption[] layoutOptions)
  25. {
  26. GUILayout.BeginHorizontal();
  27. foreach (var toggle in toggles)
  28. toggle.Draw(layoutOptions);
  29. GUILayout.EndHorizontal();
  30. }
  31. public void SetItems(string[] items, int selectedItemIndex = -1)
  32. {
  33. if (selectedItemIndex < 0)
  34. selectedItemIndex = SelectedItemIndex;
  35. if (items.Length != toggles.Length)
  36. toggles = MakeToggles(items);
  37. else
  38. for (var i = 0; i < items.Length; i++)
  39. {
  40. var item = items[i];
  41. toggles[i].Value = i == SelectedItemIndex;
  42. toggles[i].Label = item;
  43. }
  44. SelectedItemIndex = Mathf.Clamp(selectedItemIndex, 0, items.Length - 1);
  45. }
  46. private SimpleToggle[] MakeToggles(string[] items)
  47. {
  48. var toggles = new SimpleToggle[items.Length];
  49. for (var i = 0; i < items.Length; i++)
  50. {
  51. var toggle = new SimpleToggle(items[i], i == SelectedItemIndex)
  52. {
  53. ToggleIndex = i,
  54. };
  55. toggle.ControlEvent += (sender, _) =>
  56. {
  57. var value = (sender as SimpleToggle).ToggleIndex;
  58. if (value != SelectedItemIndex)
  59. SelectedItemIndex = value;
  60. };
  61. toggles[i] = toggle;
  62. }
  63. return toggles;
  64. }
  65. private class SimpleToggle
  66. {
  67. public int ToggleIndex;
  68. public bool Value;
  69. public string Label;
  70. public SimpleToggle(string label, bool value = false)
  71. {
  72. Label = label;
  73. Value = value;
  74. }
  75. public event EventHandler ControlEvent;
  76. public void Draw(params GUILayoutOption[] layoutOptions)
  77. {
  78. var value = GUILayout.Toggle(Value, Label, layoutOptions);
  79. if (value == Value)
  80. return;
  81. if (!value)
  82. {
  83. Value = true;
  84. }
  85. else
  86. {
  87. Value = value;
  88. ControlEvent?.Invoke(this, EventArgs.Empty);
  89. }
  90. }
  91. }
  92. }