hellcat-nardo-felidal/Assets/_PoiyomiShaders/Scripts/poi-tools/Editor/ThirdPartyIncluderAsset.cs
2023-09-09 21:16:23 -07:00

194 lines
11 KiB
C#
Executable file

using UnityEngine;
using UnityEditor;
using System;
using System.Reflection;
using UnityEditorInternal;
using System.Collections.Generic;
namespace Poi.Tools
{
[CreateAssetMenu(fileName = "ThirdPartyIncluderAsset", menuName = "Poi/ThirdPartyIncluderAsset", order = 2)]
public class ThirdPartyIncluderAsset : ScriptableObject
{
public enum ThirdPartyIncludeType
{
FileCopy,
DefineIfExists
}
[Serializable]
public struct ThirdPartyInclude
{
public ThirdPartyIncludeType type;
public string sourcePath;
public string sourceGUID;
public string destinationPath;
public string defineName;
}
public ThirdPartyInclude[] ThirdPartyIncludes;
}
[CustomEditor(typeof(ThirdPartyIncluderAsset))]
public class ThirdPartyIncluderAssetEditor : UnityEditor.Editor
{
private ReorderableList list;
private List<bool> listFoldouts = new List<bool>();
GUIContent headerGC = new GUIContent("Third Party Includers");
GUIContent typeGC = new GUIContent("Type");
GUIContent sourcePathGC = new GUIContent("Source Path");
GUIContent sourceGUIDGC = new GUIContent("Source GUID");
GUIContent destinationPathGC = new GUIContent("Destination Path");
GUIContent filePathGC = new GUIContent("File Path");
GUIContent defineNameGC = new GUIContent("Define Name");
GUIContent expandAllGC = new GUIContent("Expand All");
public override void OnInspectorGUI()
{
serializedObject.UpdateIfRequiredOrScript();
if (list == null)
{
list = new ReorderableList(serializedObject, serializedObject.FindProperty(nameof(ThirdPartyIncluderAsset.ThirdPartyIncludes)), true, true, true, true);
list.drawHeaderCallback = rect =>
{
var expandAllWidth = GUI.skin.label.CalcSize(expandAllGC).x;
var labelRect = new Rect(rect);
labelRect.width -= expandAllWidth;
GUI.Label(labelRect, headerGC);
var buttonRect = new Rect(rect);
buttonRect.x = labelRect.width;
buttonRect.width = expandAllWidth + 8f;
if (GUI.Button(buttonRect, expandAllGC))
{
for (int i = 0; i < list.count; i++)
{
list.serializedProperty.GetArrayElementAtIndex(i).isExpanded = true;
}
}
};
list.onAddCallback = _list =>
{
int index = _list.index == -1 ? _list.count - 1 : _list.index;
_list.serializedProperty.InsertArrayElementAtIndex(index);
_list.index = Mathf.Min(index + 1, _list.count - 1);
_list.serializedProperty.GetArrayElementAtIndex(_list.index).isExpanded = true;
};
list.onRemoveCallback = _list =>
{
int index = _list.index;
_list.serializedProperty.DeleteArrayElementAtIndex(index);
_list.index = Mathf.Max(index - 1, 0);
};
list.onReorderCallbackWithDetails = (_list, oldElementIndex, newElementIndex) =>
{
SerializedProperty newElement = _list.serializedProperty.GetArrayElementAtIndex(newElementIndex);
SerializedProperty oldElement = _list.serializedProperty.GetArrayElementAtIndex(oldElementIndex);
bool active = newElement.isExpanded;
newElement.isExpanded = oldElement.isExpanded;
oldElement.isExpanded = active;
};
list.elementHeightCallback = index =>
{
SerializedProperty element = list.serializedProperty.GetArrayElementAtIndex(index);
if (element.isExpanded)
{
var enumValue = element.FindPropertyRelative("type").enumValueIndex;
if (CompareTypeEnum(enumValue, ThirdPartyIncluderAsset.ThirdPartyIncludeType.FileCopy)) return EditorGUIUtility.singleLineHeight * 1.1f * 5f;
if (CompareTypeEnum(enumValue, ThirdPartyIncluderAsset.ThirdPartyIncludeType.DefineIfExists)) return EditorGUIUtility.singleLineHeight * 1.1f * 6f;
return EditorGUIUtility.singleLineHeight * 1.1f * 4f; // 4 for *now*
}
return EditorGUIUtility.singleLineHeight;
};
list.drawElementCallback = (rect, index, isActive, isFocused) =>
{
SerializedProperty element = list.serializedProperty.GetArrayElementAtIndex(index);
var typeElement = element.FindPropertyRelative(nameof(ThirdPartyIncluderAsset.ThirdPartyInclude.type));
var destinationPathElement = element.FindPropertyRelative(nameof(ThirdPartyIncluderAsset.ThirdPartyInclude.destinationPath));
string destFileName = "";
if (!string.IsNullOrEmpty(destinationPathElement.stringValue))
{
destFileName = System.IO.Path.GetFileName(destinationPathElement.stringValue);
}
string name = $"{index.ToString()} ({typeElement.enumDisplayNames[typeElement.enumValueIndex]}) {destFileName}";
var nameGC = new GUIContent(name);
float nameWidth = GUI.skin.label.CalcSize(nameGC).x;
element.isExpanded = EditorGUI.Foldout(new Rect(rect.x + 10f, rect.y, nameWidth, EditorGUIUtility.singleLineHeight), element.isExpanded, nameGC, true);
if (element.isExpanded)
{
float oldLabelWidth = EditorGUIUtility.labelWidth;
// Change label width to the biggest label
EditorGUIUtility.labelWidth = GUI.skin.label.CalcSize(destinationPathGC).x + 4f; // plus some padding
var sourcePathElement = element.FindPropertyRelative(nameof(ThirdPartyIncluderAsset.ThirdPartyInclude.sourcePath));
var sourceGUIDElement = element.FindPropertyRelative(nameof(ThirdPartyIncluderAsset.ThirdPartyInclude.sourceGUID));
var defineNameElement = element.FindPropertyRelative(nameof(ThirdPartyIncluderAsset.ThirdPartyInclude.defineName));
EditorGUI.PropertyField(new Rect(rect.x, rect.y + EditorGUIUtility.singleLineHeight * 1.1f * 1f, rect.width, EditorGUIUtility.singleLineHeight),
typeElement, typeGC);
if (CompareTypeEnum(typeElement.enumValueIndex, ThirdPartyIncluderAsset.ThirdPartyIncludeType.FileCopy))
{
EditorGUI.BeginChangeCheck();
EditorGUI.PropertyField(new Rect(rect.x, rect.y + EditorGUIUtility.singleLineHeight * 1.1f * 2f, rect.width, EditorGUIUtility.singleLineHeight),
sourcePathElement, sourcePathGC);
if (EditorGUI.EndChangeCheck())
{
if (!string.IsNullOrEmpty(sourcePathElement.stringValue))
{
string sourceGUID = AssetDatabase.AssetPathToGUID(sourcePathElement.stringValue);
if (!string.IsNullOrEmpty(sourceGUID))
{
sourceGUIDElement.stringValue = sourceGUID;
}
}
}
EditorGUI.PropertyField(new Rect(rect.x, rect.y + EditorGUIUtility.singleLineHeight * 1.1f * 3f, rect.width, EditorGUIUtility.singleLineHeight),
sourceGUIDElement, sourceGUIDGC);
EditorGUI.PropertyField(new Rect(rect.x, rect.y + EditorGUIUtility.singleLineHeight * 1.1f * 4f, rect.width, EditorGUIUtility.singleLineHeight),
destinationPathElement, destinationPathGC);
}
if (CompareTypeEnum(typeElement.enumValueIndex, ThirdPartyIncluderAsset.ThirdPartyIncludeType.DefineIfExists))
{
EditorGUI.BeginChangeCheck();
EditorGUI.PropertyField(new Rect(rect.x, rect.y + EditorGUIUtility.singleLineHeight * 1.1f * 2f, rect.width, EditorGUIUtility.singleLineHeight),
sourcePathElement, sourcePathGC);
if (EditorGUI.EndChangeCheck())
{
if (!string.IsNullOrEmpty(sourcePathElement.stringValue))
{
string sourceGUID = AssetDatabase.AssetPathToGUID(sourcePathElement.stringValue);
if (!string.IsNullOrEmpty(sourceGUID))
{
sourceGUIDElement.stringValue = sourceGUID;
}
}
}
EditorGUI.PropertyField(new Rect(rect.x, rect.y + EditorGUIUtility.singleLineHeight * 1.1f * 3f, rect.width, EditorGUIUtility.singleLineHeight),
sourceGUIDElement, sourceGUIDGC);
EditorGUI.PropertyField(new Rect(rect.x, rect.y + EditorGUIUtility.singleLineHeight * 1.1f * 4f, rect.width, EditorGUIUtility.singleLineHeight),
destinationPathElement, destinationPathGC);
EditorGUI.PropertyField(new Rect(rect.x, rect.y + EditorGUIUtility.singleLineHeight * 1.1f * 5f, rect.width, EditorGUIUtility.singleLineHeight),
defineNameElement, defineNameGC);
}
// Revert label width
EditorGUIUtility.labelWidth = oldLabelWidth;
}
};
}
list.DoLayoutList();
serializedObject.ApplyModifiedProperties();
}
bool CompareTypeEnum(int value, ThirdPartyIncluderAsset.ThirdPartyIncludeType type)
{
if (System.Enum.IsDefined(typeof(ThirdPartyIncluderAsset.ThirdPartyIncludeType), value))
{
return (ThirdPartyIncluderAsset.ThirdPartyIncludeType)value == type;
}
return false;
}
}
}