From c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78 Mon Sep 17 00:00:00 2001 From: Andrew Lee Date: Sun, 19 Apr 2020 17:19:32 -0400 Subject: Inital commit --- .../Window/ViewModel/ScriptableObjectViewPrefs.cs | 119 +++++++++++++++ .../ViewModel/ScriptableObjectViewPrefs.cs.meta | 11 ++ .../Window/ViewModel/TimelineAssetViewModel.cs | 116 ++++++++++++++ .../ViewModel/TimelineAssetViewModel.cs.meta | 11 ++ .../Window/ViewModel/TimelineWindowViewPrefs.cs | 170 +++++++++++++++++++++ .../ViewModel/TimelineWindowViewPrefs.cs.meta | 11 ++ 6 files changed, 438 insertions(+) create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/ScriptableObjectViewPrefs.cs create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/ScriptableObjectViewPrefs.cs.meta create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineAssetViewModel.cs create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineAssetViewModel.cs.meta create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineWindowViewPrefs.cs create mode 100644 Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineWindowViewPrefs.cs.meta (limited to 'Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel') diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/ScriptableObjectViewPrefs.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/ScriptableObjectViewPrefs.cs new file mode 100644 index 0000000..66b5cb8 --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/ScriptableObjectViewPrefs.cs @@ -0,0 +1,119 @@ +using System; +using System.IO; +using UnityEditorInternal; +using UnityEngine; +using UnityObject = UnityEngine.Object; + +namespace UnityEditor.Timeline +{ + class ScriptableObjectViewPrefs : 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(); + 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)); + } + } +} diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/ScriptableObjectViewPrefs.cs.meta b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/ScriptableObjectViewPrefs.cs.meta new file mode 100644 index 0000000..7201def --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/ScriptableObjectViewPrefs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 80ae83fdf1fb2c649bccb8c293b94556 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineAssetViewModel.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineAssetViewModel.cs new file mode 100644 index 0000000..9ae8c5a --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineAssetViewModel.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using UnityEditor.IMGUI.Controls; +using UnityEngine; +using UnityEngine.Timeline; +using UnityObject = UnityEngine.Object; + +namespace UnityEditor.Timeline +{ + [Serializable] + class TrackViewModelData : ISerializationCallbackReceiver + { + public static readonly float DefaultinlineAnimationCurveHeight = 100.0f; + + public bool collapsed = true; + public bool showMarkers = true; + + public bool showInlineCurves = false; + public float inlineAnimationCurveHeight = DefaultinlineAnimationCurveHeight; + public int lastInlineCurveDataID = -1; + public TreeViewState inlineCurvesState = null; + public Rect inlineCurvesShownAreaInsideMargins = new Rect(1, 1, 1, 1); + + public Dictionary markerTimeStamps = new Dictionary(); + [SerializeField] List m_MarkerTimeStampsKeys; + [SerializeField] List m_MarkerTimeStampsValues; + + public void OnBeforeSerialize() + { + if (markerTimeStamps == null) + return; + + m_MarkerTimeStampsKeys = new List(markerTimeStamps.Count); + m_MarkerTimeStampsValues = new List(markerTimeStamps.Count); + + foreach (var kvp in markerTimeStamps) + { + m_MarkerTimeStampsKeys.Add(kvp.Key); + m_MarkerTimeStampsValues.Add(kvp.Value); + } + } + + public void OnAfterDeserialize() + { + markerTimeStamps = new Dictionary(); + + if (m_MarkerTimeStampsKeys == null || m_MarkerTimeStampsValues == null || + m_MarkerTimeStampsKeys.Count != m_MarkerTimeStampsValues.Count) + return; + + for (int i = 0; i < m_MarkerTimeStampsKeys.Count; ++i) + markerTimeStamps.Add(m_MarkerTimeStampsKeys[i], m_MarkerTimeStampsValues[i]); + } + } + + [Serializable] + class TimelineAssetViewModel : ScriptableObject, ISerializationCallbackReceiver + { + public const float DefaultTrackScale = 1.0f; + public const float DefaultVerticalScroll = 0; + + public static readonly Vector2 TimeAreaDefaultRange = new Vector2(-WindowConstants.timeAreaShownRangePadding, 5.0f); // in seconds. Hack: using negative value to force the UI to have a left margin at 0. + public static readonly Vector2 NoPlayRangeSet = new Vector2(float.MaxValue, float.MaxValue); + + public bool timeInFrames = true; + public Vector2 timeAreaShownRange = TimeAreaDefaultRange; + public bool showAudioWaveform = true; + public float trackScale = DefaultTrackScale; + public bool playRangeEnabled; + public Vector2 timeAreaPlayRange = NoPlayRangeSet; + public double windowTime; + public float verticalScroll = DefaultVerticalScroll; + public bool showMarkerHeader; + + public Dictionary tracksViewModelData = new Dictionary(); + + // Used only for serialization of the dictionary + [SerializeField] List m_Keys = new List(); + [SerializeField] List m_Vals = new List(); + + public void OnBeforeSerialize() + { + m_Keys.Clear(); + m_Vals.Clear(); + foreach (var data in tracksViewModelData) + { + // Assets that don't save, will create nulls when deserializeds + if (data.Key != null && data.Value != null && (data.Key.hideFlags & HideFlags.DontSave) == 0) + { + m_Keys.Add(data.Key); + m_Vals.Add(data.Value); + } + } + } + + public void OnAfterDeserialize() + { + } + + public void OnEnable() + { + if (m_Keys.Count == m_Vals.Count) + { + tracksViewModelData.Clear(); + for (int i = 0; i < m_Keys.Count; i++) + { + if (m_Keys[i] != null) // if the asset is overwritten the tracks can be null + tracksViewModelData[m_Keys[i]] = m_Vals[i]; + } + } + + m_Keys.Clear(); + m_Vals.Clear(); + } + } +} diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineAssetViewModel.cs.meta b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineAssetViewModel.cs.meta new file mode 100644 index 0000000..7a8e170 --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineAssetViewModel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d79cb9ecc0d4a6d428ab98a681a33897 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineWindowViewPrefs.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineWindowViewPrefs.cs new file mode 100644 index 0000000..c1672c1 --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineWindowViewPrefs.cs @@ -0,0 +1,170 @@ +using UnityEngine; +using UnityEngine.Timeline; +using UnityObject = UnityEngine.Object; +using ViewModelsMap = System.Collections.Generic.Dictionary>; +using ViewModelsList = System.Collections.Generic.List>; + +namespace UnityEditor.Timeline +{ + static class TimelineWindowViewPrefs + { + public const string FilePath = "Library/Timeline"; + + static readonly ViewModelsMap k_ViewModelsMap = new ViewModelsMap(); + static readonly ViewModelsList k_UnassociatedViewModels = new ViewModelsList(); + + public static int viewModelCount + { + get { return k_ViewModelsMap.Count + k_UnassociatedViewModels.Count; } + } + + public static TimelineAssetViewModel GetOrCreateViewModel(TimelineAsset asset) + { + if (asset == null) + return CreateUnassociatedViewModel(); + + ScriptableObjectViewPrefs vm; + if (k_ViewModelsMap.TryGetValue(asset, out vm)) + return vm.viewModel; + + return CreateViewModel(asset).viewModel; + } + + public static TimelineAssetViewModel CreateUnassociatedViewModel() + { + var vm = new ScriptableObjectViewPrefs(null, FilePath); + k_UnassociatedViewModels.Add(vm); + return vm.viewModel; + } + + static ScriptableObjectViewPrefs CreateViewModel(TimelineAsset asset) + { + var vm = new ScriptableObjectViewPrefs(asset, FilePath); + k_ViewModelsMap.Add(asset, vm); + return vm; + } + + public static void SaveViewModel(TimelineAsset asset) + { + if (asset == null) + return; + + ScriptableObjectViewPrefs vm; + if (!k_ViewModelsMap.TryGetValue(asset, out vm)) + vm = CreateViewModel(asset); + + vm.Save(); + } + + public static void SaveAll() + { + foreach (var kvp in k_ViewModelsMap) + kvp.Value.Save(); + } + + public static void UnloadViewModel(TimelineAsset asset) + { + ScriptableObjectViewPrefs vm; + if (k_ViewModelsMap.TryGetValue(asset, out vm)) + { + vm.Dispose(); + k_ViewModelsMap.Remove(asset); + } + } + + public static void UnloadAllViewModels() + { + foreach (var kvp in k_ViewModelsMap) + kvp.Value.Dispose(); + + foreach (var vm in k_UnassociatedViewModels) + vm.Dispose(); + + k_ViewModelsMap.Clear(); + k_UnassociatedViewModels.Clear(); + } + + public static TrackViewModelData GetTrackViewModelData(TrackAsset track) + { + if (track == null) + return new TrackViewModelData(); + + if (track.timelineAsset == null) + return new TrackViewModelData(); + + var prefs = GetOrCreateViewModel(track.timelineAsset); + + TrackViewModelData trackData; + if (prefs.tracksViewModelData.TryGetValue(track, out trackData)) + { + return trackData; + } + + trackData = new TrackViewModelData(); + prefs.tracksViewModelData[track] = trackData; + return trackData; + } + + public static bool IsTrackCollapsed(TrackAsset track) + { + if (track == null) + return true; + + return GetTrackViewModelData(track).collapsed; + } + + public static void SetTrackCollapsed(TrackAsset track, bool collapsed) + { + if (track == null) + return; + + GetTrackViewModelData(track).collapsed = collapsed; + } + + public static bool IsShowMarkers(TrackAsset track) + { + if (track == null) + return true; + + return GetTrackViewModelData(track).showMarkers; + } + + public static void SetTrackShowMarkers(TrackAsset track, bool collapsed) + { + if (track == null) + return; + + GetTrackViewModelData(track).showMarkers = collapsed; + } + + public static bool GetShowInlineCurves(TrackAsset track) + { + if (track == null) + return false; + + return GetTrackViewModelData(track).showInlineCurves; + } + + public static void SetShowInlineCurves(TrackAsset track, bool inlineOn) + { + if (track == null) + return; + + GetTrackViewModelData(track).showInlineCurves = inlineOn; + } + + public static float GetInlineCurveHeight(TrackAsset asset) + { + if (asset == null) + return TrackViewModelData.DefaultinlineAnimationCurveHeight; + + return GetTrackViewModelData(asset).inlineAnimationCurveHeight; + } + + public static void SetInlineCurveHeight(TrackAsset asset, float height) + { + if (asset != null) + GetTrackViewModelData(asset).inlineAnimationCurveHeight = height; + } + } +} diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineWindowViewPrefs.cs.meta b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineWindowViewPrefs.cs.meta new file mode 100644 index 0000000..9501d6d --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Window/ViewModel/TimelineWindowViewPrefs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 105515c1653548242b4fe973c0f375f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: -- cgit v1.2.3