71 lines
2.5 KiB
C#
71 lines
2.5 KiB
C#
|
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();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|