| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | 
							- using System;
 
- using System.Collections;
 
- using System.Collections.Generic;
 
- using UnityEditor;
 
- using UnityEngine;
 
- using XNode;
 
- using XNodeEditor;
 
- namespace XNodeEditor {
 
- 	[CustomPropertyDrawer(typeof(NodeEnumAttribute))]
 
- 	public class NodeEnumDrawer : PropertyDrawer {
 
- 		public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
 
- 			EditorGUI.BeginProperty(position, label, property);
 
- 			EnumPopup(position, property, label);
 
- 			EditorGUI.EndProperty();
 
- 		}
 
- 		public static void EnumPopup(Rect position, SerializedProperty property, GUIContent label) {
 
- 			// Throw error on wrong type
 
- 			if (property.propertyType != SerializedPropertyType.Enum) {
 
- 				throw new ArgumentException("Parameter selected must be of type System.Enum");
 
- 			}
 
- 			// Add label
 
- 			position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
 
- 			// Get current enum name
 
- 			string enumName = "";
 
- 			if (property.enumValueIndex >= 0 && property.enumValueIndex < property.enumDisplayNames.Length) enumName = property.enumDisplayNames[property.enumValueIndex];
 
- #if UNITY_2017_1_OR_NEWER
 
- 			// Display dropdown
 
- 			if (EditorGUI.DropdownButton(position, new GUIContent(enumName), FocusType.Passive)) {
 
- 				// Position is all wrong if we show the dropdown during the node draw phase.
 
- 				// Instead, add it to onLateGUI to display it later.
 
- 				NodeEditorWindow.current.onLateGUI += () => ShowContextMenuAtMouse(property);
 
- 			}
 
- #else
 
- 			// Display dropdown
 
- 			if (GUI.Button(position, new GUIContent(enumName), "MiniPopup")) {
 
- 				// Position is all wrong if we show the dropdown during the node draw phase.
 
- 				// Instead, add it to onLateGUI to display it later.
 
- 				NodeEditorWindow.current.onLateGUI += () => ShowContextMenuAtMouse(property);
 
- 			}
 
- #endif
 
- 		}
 
- 		public static void ShowContextMenuAtMouse(SerializedProperty property) {
 
- 			// Initialize menu
 
- 			GenericMenu menu = new GenericMenu();
 
- 			// Add all enum display names to menu
 
- 			for (int i = 0; i < property.enumDisplayNames.Length; i++) {
 
- 				int index = i;
 
- 				menu.AddItem(new GUIContent(property.enumDisplayNames[i]), false, () => SetEnum(property, index));
 
- 			}
 
- 			// Display at cursor position
 
- 			Rect r = new Rect(Event.current.mousePosition, new Vector2(0, 0));
 
- 			menu.DropDown(r);
 
- 		}
 
- 		private static void SetEnum(SerializedProperty property, int index) {
 
- 			property.enumValueIndex = index;
 
- 			property.serializedObject.ApplyModifiedProperties();
 
- 			property.serializedObject.Update();
 
- 		}
 
- 	}
 
- }
 
 
  |