120 lines
3.5 KiB
C#
120 lines
3.5 KiB
C#
|
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));
|
||
|
}
|
||
|
}
|
||
|
}
|