123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- using UnityEditor.U2D.Animation;
- using UnityEditorInternal;
- using UnityEngine;
- using UnityEngine.Experimental.U2D.Animation;
- namespace UnityEditor.Experimental.U2D.Animation
- {
- [CustomEditor(typeof(SpriteLibraryAsset))]
- internal class SpriteLibraryAssetInspector : Editor
- {
- static class Style
- {
- public static GUIContent duplicateWarningText = EditorGUIUtility.TrTextContent("Duplicate name found or name hash clashes. Please use a different name");
- public static GUIContent duplicateWarning = EditorGUIUtility.TrIconContent("console.warnicon.sml", duplicateWarningText.text);
- public static GUIContent nameLabel = new GUIContent(TextContent.label);
- public static string categoryListLabel = L10n.Tr("Category List");
- public static int lineSpacing = 3;
- }
- private SerializedProperty m_Labels;
- private ReorderableList m_LabelReorderableList;
- private bool m_UpdateHash = false;
- private readonly float kElementHeight = EditorGUIUtility.singleLineHeight * 3;
- public void OnEnable()
- {
- m_Labels = serializedObject.FindProperty("m_Labels");
- m_LabelReorderableList = new ReorderableList(serializedObject, m_Labels, true, false, true, true);
- SetupOrderList();
- }
- public void OnDisable()
- {
- var sla = target as SpriteLibraryAsset;
- if (sla != null)
- sla.UpdateHashes();
- }
- float GetElementHeight(int index)
- {
- var property = m_Labels.GetArrayElementAtIndex(index);
- var spriteListProp = property.FindPropertyRelative("m_CategoryList");
- if (spriteListProp.isExpanded)
- return (spriteListProp.arraySize + 1) * (EditorGUIUtility.singleLineHeight + Style.lineSpacing) + kElementHeight;
- return kElementHeight;
- }
- void DrawElement(Rect rect, int index, bool selected, bool focused)
- {
- var property = m_Labels.GetArrayElementAtIndex(index);
- var catRect = new Rect(rect.x, rect.y, rect.width - kElementHeight, EditorGUIUtility.singleLineHeight);
- var vaRect = new Rect(rect.x, rect.y + EditorGUIUtility.singleLineHeight, rect.width - kElementHeight, EditorGUIUtility.singleLineHeight);
- var categoryProp = property.FindPropertyRelative("m_Name");
- var spriteListProp = property.FindPropertyRelative("m_CategoryList");
- EditorGUI.BeginChangeCheck();
- var newCatName = EditorGUI.DelayedTextField(catRect, categoryProp.stringValue);
- if (EditorGUI.EndChangeCheck())
- {
- newCatName = newCatName.Trim();
- m_UpdateHash = true;
- if (categoryProp.stringValue != newCatName)
- {
- // Check if this nameLabel is already taken
- if (!IsNameInUsed(newCatName, m_Labels, "m_Name", 0))
- categoryProp.stringValue = newCatName;
- else
- Debug.LogWarning(Style.duplicateWarningText.text);
- }
- }
- spriteListProp.isExpanded = EditorGUI.Foldout(vaRect, spriteListProp.isExpanded, Style.categoryListLabel, true);
- if (spriteListProp.isExpanded)
- {
- EditorGUI.indentLevel++;
- var indentedRect = EditorGUI.IndentedRect(vaRect);
- var labelWidth = EditorGUIUtility.labelWidth;
- EditorGUIUtility.labelWidth = 40 + indentedRect.x - vaRect.x;
- indentedRect.y += EditorGUIUtility.singleLineHeight + Style.lineSpacing;
- var sizeRect = indentedRect;
- int size = EditorGUI.IntField(sizeRect, TextContent.size, spriteListProp.arraySize);
- if (size != spriteListProp.arraySize && size >= 0)
- spriteListProp.arraySize = size;
- indentedRect.y += EditorGUIUtility.singleLineHeight + Style.lineSpacing;
- DrawSpriteListProperty(indentedRect, spriteListProp);
- EditorGUIUtility.labelWidth = labelWidth;
- EditorGUI.indentLevel--;
- }
- }
- void DrawSpriteListProperty(Rect rect, SerializedProperty spriteListProp)
- {
- for (int i = 0; i < spriteListProp.arraySize; ++i)
- {
- var element = spriteListProp.GetArrayElementAtIndex(i);
- EditorGUI.BeginChangeCheck();
- var oldName = element.FindPropertyRelative("m_Name").stringValue;
- var nameRect = new Rect(rect.x, rect.y, rect.width / 2, EditorGUIUtility.singleLineHeight);
- bool nameDuplicate = IsNameInUsed(oldName, spriteListProp, "m_Name", 1);
- if (nameDuplicate)
- {
- nameRect.width -= 20;
- }
- var newName = EditorGUI.DelayedTextField(
- nameRect,
- Style.nameLabel,
- oldName);
- if (nameDuplicate)
- {
- nameRect.x += nameRect.width;
- nameRect.width = 20;
- GUI.Label(nameRect, Style.duplicateWarning);
- }
- if (EditorGUI.EndChangeCheck())
- {
- newName = newName.Trim();
- element.FindPropertyRelative("m_Name").stringValue = newName;
- }
- EditorGUI.PropertyField(new Rect(rect.x + rect.width / 2 + 5, rect.y, rect.width / 2, EditorGUIUtility.singleLineHeight),
- element.FindPropertyRelative("m_Sprite"));
- rect.y += EditorGUIUtility.singleLineHeight + Style.lineSpacing;
- }
- }
- public override void OnInspectorGUI()
- {
- serializedObject.Update();
- EditorGUI.BeginChangeCheck();
- if (EditorGUI.EndChangeCheck())
- SetupOrderList();
- m_UpdateHash = false;
- m_LabelReorderableList.DoLayoutList();
- serializedObject.ApplyModifiedProperties();
- if (m_UpdateHash)
- (target as SpriteLibraryAsset).UpdateHashes();
- }
- bool IsNameInUsed(string name, SerializedProperty property, string propertyField, int threshold)
- {
- int count = 0;
- var nameHash = SpriteLibraryAsset.GetStringHash(name);
- for (int i = 0; i < property.arraySize; ++i)
- {
- var sp = property.GetArrayElementAtIndex(i);
- var otherName = sp.FindPropertyRelative(propertyField).stringValue;
- var otherNameHash = SpriteLibraryAsset.GetStringHash(otherName);
- if (otherName == name || nameHash == otherNameHash)
- {
- count++;
- if (count > threshold)
- return true;
- }
- }
- return false;
- }
- void OnAddCallback(ReorderableList list)
- {
- var oldSize = m_Labels.arraySize;
- m_Labels.arraySize += 1;
- const string kNewCatName = "New Category";
- string newCatName = kNewCatName;
- int catNameIncrement = 1;
- while (true)
- {
- if (IsNameInUsed(newCatName, m_Labels, "m_Name", 0))
- newCatName = string.Format("{0} {1}", kNewCatName, catNameIncrement++);
- else
- break;
- }
- var sp = m_Labels.GetArrayElementAtIndex(oldSize);
- sp.FindPropertyRelative("m_Name").stringValue = newCatName;
- sp.FindPropertyRelative("m_Hash").intValue = SpriteLibraryAsset.GetStringHash(newCatName);
- }
- private void SetupOrderList()
- {
- m_LabelReorderableList.drawElementCallback = DrawElement;
- m_LabelReorderableList.elementHeight = kElementHeight;
- m_LabelReorderableList.elementHeightCallback = GetElementHeight;
- m_LabelReorderableList.onAddCallback = OnAddCallback;
- }
- }
- }
|