Skip to content

Commit 49cb61b

Browse files
committed
fix: refactored settings to store on .meta user data
1 parent 4e18a44 commit 49cb61b

File tree

3 files changed

+156
-51
lines changed

3 files changed

+156
-51
lines changed

Scripts/Editor/Core/CollectionSettings.cs

Lines changed: 97 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using System.IO;
33
using UnityEditor;
4+
using UnityEngine;
5+
using UnityEngine.Serialization;
46

57
namespace BrunoMikoski.ScriptableObjectCollections
68
{
@@ -15,9 +17,13 @@ public class CollectionSettings
1517
public bool UseBaseClassForItems;
1618
public bool EnforceIndirectAccess;
1719

18-
private bool writeAddressableLoadingMethods;
19-
public bool WriteAddressableLoadingMethods => !CollectionsRegistry.Instance.GetCollectionByGUID(Guid).AutomaticallyLoaded && writeAddressableLoadingMethods;
20+
public bool WriteAddressableLoadingMethods;
2021

22+
private AssetImporter importer;
23+
24+
public CollectionSettings()
25+
{
26+
}
2127

2228
public CollectionSettings(ScriptableObjectCollection targetCollection)
2329
{
@@ -28,7 +34,7 @@ public CollectionSettings(ScriptableObjectCollection targetCollection)
2834

2935
Namespace = targetNamespace;
3036

31-
if (!string.IsNullOrEmpty(SOCSettings.Instance.generatedScriptsDefaultFilePath))
37+
if (!string.IsNullOrEmpty(SOCSettings.Instance.generatedScriptsDefaultFilePath) && AssetDatabase.IsValidFolder(SOCSettings.Instance.generatedScriptsDefaultFilePath))
3238
{
3339
ParentFolderPath = SOCSettings.Instance.generatedScriptsDefaultFilePath;
3440
}
@@ -38,22 +44,108 @@ public CollectionSettings(ScriptableObjectCollection targetCollection)
3844
string parentFolder = Path.GetDirectoryName(baseClassPath);
3945
ParentFolderPath = parentFolder;
4046
}
41-
47+
4248
bool canBePartial = CodeGenerationUtility.CheckIfCanBePartial(targetCollection, ParentFolderPath);
4349

4450
if (!canBePartial)
4551
StaticFilename = $"{targetCollection.GetType().Name}Static".FirstToUpper();
4652
else
4753
StaticFilename = $"{targetCollection.GetType().Name}".FirstToUpper();
4854

55+
56+
4957
WriteAsPartialClass = canBePartial;
5058
UseBaseClassForItems = false;
5159
EnforceIndirectAccess = false;
5260
}
61+
62+
public bool ShouldWriteAddressableLoadingMethods()
63+
{
64+
if (!CollectionsRegistry.Instance.GetCollectionByGUID(Guid).AutomaticallyLoaded)
65+
return false;
66+
67+
return WriteAddressableLoadingMethods;
68+
}
5369

5470
public void SetWriteAddressableLoadingMethods(bool evtNewValue)
5571
{
56-
writeAddressableLoadingMethods = evtNewValue;
72+
if (WriteAddressableLoadingMethods == evtNewValue)
73+
return;
74+
75+
WriteAddressableLoadingMethods = evtNewValue;
76+
Save();
77+
}
78+
79+
public void SetImporter(AssetImporter targetImporter)
80+
{
81+
importer = targetImporter;
82+
}
83+
84+
public void Save(bool forceSave = false)
85+
{
86+
if (importer == null)
87+
return;
88+
89+
importer.userData = EditorJsonUtility.ToJson(this);
90+
if (forceSave)
91+
{
92+
importer.SaveAndReimport();
93+
}
94+
}
95+
96+
public void SetEnforceIndirectAccess(bool enforceIndirectAccess)
97+
{
98+
if (EnforceIndirectAccess == enforceIndirectAccess)
99+
return;
100+
101+
EnforceIndirectAccess = enforceIndirectAccess;
102+
Save();
103+
}
104+
105+
public void SetStaticFilename(string targetNewName)
106+
{
107+
if (string.Equals(StaticFilename, targetNewName, StringComparison.Ordinal))
108+
return;
109+
110+
StaticFilename = targetNewName;
111+
Save();
112+
113+
}
114+
115+
public void SetNamespace(string targetNamespace)
116+
{
117+
if (string.Equals(Namespace, targetNamespace, StringComparison.Ordinal))
118+
return;
119+
120+
Namespace = targetNamespace;
121+
Save();
122+
}
123+
124+
public void SetWriteAsPartialClass(bool writeAsPartial)
125+
{
126+
if (WriteAsPartialClass == writeAsPartial)
127+
return;
128+
129+
WriteAsPartialClass = writeAsPartial;
130+
Save();
131+
}
132+
133+
public void SetUseBaseClassForItems(bool useBaseClass)
134+
{
135+
if (UseBaseClassForItems == useBaseClass)
136+
return;
137+
138+
UseBaseClassForItems = useBaseClass;
139+
Save();
140+
}
141+
142+
public void SetParentFolderPath(string assetPath)
143+
{
144+
if (string.Equals(ParentFolderPath, assetPath, StringComparison.Ordinal))
145+
return;
146+
147+
ParentFolderPath = assetPath;
148+
Save();
57149
}
58150
}
59151
}

