| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 | using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEditor.Experimental.GraphView;using UnityEditor.UIElements;using UnityEngine.UIElements;using UnityEditor;using System.Linq;using System;using Status = UnityEngine.UIElements.DropdownMenuAction.Status;namespace GraphProcessor{	public class ToolbarView : VisualElement	{		protected enum ElementType		{			Button,			Toggle,			DropDownButton,			Separator,			Custom,			FlexibleSpace,		}		protected class ToolbarButtonData		{			public GUIContent		content;			public ElementType		type;			public bool				value;			public bool				visible = true;			public Action			buttonCallback;			public Action< bool >	toggleCallback;			public int				size;			public Action			customDrawFunction;		}		List< ToolbarButtonData >	leftButtonDatas = new List< ToolbarButtonData >();		List< ToolbarButtonData >	rightButtonDatas = new List< ToolbarButtonData >();		protected BaseGraphView		graphView;				ToolbarButtonData showProcessor;		ToolbarButtonData showParameters;		public ToolbarView(BaseGraphView graphView)		{			name = "ToolbarView";			this.graphView = graphView;			graphView.initialized += () => {				leftButtonDatas.Clear();				rightButtonDatas.Clear();				AddButtons();			};			Add(new IMGUIContainer(DrawImGUIToolbar));		}		protected ToolbarButtonData AddButton(string name, Action callback, bool left = true)			=> AddButton(new GUIContent(name), callback, left);		protected ToolbarButtonData AddButton(GUIContent content, Action callback, bool left = true)		{			var data = new ToolbarButtonData{				content = content,				type = ElementType.Button,				buttonCallback = callback			};			((left) ? leftButtonDatas : rightButtonDatas).Add(data);			return data;		}		protected void AddSeparator(int sizeInPixels = 10, bool left = true)		{			var data = new ToolbarButtonData{				type = ElementType.Separator,				size = sizeInPixels,			};			((left) ? leftButtonDatas : rightButtonDatas).Add(data);		}		protected void AddCustom(Action imguiDrawFunction, bool left = true)		{			if (imguiDrawFunction == null)				throw new ArgumentException("imguiDrawFunction can't be null");			var data = new ToolbarButtonData{				type = ElementType.Custom,				customDrawFunction = imguiDrawFunction,			};			((left) ? leftButtonDatas : rightButtonDatas).Add(data);		}		protected void AddFlexibleSpace(bool left = true)		{			((left) ? leftButtonDatas : rightButtonDatas).Add(new ToolbarButtonData{ type = ElementType.FlexibleSpace });		}		protected ToolbarButtonData AddToggle(string name, bool defaultValue, Action< bool > callback, bool left = true)			=> AddToggle(new GUIContent(name), defaultValue, callback, left);		protected ToolbarButtonData AddToggle(GUIContent content, bool defaultValue, Action< bool > callback, bool left = true)		{			var data = new ToolbarButtonData{				content = content,				type = ElementType.Toggle,				value = defaultValue,				toggleCallback = callback			};			((left) ? leftButtonDatas : rightButtonDatas).Add(data);			return data;		}		protected ToolbarButtonData AddDropDownButton(string name, Action callback, bool left = true)			=> AddDropDownButton(new GUIContent(name), callback, left);		protected ToolbarButtonData AddDropDownButton(GUIContent content, Action callback, bool left = true)		{			var data = new ToolbarButtonData{				content = content,				type = ElementType.DropDownButton,				buttonCallback = callback			};			((left) ? leftButtonDatas : rightButtonDatas).Add(data);			return data;		}		/// <summary>		/// Also works for toggles		/// </summary>		/// <param name="name"></param>		/// <param name="left"></param>		protected void RemoveButton(string name, bool left)		{			((left) ? leftButtonDatas : rightButtonDatas).RemoveAll(b => b.content.text == name);		}				/// <summary>		/// Hide the button		/// </summary>		/// <param name="name">Display name of the button</param>		protected void HideButton(string name)		{			leftButtonDatas.Concat(rightButtonDatas).All(b => {				if (b?.content?.text == name)					b.visible = false;				return true;			});		}		/// <summary>		/// Show the button		/// </summary>		/// <param name="name">Display name of the button</param>		protected void ShowButton(string name)		{			leftButtonDatas.Concat(rightButtonDatas).All(b => {				if (b?.content?.text == name)					b.visible = true;				return true;			});		}		protected virtual void AddButtons()		{			AddButton("Center", graphView.ResetPositionAndZoom);			bool processorVisible = graphView.GetPinnedElementStatus< ProcessorView >() != Status.Hidden;			showProcessor = AddToggle("Show Processor", processorVisible, (v) => graphView.ToggleView< ProcessorView>());			bool exposedParamsVisible = graphView.GetPinnedElementStatus< ExposedParameterView >() != Status.Hidden;			showParameters = AddToggle("Show Parameters", exposedParamsVisible, (v) => graphView.ToggleView< ExposedParameterView>());			AddButton("Show In Project", () => EditorGUIUtility.PingObject(graphView.graph), false);		}		public virtual void UpdateButtonStatus()		{			if (showProcessor != null)				showProcessor.value = graphView.GetPinnedElementStatus< ProcessorView >() != Status.Hidden;			if (showParameters != null)				showParameters.value = graphView.GetPinnedElementStatus< ExposedParameterView >() != Status.Hidden;		}		void DrawImGUIButtonList(List< ToolbarButtonData > buttons)		{			foreach (var button in buttons.ToList())			{				if (!button.visible)					continue;				switch (button.type)				{					case ElementType.Button:						if (GUILayout.Button(button.content, EditorStyles.toolbarButton) && button.buttonCallback != null)							button.buttonCallback();						break;					case ElementType.Toggle:						EditorGUI.BeginChangeCheck();						button.value = GUILayout.Toggle(button.value, button.content, EditorStyles.toolbarButton);						if (EditorGUI.EndChangeCheck() && button.toggleCallback != null)							button.toggleCallback(button.value);						break;					case ElementType.DropDownButton:						if (EditorGUILayout.DropdownButton(button.content, FocusType.Passive, EditorStyles.toolbarDropDown))							button.buttonCallback();						break;					case ElementType.Separator:						EditorGUILayout.Separator();						EditorGUILayout.Space(button.size);						break;					case ElementType.Custom:						button.customDrawFunction();						break;					case ElementType.FlexibleSpace:						GUILayout.FlexibleSpace();						break;				}			}		}		protected virtual void DrawImGUIToolbar()		{			GUILayout.BeginHorizontal(EditorStyles.toolbar);			DrawImGUIButtonList(leftButtonDatas);			GUILayout.FlexibleSpace();			DrawImGUIButtonList(rightButtonDatas);			GUILayout.EndHorizontal();		}	}}
 |