ToolbarView.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor.Experimental.GraphView;
  5. using UnityEditor.UIElements;
  6. using UnityEngine.UIElements;
  7. using UnityEditor;
  8. using System.Linq;
  9. using System;
  10. using Status = UnityEngine.UIElements.DropdownMenuAction.Status;
  11. namespace GraphProcessor
  12. {
  13. public class ToolbarView : VisualElement
  14. {
  15. protected enum ElementType
  16. {
  17. Button,
  18. Toggle,
  19. DropDownButton,
  20. Separator,
  21. Custom,
  22. FlexibleSpace,
  23. }
  24. protected class ToolbarButtonData
  25. {
  26. public GUIContent content;
  27. public ElementType type;
  28. public bool value;
  29. public bool visible = true;
  30. public Action buttonCallback;
  31. public Action< bool > toggleCallback;
  32. public int size;
  33. public Action customDrawFunction;
  34. }
  35. List< ToolbarButtonData > leftButtonDatas = new List< ToolbarButtonData >();
  36. List< ToolbarButtonData > rightButtonDatas = new List< ToolbarButtonData >();
  37. protected BaseGraphView graphView;
  38. ToolbarButtonData showProcessor;
  39. ToolbarButtonData showParameters;
  40. public ToolbarView(BaseGraphView graphView)
  41. {
  42. name = "ToolbarView";
  43. this.graphView = graphView;
  44. graphView.initialized += () => {
  45. leftButtonDatas.Clear();
  46. rightButtonDatas.Clear();
  47. AddButtons();
  48. };
  49. Add(new IMGUIContainer(DrawImGUIToolbar));
  50. }
  51. protected ToolbarButtonData AddButton(string name, Action callback, bool left = true)
  52. => AddButton(new GUIContent(name), callback, left);
  53. protected ToolbarButtonData AddButton(GUIContent content, Action callback, bool left = true)
  54. {
  55. var data = new ToolbarButtonData{
  56. content = content,
  57. type = ElementType.Button,
  58. buttonCallback = callback
  59. };
  60. ((left) ? leftButtonDatas : rightButtonDatas).Add(data);
  61. return data;
  62. }
  63. protected void AddSeparator(int sizeInPixels = 10, bool left = true)
  64. {
  65. var data = new ToolbarButtonData{
  66. type = ElementType.Separator,
  67. size = sizeInPixels,
  68. };
  69. ((left) ? leftButtonDatas : rightButtonDatas).Add(data);
  70. }
  71. protected void AddCustom(Action imguiDrawFunction, bool left = true)
  72. {
  73. if (imguiDrawFunction == null)
  74. throw new ArgumentException("imguiDrawFunction can't be null");
  75. var data = new ToolbarButtonData{
  76. type = ElementType.Custom,
  77. customDrawFunction = imguiDrawFunction,
  78. };
  79. ((left) ? leftButtonDatas : rightButtonDatas).Add(data);
  80. }
  81. protected void AddFlexibleSpace(bool left = true)
  82. {
  83. ((left) ? leftButtonDatas : rightButtonDatas).Add(new ToolbarButtonData{ type = ElementType.FlexibleSpace });
  84. }
  85. protected ToolbarButtonData AddToggle(string name, bool defaultValue, Action< bool > callback, bool left = true)
  86. => AddToggle(new GUIContent(name), defaultValue, callback, left);
  87. protected ToolbarButtonData AddToggle(GUIContent content, bool defaultValue, Action< bool > callback, bool left = true)
  88. {
  89. var data = new ToolbarButtonData{
  90. content = content,
  91. type = ElementType.Toggle,
  92. value = defaultValue,
  93. toggleCallback = callback
  94. };
  95. ((left) ? leftButtonDatas : rightButtonDatas).Add(data);
  96. return data;
  97. }
  98. protected ToolbarButtonData AddDropDownButton(string name, Action callback, bool left = true)
  99. => AddDropDownButton(new GUIContent(name), callback, left);
  100. protected ToolbarButtonData AddDropDownButton(GUIContent content, Action callback, bool left = true)
  101. {
  102. var data = new ToolbarButtonData{
  103. content = content,
  104. type = ElementType.DropDownButton,
  105. buttonCallback = callback
  106. };
  107. ((left) ? leftButtonDatas : rightButtonDatas).Add(data);
  108. return data;
  109. }
  110. /// <summary>
  111. /// Also works for toggles
  112. /// </summary>
  113. /// <param name="name"></param>
  114. /// <param name="left"></param>
  115. protected void RemoveButton(string name, bool left)
  116. {
  117. ((left) ? leftButtonDatas : rightButtonDatas).RemoveAll(b => b.content.text == name);
  118. }
  119. /// <summary>
  120. /// Hide the button
  121. /// </summary>
  122. /// <param name="name">Display name of the button</param>
  123. protected void HideButton(string name)
  124. {
  125. leftButtonDatas.Concat(rightButtonDatas).All(b => {
  126. if (b?.content?.text == name)
  127. b.visible = false;
  128. return true;
  129. });
  130. }
  131. /// <summary>
  132. /// Show the button
  133. /// </summary>
  134. /// <param name="name">Display name of the button</param>
  135. protected void ShowButton(string name)
  136. {
  137. leftButtonDatas.Concat(rightButtonDatas).All(b => {
  138. if (b?.content?.text == name)
  139. b.visible = true;
  140. return true;
  141. });
  142. }
  143. protected virtual void AddButtons()
  144. {
  145. AddButton("Center", graphView.ResetPositionAndZoom);
  146. bool processorVisible = graphView.GetPinnedElementStatus< ProcessorView >() != Status.Hidden;
  147. showProcessor = AddToggle("Show Processor", processorVisible, (v) => graphView.ToggleView< ProcessorView>());
  148. bool exposedParamsVisible = graphView.GetPinnedElementStatus< ExposedParameterView >() != Status.Hidden;
  149. showParameters = AddToggle("Show Parameters", exposedParamsVisible, (v) => graphView.ToggleView< ExposedParameterView>());
  150. AddButton("Show In Project", () => EditorGUIUtility.PingObject(graphView.graph), false);
  151. }
  152. public virtual void UpdateButtonStatus()
  153. {
  154. if (showProcessor != null)
  155. showProcessor.value = graphView.GetPinnedElementStatus< ProcessorView >() != Status.Hidden;
  156. if (showParameters != null)
  157. showParameters.value = graphView.GetPinnedElementStatus< ExposedParameterView >() != Status.Hidden;
  158. }
  159. void DrawImGUIButtonList(List< ToolbarButtonData > buttons)
  160. {
  161. foreach (var button in buttons.ToList())
  162. {
  163. if (!button.visible)
  164. continue;
  165. switch (button.type)
  166. {
  167. case ElementType.Button:
  168. if (GUILayout.Button(button.content, EditorStyles.toolbarButton) && button.buttonCallback != null)
  169. button.buttonCallback();
  170. break;
  171. case ElementType.Toggle:
  172. EditorGUI.BeginChangeCheck();
  173. button.value = GUILayout.Toggle(button.value, button.content, EditorStyles.toolbarButton);
  174. if (EditorGUI.EndChangeCheck() && button.toggleCallback != null)
  175. button.toggleCallback(button.value);
  176. break;
  177. case ElementType.DropDownButton:
  178. if (EditorGUILayout.DropdownButton(button.content, FocusType.Passive, EditorStyles.toolbarDropDown))
  179. button.buttonCallback();
  180. break;
  181. case ElementType.Separator:
  182. EditorGUILayout.Separator();
  183. EditorGUILayout.Space(button.size);
  184. break;
  185. case ElementType.Custom:
  186. button.customDrawFunction();
  187. break;
  188. case ElementType.FlexibleSpace:
  189. GUILayout.FlexibleSpace();
  190. break;
  191. }
  192. }
  193. }
  194. protected virtual void DrawImGUIToolbar()
  195. {
  196. GUILayout.BeginHorizontal(EditorStyles.toolbar);
  197. DrawImGUIButtonList(leftButtonDatas);
  198. GUILayout.FlexibleSpace();
  199. DrawImGUIButtonList(rightButtonDatas);
  200. GUILayout.EndHorizontal();
  201. }
  202. }
  203. }