15using UnityEditorInternal;
19 [CustomEditor(typeof(DefinitionBase))]
35 protected void drawExportFolder(SerializedProperty prop,
string buildText,
string label) {
36 EditorGUILayout.BeginHorizontal();
39 if (
target.TryGetPackageExportFolder(out folder, promptIfNotDefined:
false)) {
40 EditorGUILayout.TextField(label, folder);
42 EditorGUILayout.LabelField(label);
45 if (GUILayout.Button(
"Change", GUILayout.ExpandWidth(
false))) {
46 target.PrompUserToSetExportPath();
49 EditorGUILayout.EndHorizontal();
51 if (GUILayout.Button(buildText, GUILayout.MinHeight(EditorGUIUtility.singleLineHeight * 2))) {
52 EditorApplication.delayCall += () =>
OnBuild();
54 GUILayout.Space(EditorGUIUtility.singleLineHeight * 2);
57 private void drawDefName(SerializedProperty property) {
58 string newName = EditorGUILayout.DelayedTextField(
"Package Name", property.stringValue);
59 string filteredName =
new string(newName.Where(c =>
char.IsLetterOrDigit(c) || c ==
' ').ToArray()).Trim();
61 if (filteredName !=
"" && filteredName != property.stringValue) {
62 property.stringValue = filteredName;
64 if (
target.ShowInBuildMenu) {
65 property.serializedObject.ApplyModifiedProperties();
66 generateBuildMenuScript();
71 private void drawGenerateBuildDropdown(SerializedProperty property) {
72 EditorGUI.BeginChangeCheck();
73 EditorGUILayout.PropertyField(property);
74 if (EditorGUI.EndChangeCheck()) {
75 property.serializedObject.ApplyModifiedProperties();
76 generateBuildMenuScript();
80 private void generateBuildMenuScript() {
81 string typeName = typeof(T).Name;
83 var definitions = AssetDatabase.FindAssets(
"t:" + typeName).
84 Select(guid => AssetDatabase.GUIDToAssetPath(guid)).
85 Select(path => AssetDatabase.LoadAssetAtPath<DefinitionBase>(path)).
86 OrderBy(def => def.DefinitionName).
89 StringBuilder builder =
new StringBuilder();
90 builder.AppendLine(
"using UnityEditor;");
92 builder.AppendLine(
"namespace Leap.Unity.Packaging {");
94 builder.AppendLine(
" public class " + typeName +
"BuildMenuItems { ");
96 foreach (var def
in definitions) {
97 if (!def.ShowInBuildMenu)
continue;
99 string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(def));
101 builder.AppendLine(
"");
102 builder.AppendLine(
" // " + def.DefinitionName);
103 builder.AppendLine(
" [MenuItem(\"Build/" + def.DefinitionName +
"\", priority = " +
GetBuildMenuPriority() +
")]");
104 builder.AppendLine(
" public static void Build_" + guid +
"() {");
105 builder.AppendLine(
" " + typeName +
"." +
GetBuildMethodName() +
"(\"" + guid +
"\");");
106 builder.AppendLine(
" }");
109 builder.AppendLine(
" }");
110 builder.AppendLine(
"}");
111 builder.AppendLine();
113 File.WriteAllText(
"Assets/Plugins/LeapMotion/Internal/Package/Editor/" + typeName +
"BuildMenuItems.cs", builder.ToString());
114 AssetDatabase.Refresh();
117 protected ReorderableList
createList(
string propertyName, Action<Rect, SerializedProperty> drawMethod) {
118 SerializedProperty listProperty = serializedObject.FindProperty(propertyName);
120 var list =
new ReorderableList(serializedObject, listProperty,
123 displayAddButton:
true,
124 displayRemoveButton:
true);
126 list.drawElementCallback += (rect, index, isActive, isFocused) => {
127 SerializedProperty
property = list.serializedProperty.GetArrayElementAtIndex(index);
128 drawMethod(rect, property);
131 list.drawHeaderCallback += (rect) => {
132 GUI.Label(rect, listProperty.displayName);
135 list.elementHeight = EditorGUIUtility.singleLineHeight;
void specifyCustomDrawer(string propertyName, Action< SerializedProperty > propertyDrawer)
Specify a callback to be used to draw a specific named property. Should be called in OnEnable.
abstract int GetBuildMenuPriority()
ReorderableList createList(string propertyName, Action< Rect, SerializedProperty > drawMethod)
void drawExportFolder(SerializedProperty prop, string buildText, string label)
abstract string GetBuildMethodName()