Scripts/Editor/Core/SOCSettings.cs

Lines changed: 29 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@ namespace BrunoMikoski.ScriptableObjectCollections
1212
[Serializable]
1313
public class SOCSettings
1414
{
15-
[SerializeField]
16-
public List<CollectionSettings> collectionSettings = new();
17-
1815
private const string STORAGE_PATH = "ProjectSettings/ScriptableObjectCollection.json";
1916
private const int MINIMUM_NAMESPACE_DEPTH = 1;
2017

@@ -162,7 +159,7 @@ public void SetGeneratedScriptsDefaultFilePath(string assetPath)
162159

163160
public void Save()
164161
{
165-
string json = EditorJsonUtility.ToJson(this, prettyPrint: true);
162+
string json = EditorJsonUtility.ToJson(this);
166163
File.WriteAllText(STORAGE_PATH, json);
167164
}
168165

@@ -195,11 +192,8 @@ public void SetGeneratedScriptsParentFolder(ScriptableObjectCollection collectio
195192
if (evtNewValue != null)
196193
assetPath = AssetDatabase.GetAssetPath(evtNewValue);
197194

198-
199195
CollectionSettings settings = GetOrCreateCollectionSettings(collection);
200-
settings.ParentFolderPath = assetPath;
201-
202-
Save();
196+
settings.SetParentFolderPath(assetPath);
203197
}
204198

205199
public bool GetUseBaseClassForItem(ScriptableObjectCollection collection)
@@ -210,10 +204,8 @@ public bool GetUseBaseClassForItem(ScriptableObjectCollection collection)
210204
public void SetUsingBaseClassForItems(ScriptableObjectCollection collection, bool useBaseClass)
211205
{
212206
CollectionSettings settings = GetOrCreateCollectionSettings(collection);
213-
settings.UseBaseClassForItems = useBaseClass;
214-
Save();
207+
settings.SetUseBaseClassForItems(useBaseClass);
215208
}
216-
217209

218210
public bool GetWriteAsPartialClass(ScriptableObjectCollection collection)
219211
{
@@ -229,11 +221,7 @@ public bool GetWriteAsPartialClass(ScriptableObjectCollection collection)
229221
public void SetWriteAsPartialClass(ScriptableObjectCollection collection, bool writeAsPartial)
230222
{
231223
CollectionSettings settings = GetOrCreateCollectionSettings(collection);
232-
if (settings.WriteAsPartialClass == writeAsPartial)
233-
return;
234-
235-
settings.WriteAsPartialClass = writeAsPartial;
236-
Save();
224+
settings.SetWriteAsPartialClass(writeAsPartial);
237225
}
238226

239227
public string GetNamespaceForCollection(ScriptableObjectCollection collection)
@@ -244,8 +232,7 @@ public string GetNamespaceForCollection(ScriptableObjectCollection collection)
244232
public void SetNamespaceForCollection(ScriptableObjectCollection collection, string targetNamespace)
245233
{
246234
CollectionSettings settings = GetOrCreateCollectionSettings(collection);
247-
settings.Namespace = targetNamespace;
248-
Save();
235+
settings.SetNamespace(targetNamespace);
249236
}
250237

251238
public string GetStaticFilenameForCollection(ScriptableObjectCollection collection)
@@ -256,8 +243,7 @@ public string GetStaticFilenameForCollection(ScriptableObjectCollection collecti
256243
public void SetStaticFilenameForCollection(ScriptableObjectCollection collection, string targetNewName)
257244
{
258245
CollectionSettings settings = GetOrCreateCollectionSettings(collection);
259-
settings.StaticFilename = targetNewName;
260-
Save();
246+
settings.SetStaticFilename(targetNewName);
261247
}
262248

263249
public bool GetEnforceIndirectAccess(ScriptableObjectCollection collection)
@@ -268,52 +254,52 @@ public bool GetEnforceIndirectAccess(ScriptableObjectCollection collection)
268254
public void SetEnforceIndirectAccess(ScriptableObjectCollection collection, bool enforceIndirectAccess)
269255
{
270256
CollectionSettings settings = GetOrCreateCollectionSettings(collection);
271-
settings.EnforceIndirectAccess = enforceIndirectAccess;
272-
Save();
257+
settings.SetEnforceIndirectAccess(enforceIndirectAccess);
273258
}
274259

275260
public CollectionSettings GetOrCreateCollectionSettings(ScriptableObjectCollection collection)
276261
{
277-
CollectionSettings collectionSetting = null;
278-
for (int i = 0; i < collectionSettings.Count; i++)
262+
string path = AssetDatabase.GetAssetPath(collection);
263+
AssetImporter importer = AssetImporter.GetAtPath(path);
264+
265+
string collectionSettingsData = importer.userData;
266+
267+
CollectionSettings collectionSetting;
268+
if (string.IsNullOrEmpty(collectionSettingsData))
279269
{
280-
collectionSetting = collectionSettings[i];
281-
if (collectionSetting.Guid == collection.GUID)
282-
{
283-
return collectionSetting;
284-
}
270+
collectionSetting = new CollectionSettings(collection);
271+
}
272+
else
273+
{
274+
collectionSetting = new CollectionSettings();
275+
EditorJsonUtility.FromJsonOverwrite(importer.userData, collectionSetting);
285276
}
286277

287-
collectionSetting = new CollectionSettings(collection);
288-
collectionSettings.Add(collectionSetting);
289-
Save();
278+
collectionSetting.SetImporter(importer);
290279
return collectionSetting;
291280
}
292281

293282
public void ResetSettings(ScriptableObjectCollection collection)
294283
{
295-
for (int i = 0; i < collectionSettings.Count; i++)
296-
{
297-
CollectionSettings collectionSetting = collectionSettings[i];
298-
if (collectionSetting.Guid != collection.GUID)
299-
continue;
300-
301-
collectionSettings.RemoveAt(i);
302-
Save();
303-
return;
304-
}
284+
CollectionSettings settings = new CollectionSettings(collection);
285+
settings.Save();
305286
}
306287

307288
public void SetWriteAddressableLoadingMethods(ScriptableObjectCollection collection, bool evtNewValue)
308289
{
309290
CollectionSettings settings = GetOrCreateCollectionSettings(collection);
310291
settings.SetWriteAddressableLoadingMethods(evtNewValue);
311-
Save();
312292
}
313293

314294
public bool GetWriteAddressableLoadingMethods(ScriptableObjectCollection collection)
315295
{
316296
return GetOrCreateCollectionSettings(collection).WriteAddressableLoadingMethods;
317297
}
298+
299+
public void SaveCollectionSettings(ScriptableObjectCollection collection, bool forceSave = false)
300+
{
301+
CollectionSettings settings = GetOrCreateCollectionSettings(collection);
302+
settings.Save(forceSave);
303+
}
318304
}
319305
}

Scripts/Editor/CustomEditors/CollectionCustomEditor.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public class CollectionCustomEditor : Editor
5151

5252
private HelpBox helpbox;
5353
private Toggle writeAddressablesToggle;
54+
private Button generateStaticFileButton;
5455

5556
protected virtual bool CanBeReorderable
5657
{
@@ -156,9 +157,10 @@ public override VisualElement CreateInspectorGUI()
156157
synchronizeAssetsButton.clickable.activators.Clear();
157158
synchronizeAssetsButton.RegisterCallback<MouseUpEvent>(OnClickToSynchronizeAssets);
158159

159-
Button generateStaticFileButton = root.Q<Button>("generate-static-file-button");
160+
generateStaticFileButton = root.Q<Button>("generate-static-file-button");
160161
generateStaticFileButton.clickable.activators.Clear();
161162
generateStaticFileButton.RegisterCallback<MouseUpEvent>(OnClickGenerateStaticFile);
163+
UpdateGenerateStaticFileButtonState();
162164

163165

164166
Button generateItemsButton = root.Q<Button>("generate-auto-items");
@@ -189,6 +191,7 @@ public override VisualElement CreateInspectorGUI()
189191
{
190192
SOCSettings.Instance.SetGeneratedScriptsParentFolder(collection, evt.newValue);
191193
writeAsPartialClass.SetEnabled(CodeGenerationUtility.CheckIfCanBePartial(collection));
194+
UpdateGenerateStaticFileButtonState();
192195
});
193196

194197

@@ -236,8 +239,8 @@ public override VisualElement CreateInspectorGUI()
236239
advancedOptionsVisualElement.Add(helpbox);
237240

238241
writeAddressablesToggle = root.Q<Toggle>("write-addressables-load-toggle");
239-
writeAddressablesToggle.style.display = IsAddressableAsset(collection) && !automaticLoadToggle.value ? DisplayStyle.Flex : DisplayStyle.None;
240242
writeAddressablesToggle.SetValueWithoutNotify(SOCSettings.Instance.GetWriteAddressableLoadingMethods(collection));
243+
writeAddressablesToggle.style.display = DisplayStyle.None;
241244
writeAddressablesToggle.RegisterValueChangedCallback(evt =>
242245
{
243246
SOCSettings.Instance.SetWriteAddressableLoadingMethods(collection, evt.newValue);
@@ -253,7 +256,8 @@ public override VisualElement CreateInspectorGUI()
253256
ToolbarSearchField toolbarSearchField = root.Q<ToolbarSearchField>();
254257
toolbarSearchField.RegisterValueChangedCallback(OnSearchInputChanged);
255258

256-
UpdateHelpBox();
259+
260+
root.schedule.Execute(OnVisualTreeCreated).ExecuteLater(100);
257261

258262
return root;
259263
}
@@ -394,6 +398,11 @@ private void OnEnable()
394398
}
395399
}
396400

