Maze / Library /PackageCache /com.unity.timeline@1.6.5 /Editor /Window /ViewModel /ScriptableObjectViewPrefs.cs
| using System; | |
| using System.IO; | |
| using UnityEditorInternal; | |
| using UnityEngine; | |
| using UnityObject = UnityEngine.Object; | |
| namespace UnityEditor.Timeline | |
| { | |
| class ScriptableObjectViewPrefs<TViewModel> : IDisposable where TViewModel : ScriptableObject | |
| { | |
| const string k_DefaultFilePath = "Library/"; | |
| const string k_Extension = ".pref"; | |
| readonly string m_RelativePath; | |
| readonly string m_AbsolutePath; | |
| readonly string m_FileName; | |
| ScriptableObject m_Asset; | |
| TViewModel m_ViewModel; | |
| bool isSavable | |
| { | |
| get | |
| { | |
| return m_Asset != null && | |
| m_ViewModel != null && | |
| !string.IsNullOrEmpty(m_FileName); | |
| } | |
| } | |
| public ScriptableObjectViewPrefs(ScriptableObject asset, string relativeSavePath) | |
| { | |
| m_Asset = asset; | |
| m_RelativePath = string.IsNullOrEmpty(relativeSavePath) ? k_DefaultFilePath : relativeSavePath; | |
| if (!m_RelativePath.EndsWith("/", StringComparison.Ordinal)) | |
| m_RelativePath += "/"; | |
| m_AbsolutePath = Application.dataPath + "/../" + m_RelativePath; | |
| var assetKey = GetAssetKey(asset); | |
| m_FileName = string.IsNullOrEmpty(assetKey) ? string.Empty : assetKey + k_Extension; | |
| } | |
| public TViewModel viewModel | |
| { | |
| get | |
| { | |
| if (m_ViewModel == null) | |
| { | |
| if (m_Asset == null) | |
| m_ViewModel = CreateViewModel(); | |
| else | |
| m_ViewModel = LoadViewModel() ?? CreateViewModel(); | |
| } | |
| return m_ViewModel; | |
| } | |
| } | |
| public void Save() | |
| { | |
| if (!isSavable) | |
| return; | |
| // make sure the path exists or file write will fail | |
| if (!Directory.Exists(m_AbsolutePath)) | |
| Directory.CreateDirectory(m_AbsolutePath); | |
| const bool saveAsText = true; | |
| InternalEditorUtility.SaveToSerializedFileAndForget(new UnityObject[] { m_ViewModel }, m_RelativePath + m_FileName, saveAsText); | |
| } | |
| public void DeleteFile() | |
| { | |
| if (!isSavable) | |
| return; | |
| var path = m_AbsolutePath + m_FileName; | |
| if (!File.Exists(path)) | |
| return; | |
| File.Delete(path); | |
| } | |
| public void Dispose() | |
| { | |
| if (m_ViewModel != null) | |
| UnityObject.DestroyImmediate(m_ViewModel); | |
| m_Asset = null; | |
| } | |
| public static TViewModel CreateViewModel() | |
| { | |
| var model = ScriptableObject.CreateInstance<TViewModel>(); | |
| model.hideFlags |= HideFlags.HideAndDontSave; | |
| return model; | |
| } | |
| TViewModel LoadViewModel() | |
| { | |
| if (string.IsNullOrEmpty(m_FileName)) | |
| return null; | |
| var objects = InternalEditorUtility.LoadSerializedFileAndForget(m_RelativePath + m_FileName); | |
| if (objects.Length <= 0 || objects[0] == null) | |
| return null; | |
| var model = (TViewModel)objects[0]; | |
| model.hideFlags |= HideFlags.HideAndDontSave; | |
| return model; | |
| } | |
| static string GetAssetKey(UnityObject asset) | |
| { | |
| return asset == null ? string.Empty : AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(asset)); | |
| } | |
| } | |
| } | |