You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
3.1 KiB
C#

1 year ago
using System;
using System.Globalization;
using UnityEngine.Timeline;
namespace UnityEditor.Timeline
{
/// <summary>
/// The available display modes for time in the Timeline Editor.
/// </summary>
public enum TimeFormat
{
/// <summary>Displays time values as frames.</summary>
Frames,
/// <summary>Displays time values as timecode (SS:FF) format.</summary>
Timecode,
/// <summary>Displays time values as seconds.</summary>
Seconds
};
static class TimeDisplayUnitExtensions
{
public static TimeArea.TimeFormat ToTimeAreaFormat(this TimeFormat timeDisplayUnit)
{
switch (timeDisplayUnit)
{
case TimeFormat.Frames: return TimeArea.TimeFormat.Frame;
case TimeFormat.Timecode: return TimeArea.TimeFormat.TimeFrame;
case TimeFormat.Seconds: return TimeArea.TimeFormat.None;
}
return TimeArea.TimeFormat.Frame;
}
public static string ToTimeString(this TimeFormat timeFormat, double time, double frameRate, string format = "f2")
{
switch (timeFormat)
{
case TimeFormat.Frames: return TimeUtility.TimeAsFrames(time, frameRate, format);
case TimeFormat.Timecode: return TimeUtility.TimeAsTimeCode(time, frameRate, format);
case TimeFormat.Seconds: return time.ToString(format, (IFormatProvider)CultureInfo.InvariantCulture.NumberFormat);
}
return time.ToString(format);
}
public static string ToTimeStringWithDelta(this TimeFormat timeFormat, double time, double frameRate, double delta, string format = "f2")
{
const double epsilon = 1e-7;
var result = ToTimeString(timeFormat, time, frameRate, format);
if (delta > epsilon || delta < -epsilon)
{
var sign = ((delta >= 0) ? "+" : "-");
var deltaStr = ToTimeString(timeFormat, Math.Abs(delta), frameRate, format);
return $"{result} ({sign}{deltaStr})";
}
return result;
}
public static double FromTimeString(this TimeFormat timeFormat, string timeString, double frameRate, double defaultValue)
{
double time = defaultValue;
switch (timeFormat)
{
case TimeFormat.Frames:
if (!double.TryParse(timeString, NumberStyles.Any, CultureInfo.InvariantCulture, out time))
return defaultValue;
time = TimeUtility.FromFrames(time, frameRate);
break;
case TimeFormat.Seconds:
time = TimeUtility.ParseTimeSeconds(timeString, frameRate, defaultValue);
break;
case TimeFormat.Timecode:
time = TimeUtility.ParseTimeCode(timeString, frameRate, defaultValue);
break;
default:
time = defaultValue;
break;
}
return time;
}
}
}