using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.Timeline;
using UnityEngine.UIElements;
///
/// Store the settings for Timeline that will be stored with the Unity Project.
///
[FilePath("ProjectSettings/TimelineSettings.asset", FilePathAttribute.Location.ProjectFolder)]
public class TimelineProjectSettings : ScriptableSingleton
{
///
/// Define the default framerate when a Timeline asset is created.
///
[SerializeField]
public float assetDefaultFramerate = TimelineAsset.EditorSettings.kDefaultFps;
internal static string[] framerateLabels = new string[]
{
"Film (24)",
"PAL (25)",
"NTSC (29.97)",
"Film (30)",
"Film (50)",
"Film (60)",
"Custom"
};
internal static float[] framerateValues = new float[]
{
24.0f,
25.0f,
29.97f,
30.0f,
50.0f,
60.0f
};
void OnDisable()
{
Save();
}
///
/// Save the timeline project settings file in the project directory.
///
public void Save()
{
Save(true);
}
internal SerializedObject GetSerializedObject()
{
return new SerializedObject(this);
}
}
class TimelineProjectSettingsProvider : SettingsProvider
{
SerializedObject m_SerializedObject;
SerializedProperty m_Framerate;
bool m_customFramerate;
private class Styles
{
public static readonly GUIContent DefaultFramerateLabel = EditorGUIUtility.TrTextContent("Default Framerate", "Framerate value used for new Timeline Assets.");
public static readonly GUIContent CustomFramerateLabel = EditorGUIUtility.TrTextContent("Custom Framerate", "Custom framerate value used for new Timeline Assets.");
public static readonly GUIContent TimelineAssetLabel = EditorGUIUtility.TrTextContent("Timeline Asset", "");
}
public TimelineProjectSettingsProvider(string path, SettingsScope scopes, IEnumerable keywords = null)
: base(path, scopes, keywords) {}
public override void OnActivate(string searchContext, VisualElement rootElement)
{
TimelineProjectSettings.instance.Save();
m_SerializedObject = TimelineProjectSettings.instance.GetSerializedObject();
m_Framerate = m_SerializedObject.FindProperty("assetDefaultFramerate");
}
public override void OnGUI(string searchContext)
{
using (new SettingsWindow.GUIScope())
{
m_SerializedObject.Update();
EditorGUI.BeginChangeCheck();
EditorGUILayout.LabelField(Styles.TimelineAssetLabel , EditorStyles.boldLabel);
int framerateIdx = Array.IndexOf(TimelineProjectSettings.framerateValues, m_Framerate.floatValue);
if (m_customFramerate || framerateIdx == -1)
{
framerateIdx = TimelineProjectSettings.framerateValues.Length;
}
framerateIdx = EditorGUILayout.Popup(Styles.DefaultFramerateLabel, framerateIdx, TimelineProjectSettings.framerateLabels);
if (framerateIdx == TimelineProjectSettings.framerateValues.Length || framerateIdx == -1)
{
m_customFramerate = true;
float newFramerate = EditorGUILayout.FloatField(Styles.CustomFramerateLabel, m_Framerate.floatValue);
m_Framerate.floatValue = TimelineAsset.GetValidFramerate(newFramerate);
}
else
{
m_customFramerate = false;
m_Framerate.floatValue = TimelineProjectSettings.framerateValues[framerateIdx];
}
if (EditorGUI.EndChangeCheck())
{
m_SerializedObject.ApplyModifiedProperties();
TimelineProjectSettings.instance.Save();
}
}
}
[SettingsProvider]
public static SettingsProvider CreateTimelineProjectSettingProvider()
{
var provider = new TimelineProjectSettingsProvider("Project/Timeline", SettingsScope.Project, GetSearchKeywordsFromGUIContentProperties());
return provider;
}
}