A game about forced loneliness, made by TACStudios
1using System;
2using UnityEditor.AssetImporters;
3using UnityEngine;
4using UnityEngine.U2D.Animation;
5using Object = UnityEngine.Object;
6
7namespace UnityEditor.U2D.Animation
8{
9 [CanEditMultipleObjects]
10 [CustomEditor(typeof(SpriteLibrarySourceAssetImporter))]
11 internal class SpriteLibrarySourceAssetImporterInspector : ScriptedImporterEditor
12 {
13 static class Contents
14 {
15 public static readonly GUIContent openInSpriteLibraryEditor = new(L10n.Tr("Open in Sprite Library Editor"));
16 }
17
18 static class Style
19 {
20 public static readonly GUIContent mainAssetLabel = new("Main Library");
21 }
22
23 SerializedProperty m_PrimaryLibraryGUID;
24
25 public override bool showImportedObject => false;
26 protected override Type extraDataType => typeof(SpriteLibrarySourceAsset);
27
28 public override void OnEnable()
29 {
30 base.OnEnable();
31 m_PrimaryLibraryGUID = extraDataSerializedObject.FindProperty(SpriteLibrarySourceAssetPropertyString.primaryLibraryGUID);
32 }
33
34 protected override void InitializeExtraDataInstance(Object extraTarget, int targetIndex)
35 {
36 var assetPath = ((AssetImporter)targets[targetIndex]).assetPath;
37 var savedAsset = SpriteLibrarySourceAssetImporter.LoadSpriteLibrarySourceAsset(assetPath);
38 if (savedAsset != null)
39 {
40 // Add entries from Main Library Asset.
41 if (!SpriteLibrarySourceAssetImporter.HasValidMainLibrary(savedAsset, assetPath))
42 savedAsset.SetPrimaryLibraryGUID(string.Empty);
43 SpriteLibrarySourceAssetImporter.UpdateSpriteLibrarySourceAssetLibraryWithMainAsset(savedAsset);
44
45 (extraTarget as SpriteLibrarySourceAsset).InitializeWithAsset(savedAsset);
46 }
47 }
48
49 public override void OnInspectorGUI()
50 {
51 if (GUILayout.Button(Contents.openInSpriteLibraryEditor))
52 {
53 var path = ((AssetImporter)target).assetPath;
54 var asset = AssetDatabase.LoadAssetAtPath<SpriteLibraryAsset>(path);
55 SpriteLibraryEditor.SpriteLibraryEditorWindow.OpenWindowForAsset(asset);
56 }
57
58 GUILayout.Space(10);
59
60 serializedObject.Update();
61 extraDataSerializedObject.Update();
62 DoMainAssetGUI();
63 serializedObject.ApplyModifiedProperties();
64 extraDataSerializedObject.ApplyModifiedProperties();
65
66 ApplyRevertGUI();
67 }
68
69 protected override void Apply()
70 {
71 // Make sure that all changes are Saved / Reverted by the user if there is an instance of SpriteLibraryEditorWindow open.
72 SpriteLibraryEditor.SpriteLibraryEditorWindow.HandleUnsavedChangesOnApply();
73 base.Apply();
74
75 for (var i = 0; i < targets.Length; i++)
76 {
77 var path = ((AssetImporter)targets[i]).assetPath;
78 var sourceAsset = (SpriteLibrarySourceAsset)extraDataTargets[i];
79 var savedAsset = SpriteLibrarySourceAssetImporter.LoadSpriteLibrarySourceAsset(path);
80 savedAsset.InitializeWithAsset(sourceAsset);
81
82 // Remove entries that come from Main Library Asset before saving.
83 var savedLibrarySerializedObject = new SerializedObject(savedAsset);
84 SpriteLibraryUtilitiesEditor.UpdateLibraryWithNewMainLibrary(null, savedLibrarySerializedObject.FindProperty(SpriteLibrarySourceAssetPropertyString.library));
85 if (savedLibrarySerializedObject.hasModifiedProperties)
86 savedLibrarySerializedObject.ApplyModifiedPropertiesWithoutUndo();
87
88 // Save asset to disk.
89 SpriteLibrarySourceAssetImporter.SaveSpriteLibrarySourceAsset(savedAsset, path);
90 }
91
92 // Due to case 1418417 we can't guarantee
93 // that changes will be propagated to the SpriteLibraryEditor window.
94 // Until fixed, keep this line to ensure that SpriteLibraryEditor window reloads.
95 SpriteLibraryEditor.SpriteLibraryEditorWindow.TriggerAssetModifiedOnApply();
96 }
97
98 void DoMainAssetGUI()
99 {
100 EditorGUI.BeginChangeCheck();
101 if (m_PrimaryLibraryGUID.hasMultipleDifferentValues)
102 EditorGUI.showMixedValue = true;
103 var currentMainSpriteLibraryAsset = AssetDatabase.LoadAssetAtPath<SpriteLibraryAsset>(AssetDatabase.GUIDToAssetPath(m_PrimaryLibraryGUID.stringValue));
104 var newMainLibraryAsset = EditorGUILayout.ObjectField(Style.mainAssetLabel, currentMainSpriteLibraryAsset, typeof(SpriteLibraryAsset), false) as SpriteLibraryAsset;
105 if (EditorGUI.EndChangeCheck())
106 {
107 var successfulAssignment = true;
108 for (var i = 0; i < targets.Length; ++i)
109 successfulAssignment = AssignNewMainLibrary(targets[i], extraDataTargets[i] as SpriteLibrarySourceAsset, newMainLibraryAsset);
110
111 if (successfulAssignment)
112 m_PrimaryLibraryGUID.stringValue = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(newMainLibraryAsset));
113 }
114
115 EditorGUI.showMixedValue = false;
116 }
117
118 static bool AssignNewMainLibrary(Object target, SpriteLibrarySourceAsset extraTarget, SpriteLibraryAsset newMainLibrary)
119 {
120 var assetPath = ((AssetImporter)target).assetPath;
121 var spriteLibraryAsset = AssetDatabase.LoadAssetAtPath<SpriteLibraryAsset>(assetPath);
122 var parentChain = SpriteLibrarySourceAssetImporter.GetAssetParentChain(newMainLibrary);
123 if (assetPath == AssetDatabase.GetAssetPath(newMainLibrary) || parentChain.Contains(spriteLibraryAsset))
124 {
125 Debug.LogWarning(TextContent.spriteLibraryCircularDependency);
126 return false;
127 }
128
129 var path = ((AssetImporter)target).assetPath;
130 var toSavedAsset = SpriteLibrarySourceAssetImporter.LoadSpriteLibrarySourceAsset(path);
131
132 toSavedAsset.InitializeWithAsset(extraTarget);
133 var savedLibrarySerializedObject = new SerializedObject(toSavedAsset);
134 SpriteLibraryUtilitiesEditor.UpdateLibraryWithNewMainLibrary(newMainLibrary, savedLibrarySerializedObject.FindProperty(SpriteLibrarySourceAssetPropertyString.library));
135 if (savedLibrarySerializedObject.hasModifiedProperties)
136 savedLibrarySerializedObject.ApplyModifiedPropertiesWithoutUndo();
137
138 return true;
139 }
140 }
141
142 internal class CreateSpriteLibrarySourceAsset : ProjectWindowCallback.EndNameEditAction
143 {
144 const int k_SpriteLibraryAssetMenuPriority = 30;
145 string m_MainLibrary;
146
147 public override void Action(int instanceId, string pathName, string resourceFile)
148 {
149 var asset = CreateInstance<SpriteLibrarySourceAsset>();
150 asset.SetPrimaryLibraryGUID(m_MainLibrary);
151
152 UnityEditorInternal.InternalEditorUtility.SaveToSerializedFileAndForget(new Object[] { asset }, pathName, true);
153 AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
154
155 m_MainLibrary = string.Empty;
156
157 ProjectWindowUtil.ShowCreatedAsset(AssetDatabase.LoadAssetAtPath<Object>(pathName));
158 }
159
160 [MenuItem("Assets/Create/2D/Sprite Library Asset", priority = k_SpriteLibraryAssetMenuPriority)]
161 static void CreateSpriteLibrarySourceAssetMenu()
162 {
163 var action = CreateInstance<CreateSpriteLibrarySourceAsset>();
164 var icon = EditorIconUtility.LoadIconResource("Sprite Library", "Icons/Light", "Icons/Dark");
165 ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, action, SpriteLibrarySourceAsset.defaultName + SpriteLibrarySourceAsset.extension, icon, null);
166 }
167
168 [MenuItem("Assets/Create/2D/Sprite Library Asset Variant", priority = k_SpriteLibraryAssetMenuPriority + 1)]
169 static void CreateSpriteLibrarySourceAssetVariantMenu()
170 {
171 var action = CreateInstance<CreateSpriteLibrarySourceAsset>();
172 var asset = SpriteLibrarySourceAssetImporter.GetAssetFromSelection();
173 if (asset != null)
174 action.m_MainLibrary = AssetDatabase.GUIDFromAssetPath(AssetDatabase.GetAssetPath(asset)).ToString();
175 var icon = EditorIconUtility.LoadIconResource("Sprite Library", "Icons/Light", "Icons/Dark");
176 ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, action, SpriteLibrarySourceAsset.defaultName + SpriteLibrarySourceAsset.extension, icon, null);
177 }
178
179 [MenuItem("Assets/Create/2D/Sprite Library Asset Variant", true, priority = k_SpriteLibraryAssetMenuPriority + 1)]
180 static bool ValidateCanCreateVariant()
181 {
182 return SpriteLibrarySourceAssetImporter.GetAssetFromSelection() != null;
183 }
184 }
185}