SelectionGrid.cs 2.9 KB

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