105 lines
3.8 KiB
C#
105 lines
3.8 KiB
C#
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
namespace Pathfinding.Util {
|
|
/// <summary>Some editor gui helper methods</summary>
|
|
public static class EditorGUILayoutHelper {
|
|
/// <summary>
|
|
/// Tag names and an additional 'Edit Tags...' entry.
|
|
/// Used for SingleTagField
|
|
/// </summary>
|
|
static GUIContent[] tagNamesAndEditTagsButton;
|
|
static int[] tagValues = new [] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, -1 };
|
|
|
|
/// <summary>
|
|
/// Last time tagNamesAndEditTagsButton was updated.
|
|
/// Uses EditorApplication.timeSinceStartup
|
|
/// </summary>
|
|
static double timeLastUpdatedTagNames;
|
|
|
|
static void FindTagNames () {
|
|
// Make sure the AstarPath object is initialized, this is required to be able to show tag names in the popup
|
|
AstarPath.FindAstarPath();
|
|
|
|
// Make sure the tagNamesAndEditTagsButton is relatively up to date
|
|
if (tagNamesAndEditTagsButton == null || EditorApplication.timeSinceStartup - timeLastUpdatedTagNames > 1) {
|
|
timeLastUpdatedTagNames = EditorApplication.timeSinceStartup;
|
|
tagNamesAndEditTagsButton = new GUIContent[GraphNode.MaxTagIndex + 2];
|
|
if (AstarPath.active != null) {
|
|
var tagNames = AstarPath.active.GetTagNames();
|
|
for (int i = 0; i <= GraphNode.MaxTagIndex; i++) {
|
|
if (AstarPath.active == null) tagNamesAndEditTagsButton[i] = new GUIContent("Tag " + i + (i == GraphNode.MaxTagIndex ? "+" : ""));
|
|
else {
|
|
var tagName = tagNames[i];
|
|
if (tagName != i.ToString()) {
|
|
tagNamesAndEditTagsButton[i] = new GUIContent(tagName + " (tag " + i + ")");
|
|
} else {
|
|
tagNamesAndEditTagsButton[i] = new GUIContent("Tag " + i);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
for (int i = 0; i <= GraphNode.MaxTagIndex; i++) {
|
|
tagNamesAndEditTagsButton[i] = new GUIContent("Tag " + i + (i == GraphNode.MaxTagIndex ? "+" : ""));
|
|
}
|
|
}
|
|
tagNamesAndEditTagsButton[tagNamesAndEditTagsButton.Length-1] = new GUIContent("Edit Tags...");
|
|
}
|
|
}
|
|
|
|
public static int TagField (int value, System.Action editCallback) {
|
|
FindTagNames();
|
|
value = Mathf.Clamp(value, 0, GraphNode.MaxTagIndex);
|
|
|
|
var newValue = EditorGUILayout.IntPopup(value, tagNamesAndEditTagsButton, tagValues);
|
|
|
|
// Last element corresponds to the 'Edit Tags...' entry. Open the tag editor
|
|
if (newValue == -1) {
|
|
editCallback();
|
|
} else {
|
|
value = newValue;
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
public static int TagField (Rect rect, GUIContent label, int value, System.Action editCallback) {
|
|
FindTagNames();
|
|
// Tags are between 0 and GraphNode.MaxTagIndex
|
|
value = Mathf.Clamp(value, 0, GraphNode.MaxTagIndex);
|
|
|
|
var newValue = EditorGUI.IntPopup(rect, label, value, tagNamesAndEditTagsButton, tagValues);
|
|
|
|
// Last element corresponds to the 'Edit Tags...' entry. Open the tag editor
|
|
if (newValue == -1) {
|
|
editCallback();
|
|
} else {
|
|
value = newValue;
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
public static int TagField (GUIContent label, int value, System.Action editCallback) {
|
|
return TagField(GUILayoutUtility.GetRect(label, EditorStyles.popup), label, value, editCallback);
|
|
}
|
|
|
|
public static void TagField (Rect position, GUIContent label, SerializedProperty property, System.Action editCallback) {
|
|
FindTagNames();
|
|
EditorGUI.BeginChangeCheck();
|
|
EditorGUI.showMixedValue = property.hasMultipleDifferentValues;
|
|
property = property.FindPropertyRelative("value");
|
|
var newValue = EditorGUI.IntPopup(position, label, (int)property.intValue, tagNamesAndEditTagsButton, tagValues);
|
|
|
|
if (EditorGUI.EndChangeCheck() || property.intValue < 0 || property.intValue > GraphNode.MaxTagIndex) {
|
|
if (newValue == -1) {
|
|
editCallback();
|
|
} else {
|
|
property.intValue = Mathf.Clamp(newValue, 0, GraphNode.MaxTagIndex);
|
|
}
|
|
}
|
|
EditorGUI.showMixedValue = false;
|
|
}
|
|
}
|
|
}
|