You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.5 KiB
119 lines
3.5 KiB
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)); |
|
} |
|
} |
|
}
|
|
|