Toolbar.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using UnityEditor;
  4. using System;
  5. using System.Collections.Generic;
  6. namespace O3DWB
  7. {
  8. [Serializable]
  9. public abstract class Toolbar
  10. {
  11. #region Protected Variables
  12. [SerializeField]
  13. protected List<string> _normalStateButtonTexturePaths = new List<string>();
  14. [SerializeField]
  15. protected List<string> _activeStateButtonTexturePaths = new List<string>();
  16. [SerializeField]
  17. protected List<string> _buttonTooltips = new List<string>();
  18. [SerializeField]
  19. protected float _buttonScale = 1.0f;
  20. [SerializeField]
  21. protected bool _allowActiveStateForButtons = true;
  22. [SerializeField]
  23. protected bool _useBoxStyleForButtons = true;
  24. #endregion
  25. #region Public Static Properties
  26. public static float MinButtonScale { get { return 0.0001f; } }
  27. #endregion
  28. #region Public Properties
  29. public float ButtonScale { get { return _buttonScale; } set { _buttonScale = Mathf.Max(value, MinButtonScale); } }
  30. public bool AllowActiveStateForButtons { get { return _allowActiveStateForButtons; } set { _allowActiveStateForButtons = value; } }
  31. public bool UseBoxStyleForButtons { get { return _useBoxStyleForButtons; } set { _useBoxStyleForButtons = value; } }
  32. #endregion
  33. #region Constructors
  34. public Toolbar()
  35. {
  36. _normalStateButtonTexturePaths = GetNormalStateButtonTexturePaths();
  37. _activeStateButtonTexturePaths = GetActiveStateButtonTexturePaths();
  38. _buttonTooltips = GetButtonTooltips();
  39. }
  40. #endregion
  41. #region Public Methods
  42. public void Render()
  43. {
  44. RenderAllButtons();
  45. }
  46. #endregion
  47. #region Protected Abstract Methods
  48. protected abstract int GetNumberOfButtons();
  49. protected abstract List<string> GetButtonTooltips();
  50. protected abstract List<string> GetNormalStateButtonTexturePaths();
  51. protected abstract List<string> GetActiveStateButtonTexturePaths();
  52. protected abstract Color GetButtonColor(int buttonIndex);
  53. protected abstract int GetActiveButtonIndex();
  54. protected abstract void HandleButtonClick(int buttonIndex);
  55. #endregion
  56. #region Private Methods
  57. private void RenderAllButtons()
  58. {
  59. EditorGUILayoutEx.BeginHorizontalBox();
  60. int numberOfButtons = GetNumberOfButtons();
  61. for (int buttonIndex = 0; buttonIndex < numberOfButtons; ++buttonIndex)
  62. {
  63. RenderButton(buttonIndex);
  64. }
  65. EditorGUILayoutEx.EndHorizontalBox();
  66. }
  67. private void RenderButton(int buttonIndex)
  68. {
  69. EditorGUIColor.Push(GetButtonColor(buttonIndex));
  70. Texture2D buttonTexture = GetButtonTexture(buttonIndex);
  71. var buttonContent = new GUIContent();
  72. buttonContent.text = "";
  73. buttonContent.image = buttonTexture;
  74. buttonContent.tooltip = _buttonTooltips[buttonIndex];
  75. if (_useBoxStyleForButtons)
  76. {
  77. if (GUILayout.Button(buttonContent, "Box", GUILayout.Width(buttonTexture.width * _buttonScale), GUILayout.Height(buttonTexture.height * _buttonScale), GUILayout.ExpandWidth(false)))
  78. {
  79. HandleButtonClick(buttonIndex);
  80. }
  81. }
  82. else
  83. {
  84. if (GUILayout.Button(buttonContent, GUILayout.Width(buttonTexture.width * _buttonScale), GUILayout.Height(buttonTexture.height * _buttonScale), GUILayout.ExpandWidth(false)))
  85. {
  86. HandleButtonClick(buttonIndex);
  87. }
  88. }
  89. EditorGUIColor.Pop();
  90. }
  91. private Texture2D GetButtonTexture(int buttonIndex)
  92. {
  93. if (AllowActiveStateForButtons && buttonIndex == GetActiveButtonIndex() && _activeStateButtonTexturePaths.Count != 0) return TextureCache.Get().GetTextureAtRelativePath(_activeStateButtonTexturePaths[buttonIndex]);
  94. return TextureCache.Get().GetTextureAtRelativePath(_normalStateButtonTexturePaths[buttonIndex]);
  95. }
  96. #endregion
  97. }
  98. }
  99. #endif