mirror of
https://gitgud.io/AbstractConcept/rimworld-animation-studio.git
synced 2024-08-15 00:43:27 +00:00
Initial commit
This commit is contained in:
commit
3c7cc0c973
8391 changed files with 704313 additions and 0 deletions
|
@ -0,0 +1,196 @@
|
|||
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 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);
|
||||
}
|
||||
}
|
||||
|
||||
EditorGUI.PropertyField(vaRect, spriteListProp);
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue