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();
- }
- }
- }
|