A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3using UnityEngine;
4using UnityEditor;
5using UnityEditor.Timeline;
6using UnityEngine.Serialization;
7using UnityEngine.Timeline;
8using UnityEngine.UIElements;
9#if !UNITY_2020_2_OR_NEWER
10using L10n = UnityEditor.Timeline.L10n;
11#endif
12
13/// <summary>
14/// Store the settings for Timeline that will be stored with the Unity Project.
15/// </summary>
16[FilePath("ProjectSettings/TimelineSettings.asset", FilePathAttribute.Location.ProjectFolder)]
17public class TimelineProjectSettings : ScriptableSingleton<TimelineProjectSettings>
18{
19 /// <summary>
20 /// Define the default framerate when a Timeline asset is created.
21 /// </summary>
22 [HideInInspector, Obsolete("assetDefaultFramerate has been deprecated. Use defaultFrameRate instead.")]
23 public float assetDefaultFramerate = (float)TimelineAsset.EditorSettings.kDefaultFrameRate;
24
25 [SerializeField, FrameRateField, FormerlySerializedAs("assetDefaultFramerate")]
26 private double m_DefaultFrameRate = TimelineAsset.EditorSettings.kDefaultFrameRate;
27 /// <summary>
28 /// Defines the default frame rate when a Timeline asset is created from the project window.
29 /// </summary>
30
31 public double defaultFrameRate
32 {
33#pragma warning disable 0618
34 get
35 {
36 if (m_DefaultFrameRate != assetDefaultFramerate)
37 {
38 return assetDefaultFramerate;
39 }
40 return m_DefaultFrameRate;
41 }
42 set
43 {
44 m_DefaultFrameRate = value;
45 assetDefaultFramerate = (float)value;
46 }
47#pragma warning restore 0618
48 }
49
50 void OnDisable()
51 {
52 Save();
53 }
54
55 /// <summary>
56 /// Save the timeline project settings file in the project directory.
57 /// </summary>
58 public void Save()
59 {
60 Save(true);
61 }
62
63 internal SerializedObject GetSerializedObject()
64 {
65 return new SerializedObject(this);
66 }
67
68 private void OnValidate()
69 {
70#pragma warning disable 0618
71 assetDefaultFramerate = (float)m_DefaultFrameRate;
72#pragma warning restore 0618
73 }
74}
75
76class TimelineProjectSettingsProvider : SettingsProvider
77{
78 SerializedObject m_SerializedObject;
79 SerializedProperty m_Framerate;
80
81 private class Styles
82 {
83 public static readonly GUIContent DefaultFramerateLabel = L10n.TextContent("Default frame rate", "The default frame rate for new Timeline assets.");
84 public static readonly GUIContent TimelineAssetLabel = L10n.TextContent("Timeline Asset", "");
85 public static readonly string WarningString = L10n.Tr("Locking playback cannot be enabled for this frame rate.");
86 }
87
88 public TimelineProjectSettingsProvider(string path, SettingsScope scopes, IEnumerable<string> keywords = null)
89 : base(path, scopes, keywords) { }
90
91 public override void OnActivate(string searchContext, VisualElement rootElement)
92 {
93 TimelineProjectSettings.instance.Save();
94 m_SerializedObject = TimelineProjectSettings.instance.GetSerializedObject();
95 m_Framerate = m_SerializedObject.FindProperty("m_DefaultFrameRate");
96 }
97
98 public override void OnGUI(string searchContext)
99 {
100 using (new SettingsWindow.GUIScope())
101 {
102 m_SerializedObject.Update();
103
104 EditorGUILayout.LabelField(Styles.TimelineAssetLabel, EditorStyles.boldLabel);
105 EditorGUI.BeginChangeCheck();
106 m_Framerate.doubleValue = FrameRateDrawer.FrameRateField(m_Framerate.doubleValue, Styles.DefaultFramerateLabel,
107 EditorGUILayout.GetControlRect(), out bool frameRateIsValid);
108 if (EditorGUI.EndChangeCheck())
109 {
110 m_SerializedObject.ApplyModifiedProperties();
111 TimelineProjectSettings.instance.Save();
112 }
113#if TIMELINE_FRAMEACCURATE
114 if (!frameRateIsValid && TimelinePreferences.instance.playbackLockedToFrame)
115 EditorGUILayout.HelpBox(Styles.WarningString, MessageType.Warning);
116#endif
117 }
118 }
119
120 [SettingsProvider]
121 public static SettingsProvider CreateTimelineProjectSettingProvider()
122 {
123 var provider = new TimelineProjectSettingsProvider("Project/Timeline", SettingsScope.Project, GetSearchKeywordsFromGUIContentProperties<Styles>());
124 return provider;
125 }
126}