401+
private void OnDisable()
402+
{
403+
SOCSettings.Instance.SaveCollectionSettings(collection, true);
404+
}
405+
397406
private void OnNamespaceTextFieldChanged(ChangeEvent<string> evt)
398407
{
399408
string validCharsOnly = Regex.Replace(evt.newValue, @"[^A-Za-z0-9_\.]+", "_");
@@ -439,6 +448,24 @@ private void OnClickRemoveSelectedItems(MouseUpEvent evt)
439448
ReloadFilteredItems();
440449
}
441450

451+
private void OnVisualTreeCreated()
452+
{
453+
UpdateHelpBox();
454+
UpdateGenerateStaticFileButtonState();
455+
UpdateWriteAddressablesMethodsState();
456+
}
457+
458+
private void UpdateWriteAddressablesMethodsState()
459+
{
460+
writeAddressablesToggle.style.display = IsAddressableAsset(collection) && !collection.AutomaticallyLoaded ? DisplayStyle.Flex : DisplayStyle.None;
461+
}
462+
463+
private void UpdateGenerateStaticFileButtonState()
464+
{
465+
generateStaticFileButton.SetEnabled(
466+
AssetDatabase.IsValidFolder(SOCSettings.Instance.GetParentFolderPathForCollection(collection)));
467+
}
468+
442469
private void OnClickAddNewItem(MouseDownEvent evt)
443470
{
444471
List<Type> itemsSubclasses = new() { collection.GetItemType() };

0 commit comments

Comments
 (0)